using ErsatzTV.Application.Libraries; using ErsatzTV.Core.Api.Libraries; using ErsatzTV.Core.Interfaces.Repositories; using MediatR; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace ErsatzTV.Controllers.Api; [ApiController] [EndpointGroupName("general")] public class LibrariesController(ITelevisionRepository televisionRepository, IMediator mediator) : ControllerBase { [HttpGet("/api/libraries/scan-status", Name = "GetLibraryScanStatus")] [Tags("Libraries")] [EndpointSummary("Get active library scan status")] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] public async Task> GetScanStatus(CancellationToken cancellationToken) => await mediator.Send(new GetLibraryScanStatus(), cancellationToken); [HttpPost("/api/libraries/{id:int}/scan")] [Tags("Libraries")] [EndpointSummary("Scan library")] public async Task ScanLibrary(int id) => await mediator.Send(new QueueLibraryScanByLibraryId(id)) ? new OkResult() : new NotFoundResult(); [HttpPost("/api/libraries/{id:int}/scan-show")] [Tags("Libraries")] [EndpointSummary("Scan show")] public async Task ScanShow(int id, [FromBody] ScanShowRequest request) { if (string.IsNullOrWhiteSpace(request.ShowTitle)) { return new BadRequestObjectResult(new { error = "ShowTitle is required" }); } string trimmedTitle = request.ShowTitle.Trim(); Option maybeShowId = await televisionRepository.GetShowIdByTitle(id, trimmedTitle); foreach (int showId in maybeShowId) { bool result = await mediator.Send(new QueueShowScanByLibraryId(id, showId, trimmedTitle, request.DeepScan)); return result ? new OkResult() : new BadRequestObjectResult(new { error = "Unable to queue show scan. Library may not exist, may not support single show scanning, or may already be scanning." }); } return new BadRequestObjectResult( new { error = $"Unable to locate show with title {request.ShowTitle} in library {id}" }); } } public record ScanShowRequest(string ShowTitle, bool DeepScan = false);