using DigitalData.Core.Abstraction.Application.Repository; using DigitalData.MessagingService.Application.Common.Dto; using DigitalData.MessagingService.Application.Common.Interfaces; using DigitalData.MessagingService.Application.EmailSending.Commands; using DigitalData.MessagingService.Client; using DigitalData.MessagingService.Domain.Entities; using EnvelopeGenerator.Application.Common.Interfaces.Services.Notification; using EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Exceptions; using EnvelopeGenerator.Infrastructure.Notification.Configuration; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; namespace EnvelopeGenerator.Infrastructure.Notification; public class EnvelopeNotificationService(IRepository TempRepo, IMessagingServiceClient MsgClient, IOptions ntfOpt) : IEnvelopeNotificationService { private readonly NotificationOptions NtfOpt = ntfOpt.Value; private async Task GetTemplateAsync(EmailTemplateType templateType, CancellationToken cancel = default) { return await TempRepo.Where(t => t.Name == templateType.ToString()).FirstOrDefaultAsync(cancel) ?? throw new DataIntegrityException($"{templateType} email template not found"); } public async Task Notify(string receiverEmail, TEnvelopeNotificationBase notification, CancellationToken cancel = default) where TEnvelopeNotificationBase : EnvelopeNotificationBase { var template = await GetTemplateAsync(notification.GetTemplateType(), cancel); // create email command var mail = new PublishEmailViaSmtpCommand() { Body = template.Body.ReplacePlaceholders(notification), Subject = template.Subject.ReplacePlaceholders(notification), Recipients = [receiverEmail], Sender = NtfOpt.SenderEmail.ToSender(), IsHtml = true }; // add attachments if any if(notification.Attachments?.Any() ?? false) mail = mail.WithAttachments(notification.Attachments.ToEmailAttachmentDto()); await MsgClient.SendAsync(mail, cancel); } }