using API.Schema.MangaContext; using API.Schema.MangaContext.MangaConnectors; using Asp.Versioning; using Microsoft.AspNetCore.Mvc; using static Microsoft.AspNetCore.Http.StatusCodes; // ReSharper disable InconsistentNaming namespace API.Controllers; [ApiVersion(2)] [ApiController] [Route("v{v:apiVersion}/[controller]")] public class SearchController(MangaContext context) : Controller { /// /// Initiate a search for a on with searchTerm /// /// .Name /// searchTerm /// /// with Name not found /// with Name is disabled [HttpGet("{MangaConnectorName}/{Query}")] [ProducesResponseType(Status200OK, "application/json")] [ProducesResponseType(Status404NotFound)] [ProducesResponseType(Status406NotAcceptable)] public IActionResult SearchManga(string MangaConnectorName, string Query) { if(context.MangaConnectors.Find(MangaConnectorName) is not { } connector) return NotFound(); if (connector.Enabled is false) return StatusCode(Status412PreconditionFailed); (Manga, MangaConnectorId)[] mangas = connector.SearchManga(Query); List retMangas = new(); foreach ((Manga manga, MangaConnectorId mcId) manga in mangas) { if(Tranga.AddMangaToContext(manga, context, out Manga? add)) retMangas.Add(add); } return Ok(retMangas.ToArray()); } /// /// Returns from the associated with /// /// /// /// Multiple found for URL /// not found /// Error during Database Operation [HttpPost("Url")] [ProducesResponseType(Status200OK, "application/json")] [ProducesResponseType(Status404NotFound)] [ProducesResponseType(Status500InternalServerError)] public IActionResult GetMangaFromUrl([FromBody]string url) { if (context.MangaConnectors.Find("Global") is not { } connector) return StatusCode(Status500InternalServerError, "Could not find Global Connector."); if(connector.GetMangaFromUrl(url) is not { } manga) return NotFound(); if(Tranga.AddMangaToContext(manga, context, out Manga? add) == false) return StatusCode(Status500InternalServerError); return Ok(add); } }