using API.Controllers.DTOs; using API.MangaConnectors; using API.Schema.MangaContext; 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 /// exert of . Use for more information /// 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(Tranga.MangaConnectors.FirstOrDefault(c => c.Name.Equals(MangaConnectorName, StringComparison.InvariantCultureIgnoreCase)) 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, HttpContext.RequestAborted)) retMangas.Add(add); } return Ok(retMangas.Select(m => new MinimalManga(m.Key, m.Name, m.Description, m.ReleaseStatus, m.MangaConnectorIds))); } /// /// Returns from the associated with /// /// /// exert of . Use for more information /// 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(Tranga.MangaConnectors.FirstOrDefault(c => c.Name.Equals("Global", StringComparison.InvariantCultureIgnoreCase)) 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, HttpContext.RequestAborted) == false) return StatusCode(Status500InternalServerError); return Ok(new MinimalManga(add.Key, add.Name, add.Description, add.ReleaseStatus, add.MangaConnectorIds)); } }