using Unit = HrynCo.NotificationService.Services.Core.Unit; using HrynCo.NotificationService.Web.Infrastructure; using HrynCo.NotificationService.DAL.Abstract.Templates; using HrynCo.NotificationService.Services.Core; using HrynCo.NotificationService.Services.TemplateDefinitions; using MediatR; using Microsoft.AspNetCore.Mvc; namespace HrynCo.NotificationService.Web.Controllers.Api.Services; [Route("api/v1/services/{serviceId:guid}/email-template-definitions")] [TypeFilter(typeof(ApiRequestValidationFilter), Order = -3000)] public sealed class EmailTemplateDefinitionsController(IMediator mediator) : ApiControllerBase(mediator) { [HttpGet] [ProducesResponseType>(StatusCodes.Status200OK)] [ProducesResponseType>(StatusCodes.Status400BadRequest)] [ProducesResponseType>(StatusCodes.Status404NotFound)] public async Task Get([FromRoute] Guid serviceId, [FromQuery] string key, CancellationToken cancellationToken) => FromServiceResult(await Mediator.Send(new GetEmailTemplateDefinitionQuery(serviceId, key), cancellationToken)); [HttpPost("upsert")] [ProducesResponseType>(StatusCodes.Status201Created)] [ProducesResponseType>(StatusCodes.Status200OK)] [ProducesResponseType>(StatusCodes.Status400BadRequest)] [ProducesResponseType>(StatusCodes.Status404NotFound)] [ProducesResponseType>(StatusCodes.Status409Conflict)] public async Task Upsert([FromRoute] Guid serviceId, [FromQuery] string key, [FromBody] UpsertTemplateDefinitionRequest request, CancellationToken cancellationToken) { try { var patch = request.ToPatch(serviceId, key); var result = await Mediator.Send(new UpsertEmailTemplateDefinitionCommand(patch), cancellationToken); if (!result.IsSuccess) return MapServiceError(result.Error!); if (patch.Revision is null) return CreatedAtAction(nameof(Get), new { serviceId, key }, new ApiResponse { Success = true, Data = result.Result }); return FromServiceResult(result); } catch (EmailTemplateWriteException error) { return MapServiceError(new ServiceError(error.Message, ServiceErrorCode.InvalidRequest)); } } [HttpGet("all")] [ProducesResponseType>>(StatusCodes.Status200OK)] [ProducesResponseType>(StatusCodes.Status404NotFound)] public async Task GetAll([FromRoute] Guid serviceId, CancellationToken cancellationToken) => FromServiceResult(await Mediator.Send(new GetServiceTemplateDefinitionsQuery(serviceId), cancellationToken)); [HttpDelete] [ProducesResponseType>(StatusCodes.Status200OK)] [ProducesResponseType>(StatusCodes.Status400BadRequest)] [ProducesResponseType>(StatusCodes.Status404NotFound)] [ProducesResponseType>(StatusCodes.Status409Conflict)] public async Task Delete([FromRoute] Guid serviceId, [FromQuery] string key, [FromQuery] Guid revision, CancellationToken cancellationToken) => FromServiceResult(await Mediator.Send(new DeleteEmailTemplateDefinitionCommand(serviceId, key, revision), cancellationToken)); }