using HrynCo.NotificationService.DAL.Abstract.Repositories; using HrynCo.NotificationService.DAL.Abstract.Templates; using HrynCo.NotificationService.Services.Core; using HrynCo.NotificationService.Services.Logging; using static HrynCo.NotificationService.Services.Core.ServiceResultHelper; namespace HrynCo.NotificationService.Services.TemplateDefinitions; internal sealed class SaveNotificationServiceHandler( IContextualSerilogLogger logger, INotificationServiceRepository services) : RequestHandler>(logger) { protected override async Task> DoOnHandle(SaveNotificationServiceCommand request, CancellationToken cancellationToken) { if (!request.IsNew && request.Service.Revision == Guid.Empty) return Failure("A nonempty service revision is required for update.", ServiceErrorCode.InvalidRequest); if (!request.IsNew && await services.GetAsync(request.Service.Id, cancellationToken) is null) return Failure("Service not found.", ServiceErrorCode.NotFound); try { await services.SaveAsync(request.Service, request.IsNew, cancellationToken); var saved = await services.GetAsync(request.Service.Id, cancellationToken); return Success(NotificationServiceMapping.Map(saved!)); } catch (EmailTemplateWriteException error) { return Failure(error.Message, error.IsConflict ? ServiceErrorCode.Conflict : ServiceErrorCode.InvalidRequest); } } }