using ErsatzTV.Application.Artists; using ErsatzTV.Core.Api; using ErsatzTV.Core.Api.Artists; using ErsatzTV.Core.Domain; using ErsatzTV.Extensions; using MediatR; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace ErsatzTV.Controllers.Api; [ApiController] public class ArtistsController(IMediator mediator) : ControllerBase { [HttpGet("/api/artists/{id:int}", Name = "GetArtistById")] [Tags("Artists")] [EndpointSummary("Get an artist by id")] [EndpointGroupName("general")] [ProducesResponseType(typeof(ArtistDetailResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] public async Task GetById(int id, CancellationToken cancellationToken) { Option result = await mediator.Send(new GetArtistById(id), cancellationToken); return result.Map(vm => Project(id, vm)).ToGetResult(); } private static ArtistDetailResponseModel Project(int id, ArtistViewModel vm) => new( id, vm.Name, string.IsNullOrWhiteSpace(vm.Disambiguation) ? null : vm.Disambiguation, string.IsNullOrWhiteSpace(vm.Biography) ? null : vm.Biography, ApiArtwork.Root(vm.Thumbnail, ArtworkKind.Thumbnail), ApiArtwork.Root(vm.FanArt, ArtworkKind.FanArt), vm.Genres, vm.Styles, vm.Moods, vm.Languages.Map(c => c.EnglishName).ToList()); }