110 lines
5.2 KiB
C#
110 lines
5.2 KiB
C#
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/channel-templates", Name = "GetChannelTemplates")]
|
|
[Tags("Channel Templates")]
|
|
[EndpointSummary("Get all channel templates")]
|
|
[EndpointGroupName("general")]
|
|
[ProducesResponseType(typeof(List<ChannelTemplateResponseModel>), StatusCodes.Status200OK)]
|
|
public async Task<List<ChannelTemplateResponseModel>> GetAll(CancellationToken cancellationToken) =>
|
|
await mediator.Send(new GetAllChannelTemplates(), cancellationToken);
|
|
|
|
[HttpGet("/api/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<IActionResult> GetDefault(CancellationToken cancellationToken)
|
|
{
|
|
Option<ChannelTemplateResponseModel> result =
|
|
await mediator.Send(new GetDefaultChannelTemplate(), cancellationToken);
|
|
return result.ToGetResult();
|
|
}
|
|
|
|
[HttpPut("/api/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<IActionResult> SetDefault(int id, CancellationToken cancellationToken)
|
|
{
|
|
Either<BaseError, ChannelTemplateResponseModel> result =
|
|
await mediator.Send(new SetDefaultChannelTemplate(id), cancellationToken);
|
|
return result.ToUpdatedResult();
|
|
}
|
|
|
|
[HttpGet("/api/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<IActionResult> GetById(int id, CancellationToken cancellationToken)
|
|
{
|
|
Option<ChannelTemplateResponseModel> result =
|
|
await mediator.Send(new GetChannelTemplateById(id), cancellationToken);
|
|
return result.ToGetResult();
|
|
}
|
|
|
|
[HttpPost("/api/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<IActionResult> Create(
|
|
[Required] [FromBody] CreateChannelTemplateRequest request,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
Either<BaseError, ChannelTemplateResponseModel> result =
|
|
await mediator.Send(request.ToCommand(), cancellationToken);
|
|
return result.ToCreatedResult(vm => $"/api/channel-templates/{vm.Id}", vm => vm);
|
|
}
|
|
|
|
[HttpPut("/api/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<IActionResult> Update(
|
|
int id,
|
|
[Required] [FromBody] UpdateChannelTemplateRequest request,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
Either<BaseError, ChannelTemplateResponseModel> result =
|
|
await mediator.Send(request.ToCommand(id), cancellationToken);
|
|
return result.ToUpdatedResult();
|
|
}
|
|
|
|
[HttpDelete("/api/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<IActionResult> Delete(int id, CancellationToken cancellationToken)
|
|
{
|
|
Either<BaseError, Unit> result = await mediator.Send(new DeleteChannelTemplate(id), cancellationToken);
|
|
return result.ToDeletedResult();
|
|
}
|
|
}
|