using HrynCo.NotificationService.DAL.Abstract.Repositories; using HrynCo.NotificationService.Services.Core; using HrynCo.NotificationService.Services.Logging; using static HrynCo.NotificationService.Services.Core.ServiceResultHelper; namespace HrynCo.NotificationService.Services.EmailChannels.Update; internal sealed class UpdateEmailChannelHandler : RequestHandler> { private readonly IEmailChannelRepository _channels; private readonly INotificationServiceRepository _services; public UpdateEmailChannelHandler( IContextualSerilogLogger logger, IEmailChannelRepository channels, INotificationServiceRepository services) : base(logger) { _channels = channels; _services = services; } protected override async Task> DoOnHandle( UpdateEmailChannelCommand request, CancellationToken cancellationToken) { var channel = await _channels.GetByIdAsync(request.Id, cancellationToken); if (channel is null) return Failure("Email channel not found.", ServiceErrorCode.NotFound); if (request.ServiceId == Guid.Empty || await _services.GetAsync(request.ServiceId, cancellationToken) is null) return Failure("Select an existing service.", ServiceErrorCode.InvalidRequest); channel.ServiceId = request.ServiceId; channel.Priority = request.Priority; channel.Settings = request.Settings; channel.DailyLimit = request.DailyLimit; channel.MonthlyLimit = request.MonthlyLimit; channel.WarnThresholdPercent = request.WarnThresholdPercent; channel.IsActive = request.IsActive; channel.Updated = DateTimeOffset.UtcNow; await _channels.UpdateAsync(channel, cancellationToken); return Success(Unit.Value); } }