using System.Net; using AyCode.Core.Helpers; using AyCode.Core.Loggers; using AyCode.Models.Enums; using Microsoft.Extensions.Configuration; using SendGrid; using SendGrid.Helpers.Mail; using TIAM.Database.DataLayers.Admins; using TIAM.Entities.Emails; 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!!! if (!message.SenderId.HasValue) return HttpStatusCode.BadRequest; var senderUser = adminDal.GetUserById(message.SenderId.Value); //var receiverUser = adminDal.Context.Users.FirstOrDefault(x => x.Id == message.ReceiverId); if (senderUser != null) return HttpStatusCode.BadRequest; var apiKey = configuration["SendGrid:Key"]; var client = new SendGridClient(apiKey); EmailAddress from; if (message.SenderId == Guid.Empty) { from = new EmailAddress("noreply@touriam.com", "TourIAm mailservice"); } else { from = new EmailAddress(message.EmailAddress, senderUser.Profile.Name); } List> sendTasks = new List>(); foreach (var messageRecipient in message.Recipients) { var to = new EmailAddress(messageRecipient.EmailAddress, messageRecipient.EmailAddress); var plainTextContent = message.Text; var msg = MailHelper.CreateSingleEmail(from, to, message.Subject, plainTextContent, plainTextContent); sendTasks.Add(client.SendEmailAsync(msg)); } var responses = await Task.WhenAll(sendTasks).ConfigureAwait(false); 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; } } }