using API.Controllers.Requests; using API.Schema.LibraryContext; using API.Schema.LibraryContext.LibraryConnectors; using Asp.Versioning; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using static Microsoft.AspNetCore.Http.StatusCodes; using LibraryConnector = API.Controllers.DTOs.LibraryConnector; // ReSharper disable InconsistentNaming namespace API.Controllers; [ApiVersion(2)] [ApiController] [Route("v{v:apiVersion}/[controller]")] public class LibraryConnectorController(LibraryContext context) : Controller { /// /// Gets all configured /// /// /// Error during Database Operation [HttpGet] [ProducesResponseType>(Status200OK, "application/json")] public async Task>, InternalServerError>> GetAllConnectors () { if (await context.LibraryConnectors.ToListAsync(HttpContext.RequestAborted) is not { } connectors) return TypedResults.InternalServerError(); List libraryConnectors = connectors.Select(c => new LibraryConnector(c.Key, c.BaseUrl, c.LibraryType)).ToList(); return TypedResults.Ok(libraryConnectors); } /// /// Returns with /// /// .Key /// /// with not found. [HttpGet("{LibraryConnectorId}")] [ProducesResponseType(Status200OK, "application/json")] [ProducesResponseType(Status404NotFound, "text/plain")] public async Task, NotFound>> GetConnector (string LibraryConnectorId) { if (await context.LibraryConnectors.FirstOrDefaultAsync(l => l.Key == LibraryConnectorId) is not { } connector) return TypedResults.NotFound(nameof(LibraryConnectorId)); return TypedResults.Ok(new LibraryConnector(connector.Key, connector.BaseUrl, connector.LibraryType)); } /// /// Creates a new /// /// /// /// Error during Database Operation [HttpPut] [ProducesResponseType(Status201Created, "text/plain")] [ProducesResponseType(Status500InternalServerError, "text/plain")] public async Task, InternalServerError>> CreateConnector ([FromBody]CreateLibraryConnectorRecord requestData) { //TODO verify data API.Schema.LibraryContext.LibraryConnectors.LibraryConnector connector = requestData.LibraryType switch { LibraryType.Kavita => new Kavita(requestData.Url, requestData.Username, requestData.Password), LibraryType.Komga => new Komga(requestData.Url, requestData.Username, requestData.Password), _ => throw new NotImplementedException() }; context.LibraryConnectors.Add(connector); if(await context.Sync(HttpContext.RequestAborted) is { success: false } result) return TypedResults.InternalServerError(result.exceptionMessage); return TypedResults.Created(string.Empty, connector.Key); } /// /// Deletes with /// /// ToFileLibrary-Connector-ID /// /// with not found. /// Error during Database Operation [HttpDelete("{LibraryConnectorId}")] [ProducesResponseType(Status200OK)] [ProducesResponseType(Status404NotFound, "text/plain")] [ProducesResponseType(Status500InternalServerError, "text/plain")] public async Task, InternalServerError>> DeleteConnector (string LibraryConnectorId) { if (await context.LibraryConnectors.FirstOrDefaultAsync(l => l.Key == LibraryConnectorId) is not { } connector) return TypedResults.NotFound(nameof(LibraryConnectorId)); context.LibraryConnectors.Remove(connector); if(await context.Sync(HttpContext.RequestAborted) is { success: false } result) return TypedResults.InternalServerError(result.exceptionMessage); return TypedResults.Ok(); } }