using System.ComponentModel.DataAnnotations; using ErsatzTV.Application.ChannelTemplates; using ErsatzTV.Controllers.Api.Requests; using ErsatzTV.Core; using ErsatzTV.Core.Api.ChannelTemplates; using ErsatzTV.Extensions; using MediatR; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace ErsatzTV.Controllers.Api; [ApiController] public class ChannelTemplateController(IMediator mediator) : ControllerBase { [HttpGet("/api/v1/channel-templates", Name = "GetChannelTemplates")] [Tags("Channel Templates")] [EndpointSummary("Get all channel templates")] [EndpointGroupName("general")] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] public async Task> GetAll(CancellationToken cancellationToken) => await mediator.Send(new GetAllChannelTemplates(), cancellationToken); [HttpGet("/api/v1/channel-templates/default", Name = "GetDefaultChannelTemplate")] [Tags("Channel Templates")] [EndpointSummary("Get the default channel template")] [EndpointGroupName("general")] [ProducesResponseType(typeof(ChannelTemplateResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] public async Task GetDefault(CancellationToken cancellationToken) { Option result = await mediator.Send(new GetDefaultChannelTemplate(), cancellationToken); return result.ToGetResult(); } [HttpPut("/api/v1/channel-templates/default/{id:int}", Name = "SetDefaultChannelTemplate")] [Tags("Channel Templates")] [EndpointSummary("Set the default channel template")] [EndpointGroupName("general")] [ProducesResponseType(typeof(ChannelTemplateResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status422UnprocessableEntity)] public async Task SetDefault(int id, CancellationToken cancellationToken) { Either result = await mediator.Send(new SetDefaultChannelTemplate(id), cancellationToken); return result.ToUpdatedResult(); } [HttpGet("/api/v1/channel-templates/{id:int}", Name = "GetChannelTemplateById")] [Tags("Channel Templates")] [EndpointSummary("Get a channel template by id")] [EndpointGroupName("general")] [ProducesResponseType(typeof(ChannelTemplateResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] public async Task GetById(int id, CancellationToken cancellationToken) { Option result = await mediator.Send(new GetChannelTemplateById(id), cancellationToken); return result.ToGetResult(); } [HttpPost("/api/v1/channel-templates", Name = "CreateChannelTemplate")] [Tags("Channel Templates")] [EndpointSummary("Create a channel template")] [EndpointGroupName("general")] [ProducesResponseType(typeof(ChannelTemplateResponseModel), StatusCodes.Status201Created)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status422UnprocessableEntity)] public async Task Create( [Required][FromBody] CreateChannelTemplateRequest request, CancellationToken cancellationToken) { Either result = await mediator.Send(request.ToCommand(), cancellationToken); return result.ToCreatedResult(vm => $"/api/v1/channel-templates/{vm.Id}", vm => vm); } [HttpPut("/api/v1/channel-templates/{id:int}", Name = "UpdateChannelTemplate")] [Tags("Channel Templates")] [EndpointSummary("Update a channel template")] [EndpointGroupName("general")] [ProducesResponseType(typeof(ChannelTemplateResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status422UnprocessableEntity)] public async Task Update( int id, [Required][FromBody] UpdateChannelTemplateRequest request, CancellationToken cancellationToken) { Either result = await mediator.Send(request.ToCommand(id), cancellationToken); return result.ToUpdatedResult(); } [HttpDelete("/api/v1/channel-templates/{id:int}", Name = "DeleteChannelTemplate")] [Tags("Channel Templates")] [EndpointSummary("Delete a channel template")] [EndpointGroupName("general")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status422UnprocessableEntity)] public async Task Delete(int id, CancellationToken cancellationToken) { Either result = await mediator.Send(new DeleteChannelTemplate(id), cancellationToken); return result.ToDeletedResult(); } }