using ErsatzTV.Application.Television; using ErsatzTV.Core.Api; using ErsatzTV.Core.Api.Media; using ErsatzTV.Core.Api.Television; using ErsatzTV.Core.Domain; using ErsatzTV.Extensions; using MediatR; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace ErsatzTV.Controllers.Api; [ApiController] public class ShowsController(IMediator mediator) : ControllerBase { [HttpGet("/api/v1/shows/{id:int}", Name = "GetShowById")] [Tags("Television")] [EndpointSummary("Get a television show by id")] [EndpointGroupName("general")] [ProducesResponseType(typeof(ShowDetailResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] public async Task GetById(int id, CancellationToken cancellationToken) { Option result = await mediator.Send(new GetTelevisionShowById(id), cancellationToken); return result.Map(Project).ToGetResult(); } private static ShowDetailResponseModel Project(TelevisionShowViewModel vm) => new( vm.Id, vm.LibraryId, vm.MediaSourceKind, vm.Title, string.IsNullOrWhiteSpace(vm.Year) ? null : vm.Year, string.IsNullOrWhiteSpace(vm.Plot) ? null : vm.Plot, ApiArtwork.Root(vm.Poster, ArtworkKind.Poster), ApiArtwork.Root(vm.FanArt, ArtworkKind.FanArt), vm.Genres, vm.Tags, vm.Studios, vm.Networks, vm.ContentRatings, vm.Languages.Map(c => c.EnglishName).ToList(), vm.Actors.Map(a => new ActorResponseModel(a.Id, a.Name, a.Role, ApiArtwork.Root(a.Thumb, ArtworkKind.Thumbnail))).ToList()); }