using HrynCo.NotificationService.Web.Infrastructure; using HrynCo.NotificationService.Services.EmailTemplates.Create; using HrynCo.NotificationService.Services.EmailTemplates.Delete; using HrynCo.NotificationService.Services.EmailTemplates.Get; using HrynCo.NotificationService.Services.EmailTemplates.GetByService; using HrynCo.NotificationService.Services.EmailTemplates.Update; using MediatR; using Microsoft.AspNetCore.Mvc; namespace HrynCo.NotificationService.Web.Controllers.EmailTemplates; [Route("api/v1/email-templates")] public sealed class EmailTemplatesController : ApiControllerBase { public EmailTemplatesController(IMediator mediator) : base(mediator) { } [HttpGet] public async Task GetAll([FromQuery] string serviceName, CancellationToken cancellationToken) { var result = await Mediator.Send(new GetEmailTemplatesQuery(serviceName), cancellationToken); return FromServiceResult(result); } [HttpGet("{serviceName}/{key}/{languageCode}")] public async Task Get(string serviceName, string key, string languageCode, CancellationToken cancellationToken) { var result = await Mediator.Send(new GetEmailTemplateQuery(serviceName, key, languageCode), cancellationToken); return FromServiceResult(result); } [HttpPost] public async Task Create([FromBody] CreateEmailTemplateRequest request, CancellationToken cancellationToken) { var command = new CreateEmailTemplateCommand( request.ServiceName, request.Key, request.LanguageCode, request.Subject, request.HtmlBody, request.TextBody, request.Variables ); var result = await Mediator.Send(command, cancellationToken); if (!result.IsSuccess) return MapServiceError(result.Error!); return CreatedAtAction( nameof(Get), new { serviceName = request.ServiceName, key = request.Key, languageCode = request.LanguageCode }, new ApiResponse { Success = true, Data = result.Result } ); } [HttpPut("{serviceName}/{key}/{languageCode}")] public async Task Update( string serviceName, string key, string languageCode, [FromBody] UpdateEmailTemplateRequest request, CancellationToken cancellationToken) { var command = new UpdateEmailTemplateCommand( serviceName, key, languageCode, request.Subject, request.HtmlBody, request.TextBody, request.Variables ); var result = await Mediator.Send(command, cancellationToken); return FromServiceResult(result); } [HttpDelete("{serviceName}/{key}/{languageCode}")] public async Task Delete(string serviceName, string key, string languageCode, CancellationToken cancellationToken) { var result = await Mediator.Send(new DeleteEmailTemplateCommand(serviceName, key, languageCode), cancellationToken); return FromServiceResult(result); } }