using System.Net; using AyCode.Core.Helpers; using AyCode.Models.Enums; using Microsoft.Extensions.Configuration; using SendGrid; using SendGrid.Helpers.Mail; using TIAM.Core.Consts; using TIAM.Database.DataLayers.Admins; using TIAM.Entities.Emails; using TIAM.Entities.Users; namespace TIAM.Services.Server { public class MessageSenderService(IConfiguration configuration, AdminDal adminDal) : IMessageSenderService { public async Task SendMessageAsync(EmailMessage message, int messageType) { var result = ""; switch (messageType) { case (int)MessageTypesEnum.email: Console.WriteLine($@"EmailMessage!!!"); // Access DerivedClass properties //var subject = emailMessage.Subject; //adminDal.AddEmailMessageAsync(message).Forget(); result = (await SendMailWithSendgrid(message)).ToString(); //?? HttpStatusCode.BadRequest.ToString(); break; case (int)MessageTypesEnum.sms: //await SendSmsWithTwilio(message.Message); break; case (int)MessageTypesEnum.push: //await SendPushWithFirebase(message.Message); break; case (int)MessageTypesEnum.chat: //await SendChatWithSignalR(message.Message); default: break; } return result; } public async Task SendMailWithSendgrid(EmailMessage message) { Console.WriteLine($@"Sender: {message.SenderId}"); Console.WriteLine($@"Message: {message.Text}"); //resolve user!!! User senderUser; var apiKey = configuration["SendGrid:Key"]; var client = new SendGridClient(apiKey); EmailAddress from; if (!message.SenderId.HasValue) { //SYSTEM MAIL message.SenderId = TiamConstClient.SysAccounts.FirstOrDefault(x => x.Key == "SystemEmailSender").Value; senderUser = null; //TODO get user from DB soon } else { //USER sent message senderUser = adminDal.GetUserById(message.SenderId.Value); } if (senderUser == null) { if (message.SenderId == Guid.Empty) { message.EmailAddress = TiamConstClient.SystemEmailAddress; from = new EmailAddress(TiamConstClient.SystemEmailAddress, "TourIAm mailservice"); } else { //user not valid, don't send message return HttpStatusCode.BadRequest; } } else { from = new EmailAddress(TiamConstClient.SystemEmailAddress, senderUser.Profile.Name); } Response[] responses = []; try { List> sendTasks = new List>(); foreach (var messageRecipient in message.Recipients) { var to = new EmailAddress(messageRecipient.EmailAddress, messageRecipient.EmailAddress); Console.WriteLine($"Message recipient: {messageRecipient.EmailAddress}"); var plainTextContent = message.Text; //MailHelper.CreateSingleEmailToMultipleRecipients() var msg = MailHelper.CreateSingleEmail(from, to, message.Subject, plainTextContent, plainTextContent); //msg.AddBccs() sendTasks.Add(client.SendEmailAsync(msg)); } responses = await Task.WhenAll(sendTasks).ConfigureAwait(false); foreach (var response in responses) { Console.WriteLine($"{response.StatusCode}, {response.Body.ReadAsStringAsync()}"); } //message.Id = Guid.NewGuid(); //adminDal.AddEmailMessageAsync(message).Forget(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } if (responses.Any(response => !response.IsSuccessStatusCode)) { Console.WriteLine("Some emails failed to send"); return HttpStatusCode.InternalServerError; } Console.WriteLine("All emails sent successfully"); return HttpStatusCode.OK; //List results = new List(); //foreach (var messageRecipient in message.Recipients) //{ // var to = new EmailAddress(messageRecipient.EmailAddress, messageRecipient.EmailAddress); // var plainTextContent = message.Text; // //var _htmlContent = message.; // //MailHelper.CreateSingleEmailToMultipleRecipients() // var msg = MailHelper.CreateSingleEmail(from, to, message.Subject, plainTextContent, plainTextContent); // var response = await client.SendEmailAsync(msg).ConfigureAwait(false); // if(response.IsSuccessStatusCode) // { // results.Add(true); // } // else { results.Add(false); } //} //if(results.Any(x => x=false)) //{ // return HttpStatusCode.BadRequest; //} //else //{ // return HttpStatusCode.OK; //} ////return response.StatusCode; } public string GenerateWelcomeEmail(string userName, string activationCode) { string template = EmailTemplateHelper.GetTemplate(TiamConstClient.WelcomeEmailTemplateName); var placeholders = new Dictionary { { "UserName", userName }, { "ActivationCode", activationCode } }; return EmailTemplateHelper.ReplacePlaceholders(template, placeholders); } } }