TourIAm/TIAM.Services.Server/MessageSenderService.cs

178 lines
6.2 KiB
C#

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<string> 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<HttpStatusCode> 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<Task<Response>> sendTasks = new List<Task<Response>>();
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<bool> results = new List<bool>();
//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<string, string>
{
{ "UserName", userName },
{ "ActivationCode", activationCode }
};
return EmailTemplateHelper.ReplacePlaceholders(template, placeholders);
}
}
}