From df7e7cf613d3a9f6f0104b149fd3c6b391ce65cd Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 19 Aug 2024 19:26:36 +0200 Subject: [PATCH] general message, transfer edit fix, email sennding from admin --- TIAM.Core/Consts/TiamConst.cs | 10 + TIAM.Services.Server/EmailTemplateHelper.cs | 15 + .../EmailTemplates/GeneralEmailTemplate.html | 13 + .../TIAM.Services.Server.csproj | 4 + .../TransferBackendService.cs | 3 + TIAMMobileApp/Services/WizardProcessor.cs | 35 +- TIAMSharedUI/Pages/EditTransfers.razor | 45 ++- TIAMSharedUI/Pages/TransferPage.razor | 98 ++++- .../User/SysAdmins/ManageTransfers.razor | 47 +-- .../Controllers/MessageAPIController.cs | 35 ++ .../Controllers/TransferDataAPIController.cs | 378 ++++++------------ .../UI/WizardModels/MessageWizardModel.cs | 8 +- .../MessageWizardModelExtensions.cs | 10 +- 13 files changed, 389 insertions(+), 312 deletions(-) create mode 100644 TIAM.Services.Server/EmbeddedResources/EmailTemplates/GeneralEmailTemplate.html diff --git a/TIAM.Core/Consts/TiamConst.cs b/TIAM.Core/Consts/TiamConst.cs index 1b1bf04a..b4ad5cdc 100644 --- a/TIAM.Core/Consts/TiamConst.cs +++ b/TIAM.Core/Consts/TiamConst.cs @@ -22,6 +22,7 @@ public static class TiamConstClient public static string NewTransferEmailTemplateName = "NewTransferEmailTemplate"; public static string TransferModifiedEmailTemplateName = "TramsferModifiedEmailTemplate"; public static string ForgotPasswordEmailTemplateName = "ForgotPasswordEmailTemplate"; + public static string GeneralEmailTemplateName = "GeneralEmailTemplate"; public static List WelcomeEmailParameters = new List() { @@ -53,6 +54,15 @@ public static class TiamConstClient "TransferId" }; + public static List GeneralEmailParameters = new List() + { + //string userName, string settingBaseUrl, string userId, string token + "UserName", + "MessageBody", + "SettingBaseUrl", + "UserId" + }; + #if RELEASE public static string SystemEmailAddress = "system@touriam.com"; public static LogLevel DefaultLogLevelClient = LogLevel.Debug; diff --git a/TIAM.Services.Server/EmailTemplateHelper.cs b/TIAM.Services.Server/EmailTemplateHelper.cs index 858675fe..fbda0365 100644 --- a/TIAM.Services.Server/EmailTemplateHelper.cs +++ b/TIAM.Services.Server/EmailTemplateHelper.cs @@ -102,5 +102,20 @@ namespace TIAM.Services.Server return EmailTemplateHelper.ReplacePlaceholders(template, placeholders); } + public static string GenerateGeneralEmail(string userName, string messageBody, string settingBaseUrl, string userId) + { + string template = EmailTemplateHelper.GetTemplate(TiamConstClient.GeneralEmailTemplateName); + + var placeholders = new Dictionary + { + { TiamConstClient.GeneralEmailParameters[0], userName }, + { TiamConstClient.GeneralEmailParameters[1], messageBody }, + { TiamConstClient.GeneralEmailParameters[2], settingBaseUrl }, + { TiamConstClient.GeneralEmailParameters[3], userId } + }; + + return EmailTemplateHelper.ReplacePlaceholders(template, placeholders); + } + } } diff --git a/TIAM.Services.Server/EmbeddedResources/EmailTemplates/GeneralEmailTemplate.html b/TIAM.Services.Server/EmbeddedResources/EmailTemplates/GeneralEmailTemplate.html new file mode 100644 index 00000000..5350a1fe --- /dev/null +++ b/TIAM.Services.Server/EmbeddedResources/EmailTemplates/GeneralEmailTemplate.html @@ -0,0 +1,13 @@ + + + + Welcome + + +

Hello, {{UserName}}!

+

You have received a message in the TourIam System:

+

{{MessageBody}}

+
+

You can check out your messages here

+ + \ No newline at end of file diff --git a/TIAM.Services.Server/TIAM.Services.Server.csproj b/TIAM.Services.Server/TIAM.Services.Server.csproj index 14748770..6962cb50 100644 --- a/TIAM.Services.Server/TIAM.Services.Server.csproj +++ b/TIAM.Services.Server/TIAM.Services.Server.csproj @@ -8,6 +8,7 @@ + @@ -23,6 +24,9 @@ Always + + Always + diff --git a/TIAM.Services.Server/TransferBackendService.cs b/TIAM.Services.Server/TransferBackendService.cs index 2ff08010..dc5133ce 100644 --- a/TIAM.Services.Server/TransferBackendService.cs +++ b/TIAM.Services.Server/TransferBackendService.cs @@ -27,12 +27,15 @@ namespace TIAM.Services.Server public double GetTransferPrice(Product product, TransferDestination fromTransferDestination, TransferDestination toTransferDestination, in byte seatNumber) { + //ha from vagy to null, akkor a product price-t kellene kivenni (és majd vizsgálni, hogy buda vagy pest) var baseDestination = product.Profile.AddressId == fromTransferDestination.AddressId ? toTransferDestination : fromTransferDestination; var transferDestinationToProduct = adminDal.GetTransferDestinationToProduct(product.Id, baseDestination.Id); var tranferDestinationPrice = transferDestinationToProduct ?? baseDestination as ITransfeDestinationPrices; + //product commission-t nem kellene hozzáadni, mivel a transferDestination árából lejön a transferdestination commission-je (ha van gondolom) + var price = GetSeatNumberPrice(in tranferDestinationPrice, seatNumber) + tranferDestinationPrice.ProductCommis + GetExtraPrice(in fromTransferDestination); //TODO: ExtraPrice - J. seatnum percent price, FirstName, LastName, CascadeDelete diff --git a/TIAMMobileApp/Services/WizardProcessor.cs b/TIAMMobileApp/Services/WizardProcessor.cs index 5fb8bf47..124fbff0 100644 --- a/TIAMMobileApp/Services/WizardProcessor.cs +++ b/TIAMMobileApp/Services/WizardProcessor.cs @@ -1,6 +1,7 @@ using TIAM.Entities.Transfers; +using TIAM.Entities.Emails; +//using TIAM.Entities.TransferDestinations; using TIAMWebApp.Shared.Application.Interfaces; -using TIAMWebApp.Shared.Application.Models; using TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels; namespace TIAMMobileApp.Services @@ -8,29 +9,37 @@ namespace TIAMMobileApp.Services public class WizardProcessor : IWizardProcessor { - public ITransferDataService transferDataService { get; set; } - public IUserDataService userDataService { get; set; } + public ITransferDataService TransferDataService { get; set; } + public IUserDataService UserDataService { get; set; } + public IClientNoticeSenderService MessageSenderService { get; set; } - public WizardProcessor(ITransferDataService transferDataService, IUserDataService userDataService) + public WizardProcessor(ITransferDataService transferDataService, IUserDataService userDataService, IClientNoticeSenderService messageSenderService) { - this.transferDataService = transferDataService; - this.userDataService = userDataService; + this.TransferDataService = transferDataService; + this.UserDataService = userDataService; + this.MessageSenderService = messageSenderService; } public async Task ProcessWizardAsync(Type type, object data) where TModelType: class { switch (type.Name) { - case "TransferDestinationWizardModel": - var result = await transferDataService.CreateTransferDestination((TransferDestination)data); + case nameof(TransferDestinationWizardModel): + var result = await TransferDataService.CreateTransferDestination((TransferDestination)data); return result as TModelType; - //var a = new WizardProcessorResult(); - //a.Model = result; - //return a as TResult; + case nameof(TransferWizardModel): + Console.WriteLine(@"TransferWizardModel"); + var transferResult = await TransferDataService.CreateTransfer((TransferWizardModel)data); + return transferResult as TModelType; - case "ServiceProvider": - return null; + case nameof(MessageWizardModel): + TIAM.Entities.Emails.EmailMessage emailMessage = ((MessageWizardModel)data).CopyToEmailMessage(); + var messageResult = await MessageSenderService.SendNoticeAsync(emailMessage, 1); + return messageResult as TModelType; + + //case nameof(ServiceProvider): + // return null; default: return null; } diff --git a/TIAMSharedUI/Pages/EditTransfers.razor b/TIAMSharedUI/Pages/EditTransfers.razor index 9a29d07f..b507ed32 100644 --- a/TIAMSharedUI/Pages/EditTransfers.razor +++ b/TIAMSharedUI/Pages/EditTransfers.razor @@ -2,6 +2,7 @@ @using AyCode.Core.Extensions @using TIAM.Entities.Transfers @using TIAM.Resources +@using TIAMSharedUI.Shared.Components.BaseComponents @using TIAMWebApp.Shared.Application.Interfaces @using AyCode.Services.Loggers @using TIAM.Core.Enums @@ -10,6 +11,7 @@ @using TIAMWebApp.Shared.Application.Utility @using TIAMSharedUI.Pages.User.SysAdmins @using TIAMSharedUI.Pages.Components +@inherits BasePageComponent @inject HttpClient Http @inject NavigationManager navManager @inject IEnumerable LogWriters @@ -19,6 +21,7 @@ @inject NavigationManager navigationManager @inject IStringLocalizer localizer @inject IWizardProcessor wizardProcessor +@inject AdminSignalRClient _adminSignalRClient Transfer details
@@ -69,7 +72,7 @@ else {
- + @if (!_editMode) @@ -238,12 +241,12 @@ else } - +
-
+
} @@ -258,6 +261,8 @@ else private LoggerClient _logger = null!; private MessageWizardModel _messageWizardModel = new(); + private bool displayCard = true; + private bool _popupVisible; public List IgnoreList = @@ -361,6 +366,7 @@ else protected override async Task OnInitializedAsync() { + foreach (var t in Enum.GetValues(typeof(TransferStatusType)).OfType().ToList()) _statusTypes.Add(t.ToString()); @@ -368,9 +374,35 @@ else _logger.Info($"parameter: {transferId.ToString()}"); await LoadTransfer(); - if (_transfer.UserId.IsNullOrEmpty()) + var test = _transfer.UserId; + if (!_transfer.UserId.IsNullOrEmpty()) { - await UserDataService.SetEmailConfirmed(_transfer.UserId); + //get transfer user details + var transferUser = await UserDataService.GetUserByEmailAsync(_transfer.ContactEmail); + if(transferUser != null) + { + if(_sessionService.IsAuthenticated) + { + if (_sessionService.User != null) + { + if (transferUser.Id == _sessionService.User.UserId) + { + //I am logged in, and this is my transfer + await UserDataService.SetEmailConfirmed(_transfer.UserId); + + } + else + { + //this is not my transfer, if I am not sysadmin, I should not see the transfer details + if(!_sessionService.IsSysAdmin || !_sessionService.IsDevAdmin) + { + displayCard = false; + } + } + } + } + } + } } @@ -389,7 +421,8 @@ else { try { - var response = await transferDataService.GetTransferByIdAsync(transferId); + //var response = await transferDataService.GetTransferByIdAsync(transferId); + var response = await _adminSignalRClient.GetTransferById(transferId); if (response != null) { diff --git a/TIAMSharedUI/Pages/TransferPage.razor b/TIAMSharedUI/Pages/TransferPage.razor index 51b483e1..0853b755 100644 --- a/TIAMSharedUI/Pages/TransferPage.razor +++ b/TIAMSharedUI/Pages/TransferPage.razor @@ -1,14 +1,24 @@ @page "/transfer" +@using AyCode.Core.Consts +@using AyCode.Core.Helpers +@using TIAM.Models.Dtos.Users +@using TIAM.Services @using TIAMSharedUI.Pages.Components @using TIAMSharedUI.Pages.Components.EditComponents @using TIAMSharedUI.Shared +@using TIAMSharedUI.Shared.Components.BaseComponents @using TIAMWebApp.Shared.Application.Interfaces @using TIAMWebApp.Shared.Application.Models.ClientSide.UI @using TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels @using AyCode.Services.Loggers +@using TIAMWebApp.Shared.Application.Models.PageModels +@using TIAMWebApp.Shared.Application.Services +@inherits BasePageComponent @inject NavigationManager navManager @inject IAcLogWriterClientBase BrowserConsoleLogWriter @inject IWizardProcessor WizardProcessor +@inject IUserDataService UserDataService +@inject AdminSignalRClient _adminSignalRClient Transfer @@ -113,13 +123,93 @@ new HeroSliderItem public async Task SubmitForm(object Result) { + TransferWizardModel resModel = (TransferWizardModel)Result; + //let's check if user exists with this email + var user = await UserDataService.GetUserByEmailAsync(resModel.EmailAddress!); + if (user != null && user.Id != Guid.Empty) + { + resModel.UserId = user.Id; + //user exists already + + if(_sessionService.User != null) + { + if(_sessionService.User.UserId == user.Id) + { + + //I have ordered for myself + resModel.ReferralId = null; + } + else + { + //if I am logged in and different user I become referrer (if no referrer already) + var transferUserDetail = await UserDataService.GetUserDetailByIdAsync(user.Id); + var userDetail = await UserDataService.GetUserDetailByIdAsync(_sessionService.User.UserId); + + if (transferUserDetail.UserDto.RefferalId != null) + { + //user has aready a referrer so we use that + resModel.ReferralId = transferUserDetail.UserDto.RefferalId; + } + else + { + //user has no referrer so I am the referrer + resModel.ReferralId = userDetail.UserDto.RefferalId; + + } + } + } + } + else + { + //create a guest user and set referralId + var registration = new RegistrationModel(); + + var password = AcCharsGenerator.NewPassword(AcConst.MinPasswordLength, 16); + + registration.Email = resModel.EmailAddress; + registration.PhoneNumber = resModel.PhoneNumber; + registration.Password = password; + //get list with one member! + + var createResult = await UserDataService.CreateGuestUser(registration); + if (createResult.isSuccess) + { + if (createResult.user != null) + { + if (_sessionService.User != null) + { + //if I am logged in user I become referrer + var userDetail = await UserDataService.GetUserDetailByIdAsync(_sessionService.User.UserId); + var createdUserDetail = await UserDataService.GetUserDetailByIdAsync(createResult.user.Id); + if(createdUserDetail != null) + { + createdUserDetail.UserDto.RefferalId = userDetail.UserDto.RefferalId; + var updatedNewUser = await _adminSignalRClient.PostDataAsync(SignalRTags.UpdateUserModelDtoDetail, userDetail); + if (updatedNewUser != null) + { + //referral set + } + else + { + //something wrong + } + } + resModel.ReferralId = userDetail.UserDto.RefferalId; + } + + resModel.UserId = createResult.user.Id; + + } + else + { + //some error handling + } + } + } var transfer = await WizardProcessor.ProcessWizardAsync(Result.GetType(), Result); BrowserConsoleLogWriter.Info($"Submitted nested form: {Result.GetType().FullName}"); - navManager.NavigateTo("/transfer2/"+transfer.Id); + navManager.NavigateTo($"/transfer2/{resModel.Id}"); } - - - } diff --git a/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor b/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor index 333d0071..284ccac9 100644 --- a/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor +++ b/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor @@ -1,5 +1,6 @@ @page "/sysadmin/transfers" @using BlazorAnimation +@using TIAM.Core.Consts @using TIAM.Core.Enums @using TIAM.Entities.Emails @using TIAM.Entities.Transfers @@ -250,19 +251,20 @@ "SenderFullName", "SenderId", "ContextId", + "ContextType" ]; private static readonly List Statuses = [ new(Convert.ToByte(TransferStatusType.OrderSubmitted), "Order submitted"), - new(Convert.ToByte(TransferStatusType.OrderConfirmed), "Order confirmed"), - new(Convert.ToByte(TransferStatusType.AssignedToDriver), "Assigned to driver"), - new(Convert.ToByte(TransferStatusType.DriverConfirmed), "Driver confirmed"), - new(Convert.ToByte(TransferStatusType.DriverEnRoute), "Driver enroute"), - new(Convert.ToByte(TransferStatusType.PassengerPickup), "Passenger in car"), - new(Convert.ToByte(TransferStatusType.Finished), "Finished"), - new(Convert.ToByte(TransferStatusType.UserCanceled), "User cancelled"), - new(Convert.ToByte(TransferStatusType.AdminDenied), "Admin cancelled") + new(Convert.ToByte(TransferStatusType.OrderConfirmed), "Order confirmed"), + new(Convert.ToByte(TransferStatusType.AssignedToDriver), "Assigned to driver"), + new(Convert.ToByte(TransferStatusType.DriverConfirmed), "Driver confirmed"), + new(Convert.ToByte(TransferStatusType.DriverEnRoute), "Driver enroute"), + new(Convert.ToByte(TransferStatusType.PassengerPickup), "Passenger in car"), + new(Convert.ToByte(TransferStatusType.Finished), "Finished"), + new(Convert.ToByte(TransferStatusType.UserCanceled), "User cancelled"), + new(Convert.ToByte(TransferStatusType.AdminDenied), "Admin cancelled") ]; private static List _selectedCategories = Statuses.Where(x => /* x.StatusValue != (byte)TransferStatusType.OrderSubmitted && */ x.StatusValue != (byte)TransferStatusType.Finished && x.StatusValue != (byte)TransferStatusType.UserCanceled && x.StatusValue != (byte)TransferStatusType.AdminDenied).ToList(); @@ -278,11 +280,13 @@ void SendMail(Transfer item) { - _logger.Info($"Sending mail to {item.ContactEmail}, {item.Id}"); - + _logger.Info($"Preparing mail to {item.ContactEmail}, {item.Id}"); + _messageWizardModel.Subject = $"[#{item.OrderId}] New message regarding your transfer"; _messageWizardModel.ReceiverId = item.UserId; _messageWizardModel.ContextId = item.Id; - _messageWizardModel.SenderEmailAddress = "info@touriam.com"; + _messageWizardModel.ContextType = MessageContextType.Transfer; + _messageWizardModel.SenderId = TiamConstClient.SysAccounts["SystemEmailSender"]; + _messageWizardModel.SenderEmailAddress = TiamConstClient.SystemEmailAddress; _messageWizardModel.ReceiverEmailAddress = item.ContactEmail; _messageWizardModel.ReceiverFullName = item.FullName; _popupVisible = true; @@ -311,28 +315,11 @@ public async Task SubmitForm(object result) { - var messageModel = (result as MessageWizardModel)!; - messageModel.ContextId = _messageWizardModel.ContextId; - //messageModel.SenderId = sessionService.User.UserId; - - string FormatEmailContent() - { - return $@" - - -

Dear {messageModel.SenderFullName},

-

{messageModel.Content}:

-

Best regards,
Tour I Am team

- - "; - } - - messageModel.Content = FormatEmailContent(); - + var messageModel = (result as MessageWizardModel)!; _logger.Info(messageModel.Content); var email = await wizardProcessor.ProcessWizardAsync(result.GetType(), messageModel); - _logger.Info($"Submitted nested form: {result.GetType().FullName}"); + CancelCreateClick(); } void Grid_CustomizeElement(GridCustomizeElementEventArgs e) diff --git a/TIAMWebApp/Server/Controllers/MessageAPIController.cs b/TIAMWebApp/Server/Controllers/MessageAPIController.cs index 7098d5e6..9845fd3c 100644 --- a/TIAMWebApp/Server/Controllers/MessageAPIController.cs +++ b/TIAMWebApp/Server/Controllers/MessageAPIController.cs @@ -16,6 +16,9 @@ using TIAM.Entities.Products; using AyCode.Core.Consts; using AyCode.Core; using TIAM.Core.Consts; +using TIAM.Entities.Users; +using TIAM.Services.Server; +using TIAMWebApp.Shared.Application.Models.ClientSide; namespace TIAMWebApp.Server.Controllers { @@ -48,6 +51,23 @@ namespace TIAMWebApp.Server.Controllers { _logger.Debug($"SendEmail called!"); var message = JObject.Parse(serializedMessageSenderModel.GetRawText()).ToObject>(); + var receiver = _adminDal.GetUserById(message.Message.Recipients[0].RecipientId); + string receiverFullName = ""; + if (receiver != null) { + if (receiver.FullName != null) + { + receiverFullName = receiver.FullName; + } + else + { + receiverFullName = "TourIam User"; + } + } + else + { + //wrong userId? + } + if (message == null) return BadRequest("Invalid request"); @@ -58,6 +78,21 @@ namespace TIAMWebApp.Server.Controllers var messageElement = message.Message; _logger.Debug(message.Message.Subject); messageElement.EmailAddress = TiamConstClient.SystemEmailAddress; + + var htmlContent = EmailTemplateHelper.GenerateGeneralEmail( + receiverFullName, + messageElement.Text, + Setting.BaseUrl, + messageElement.Recipients[0].RecipientId.ToString() + ); + message.Message.Text = htmlContent; + + foreach (var admin in TiamConstClient.SysAdmins) + { + var adminUser = _adminDal.GetUserById(admin, true); + message.Message.Recipients.Add(new EmailRecipient(Guid.NewGuid(), admin, message.Message.Id, adminUser.EmailAddress)); + } + await _adminDal.AddEmailMessageAsync(messageElement); var result = await _messageSenderService.SendMessageAsync(messageElement, (int)message.MessageType); //_adminDal.AddEmailMessageAsync((TIAM.Entities.Emails.EmailMessage)SerializedMessageSenderModel.Message); diff --git a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs index fcdd8575..9a1e77e4 100644 --- a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs +++ b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs @@ -153,7 +153,7 @@ namespace TIAMWebApp.Server.Controllers return result ? transferDestination : null; } - + //[AllowAnonymous] //[HttpPost] @@ -379,289 +379,165 @@ namespace TIAMWebApp.Server.Controllers public async Task AddTransfer(Transfer transfer) { _logger.Info(@"CreateTransfer via SignalR called!"); - - if (transfer != null) - { - var id = Guid.NewGuid(); - //TransferDestination transferDestination = new TransferDestination(id, transferDestinationModel.Name, transferDestinationModel.Description, transferDestinationModel.AddressString); + if (transfer == null || string.IsNullOrEmpty(transfer.FromAddress) || string.IsNullOrEmpty(transfer.ToAddress)) + { + return null; + } + await ProcessTransferAsync(transfer); + await SendTransferEmailAsync(transfer); - if (string.IsNullOrEmpty(transfer.FromAddress) || string.IsNullOrEmpty(transfer.ToAddress)) - { - return null; - } - else - { - _logger.Info($@"TransferDestination to be created: {id}"); - _logger.Info($@"TransferDestination to be created: {transfer.FromAddress}"); - _logger.Info($@"TransferDestination to be created: {transfer.ToAddress}"); - _logger.Info($@"TransferDestination to be created: {transfer.ProductId}"); - _logger.Info($@"TransferDestination to be created: {transfer.Price}"); - - var destList = _adminDal.GetTransferDestinations(); - var from = destList.FirstOrDefault(x => x.AddressString == transfer.FromAddress); - var to = destList.FirstOrDefault(x => x.AddressString == transfer.ToAddress); - - ////TODO - //if (!transfer.ProductId.IsNullOrEmpty()) - // transfer.Price = _transferBackendService.GetTransferPrice(transfer.ProductId.Value, from, to, transfer.PassengerCount); - - Product? product = null; - //TODO - if (!transfer.ProductId.IsNullOrEmpty()) - { - product = await _adminDal.GetProductByIdAsync((Guid)transfer.ProductId); - transfer.Price = _transferBackendService.GetTransferPrice(transfer.ProductId.Value, from, to, transfer.PassengerCount); - } - - transfer.TransferStatusType = TransferStatusType.OrderSubmitted; - if (transfer.Price != null && transfer.Price > 0 && product != null) - { - if (product.ServiceProvider.CommissionPercent != null) - { - transfer.Revenue = transfer.Price * product.ServiceProvider.CommissionPercent / 100; - } - else - { - transfer.Revenue = 0; - } - } - await _adminDal.AddTransferAsync(transfer); - - - _logger.Info($"Created transfer, send emailMessage!!!"); - var message = new MessageSenderModel(); - message.Message = new EmailMessage(); - message.Message.Id = Guid.NewGuid(); - message.Message.Subject = "[Tour I Am] New transfer in Budapest"; - message.Message.ContextId = transfer.Id; - message.Message.SenderId = Guid.Empty; - message.Message.Recipients.Add(new EmailRecipient(Guid.NewGuid(), transfer.UserId, Guid.NewGuid(), transfer.ContactEmail)); - - string FormatEmailContent() - { - return $@" - - -

Dear {transfer.FullName},

-

We are pleased to inform you that a transfer order has been placed. Below are the details of the transfer:

-

{transfer.FromAddress} - {transfer.ToAddress}

-

{transfer.Appointment}

-

{transfer.FullName}

-

{transfer.PassengerCount}

-

Please confirm the transfer by clicking on the following link:

-

Confirm Transfer

-

If you did not request this transfer, please disregard this email.

-

Thank you,
Tour I Am team

- - "; - } - message.Message.Text = FormatEmailContent(); - _logger.Info(message.Message.Text); - //message.Message.Text = $"Dear {transfer.FullName}! /n We have received an order from you, please confirm the details here: https://www.touriam.com/mytransfer?{transfer.Id}"; - var messageElement = message.Message; - var result = await _messageSenderService.SendMessageAsync(messageElement, (int)message.MessageType); - await _adminDal.AddEmailMessageAsync(messageElement); - _logger.Info("SendEmail result: " + result); - - - return transfer; - } - } - else - { - return null; - } - + return transfer; } - [AllowAnonymous] [HttpPost] - [Route(APIUrls.CreateTransferRouteName)] + [Route(APIUrls.CreateTransferRouteName)] public async Task CreateTransfer([FromBody] JsonElement serializedTransferModel) { _logger.Info(@"CreateTransfer called!"); + if (string.IsNullOrEmpty(serializedTransferModel.GetRawText())) { - return BadRequest("SerializedTramsferDestinationWizardModel is required"); + return BadRequest("SerializedTransferModel is required"); } - else + + var transfer = DeserializeTransfer(serializedTransferModel); + if (transfer == null || string.IsNullOrEmpty(transfer.FromAddress) || string.IsNullOrEmpty(transfer.ToAddress)) { - Transfer? transfer = JObject.Parse(serializedTransferModel.GetRawText()).ToObject(); - - if (transfer != null) - { - - var id = Guid.NewGuid(); - //TransferDestination transferDestination = new TransferDestination(id, transferDestinationModel.Name, transferDestinationModel.Description, transferDestinationModel.AddressString); - - - if (string.IsNullOrEmpty(transfer.FromAddress) || string.IsNullOrEmpty(transfer.ToAddress)) - { - return BadRequest("Invalid request"); - } - else - { - _logger.Info($@"TransferDestination to be created: {id}"); - _logger.Info($@"TransferDestination to be created: {transfer.FromAddress}"); - _logger.Info($@"TransferDestination to be created: {transfer.ToAddress}"); - _logger.Info($@"TransferDestination to be created: {transfer.ProductId}"); - _logger.Info($@"TransferDestination to be created: {transfer.Price}"); - - var from = await _adminDal.Context.TransferDestinations.FirstOrDefaultAsync(x => x.AddressString == transfer.FromAddress); - var to = await _adminDal.Context.TransferDestinations.FirstOrDefaultAsync(x => x.AddressString == transfer.ToAddress); - Product? product = null; - //TODO - if (!transfer.ProductId.IsNullOrEmpty()) - { - product = await _adminDal.GetProductByIdAsync((Guid)transfer.ProductId); - transfer.Price = _transferBackendService.GetTransferPrice(transfer.ProductId.Value, from, to, transfer.PassengerCount); - - if (transfer.Price != null && transfer.Price > 0) - { - transfer.Revenue = _transferBackendService.GetCommission((Guid)transfer.ProductId, (double)transfer.Price, to); - } - else - { - transfer.Revenue = 0; - } - } - - transfer.TransferStatusType = TransferStatusType.OrderSubmitted; - - await _adminDal.AddTransferAsync(transfer); - - - _logger.Info($"Created transfer, send emailMessage!!!"); - var message = new MessageSenderModel(); - message.Message = new EmailMessage(); - message.Message.Id = Guid.NewGuid(); - message.Message.EmailAddress = TiamConstClient.SystemEmailAddress; - message.MessageType = AyCode.Models.Enums.MessageTypesEnum.email; - message.Message.Subject = $"[#{transfer.OrderId}][Tour I Am] New transfer in Budapest"; - message.Message.ContextId = transfer.Id; - message.Message.ContextType = MessageContextType.Transfer; - message.Message.SenderId = TiamConstClient.SysAccounts["SystemEmailSender"]; - message.Message.Recipients.Add(new EmailRecipient(Guid.NewGuid(), transfer.UserId, message.Message.Id, transfer.ContactEmail)); - foreach(var admin in TiamConstClient.SysAdmins) - { - var adminUser = _adminDal.GetUserById(admin, true); - message.Message.Recipients.Add(new EmailRecipient(Guid.NewGuid(), admin, message.Message.Id, adminUser.EmailAddress)); - } - message.Message.Text = EmailTemplateHelper.GenerateNewTransferEmail( - transfer.FullName, - transfer.FromAddress, - transfer.ToAddress, - transfer.Appointment.ToString(), - transfer.FullName, - transfer.PassengerCount.ToString(), - transfer.LuggageCount.ToString(), - Setting.BaseUrl, - transfer.Id.ToString()); - _logger.Info(message.Message.Text); - //message.Message.Text = $"Dear {transfer.FullName}! /n We have received an order from you, please confirm the details here: https://www.touriam.com/mytransfer?{transfer.Id}"; - var messageElement = message.Message; - var result = await _messageSenderService.SendMessageAsync(messageElement, (int)message.MessageType); - await _adminDal.AddEmailMessageAsync(messageElement); - _logger.Info("SendEmail result: " + result); - - - return Ok(transfer); - } - } - else - { - return BadRequest("Invalid request"); - } - - + return BadRequest("Invalid request"); } + await ProcessTransferAsync(transfer); + await SendTransferEmailAsync(transfer); + return Ok(transfer); } - [AllowAnonymous] [HttpPost] [Route(APIUrls.CreateTransfersRouteName)] public async Task CreateTransfers([FromBody] JsonElement serializedTransferList) { _logger.Info(@"CreateTransfers called!"); + if (string.IsNullOrEmpty(serializedTransferList.GetRawText())) { - return BadRequest("SerializedTramsferDestinationWizardModel is required"); + return BadRequest("SerializedTransferList is required"); } - else + + var transfers = DeserializeTransfers(serializedTransferList); + if (transfers == null || !transfers.Any()) { - _logger.Info($@"Serialized model: {serializedTransferList.GetRawText()}"); + return BadRequest("Invalid request"); + } - var settings = new JsonSerializerSettings + var createdTransfers = new List(); + foreach (var transfer in transfers) + { + await ProcessTransferAsync(transfer); + await SendTransferEmailAsync(transfer); + createdTransfers.Add(transfer); + } + + return Ok(createdTransfers); + } + + // Helper method to deserialize a single transfer + [NonAction] + private Transfer? DeserializeTransfer(JsonElement serializedTransferModel) + { + return JObject.Parse(serializedTransferModel.GetRawText()).ToObject(); + } + + // Helper method to deserialize a list of transfers + [NonAction] + private List? DeserializeTransfers(JsonElement serializedTransferList) + { + var settings = new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }; + + return JsonConvert.DeserializeObject>(serializedTransferList.GetRawText(), settings); + } + + // Helper method to process a transfer + [NonAction] + private async Task ProcessTransferAsync(Transfer transfer) + { + var from = await _adminDal.Context.TransferDestinations.FirstOrDefaultAsync(x => x.AddressString == transfer.FromAddress); + var to = await _adminDal.Context.TransferDestinations.FirstOrDefaultAsync(x => x.AddressString == transfer.ToAddress); + + if (!transfer.ProductId.IsNullOrEmpty()) + { + var product = await _adminDal.GetProductByIdAsync((Guid)transfer.ProductId); + transfer.Price = _transferBackendService.GetTransferPrice(transfer.ProductId.Value, from, to, transfer.PassengerCount); + + if (transfer.Price.HasValue && transfer.Price > 0) { - ContractResolver = new CamelCasePropertyNamesContractResolver() - }; - - List? transfers = JsonConvert.DeserializeObject>(serializedTransferList.GetRawText(), settings); - - //List? transfers = JObject.Parse(serializedTransferModel.GetRawText()).ToObject>(); - List createdTransfers = new List(); - if (transfers != null) - { - foreach (var transfer in transfers) - { - var id = Guid.NewGuid(); - var result = await _adminDal.AddTransferAsync(transfer); - if (result) - { - createdTransfers.Add(transfer); - } - } - - foreach (var createdTransfer in createdTransfers) - { - _logger.Info($"Created transfer, send emailMessage!!!"); - var message = new MessageSenderModel(); - message.Message = new EmailMessage(); - message.Message.Id = Guid.NewGuid(); - message.Message.EmailAddress = TiamConstClient.SystemEmailAddress; - message.MessageType = AyCode.Models.Enums.MessageTypesEnum.email; - message.Message.Subject = $"[#{createdTransfer.OrderId}][Tour I Am] New transfer in Budapest"; - message.Message.ContextId = createdTransfer.Id; - message.Message.ContextType = MessageContextType.Transfer; - message.Message.SenderId = TiamConstClient.SysAccounts["SystemEmailSender"]; - message.Message.Recipients.Add(new EmailRecipient(Guid.NewGuid(), createdTransfer.UserId, Guid.NewGuid(), createdTransfer.ContactEmail)); - foreach (var admin in TiamConstClient.SysAdmins) - { - var adminUser = _adminDal.GetUserById(admin, true); - message.Message.Recipients.Add(new EmailRecipient(Guid.NewGuid(), admin, message.Message.Id, adminUser.EmailAddress)); - } - message.Message.Text = EmailTemplateHelper.GenerateNewTransferEmail( - createdTransfer.FullName, - createdTransfer.FromAddress, - createdTransfer.ToAddress, - createdTransfer.Appointment.ToString(), - createdTransfer.FullName, - createdTransfer.PassengerCount.ToString(), - createdTransfer.LuggageCount.ToString(), - Setting.BaseUrl, - createdTransfer.Id.ToString()); - - _logger.Info(message.Message.Text); - var messageElement = message.Message; - Console.WriteLine(message.Message); - var result = await _messageSenderService.SendMessageAsync(messageElement, (int)message.MessageType); - await _adminDal.AddEmailMessageAsync(messageElement); - _logger.Info("SendEmail result: " + result); - } - - return Ok(createdTransfers); + transfer.Revenue = _transferBackendService.GetCommission((Guid)transfer.ProductId, (double)transfer.Price, to); } else { - return BadRequest("Invalid request"); + transfer.Revenue = 0; } } + + transfer.TransferStatusType = TransferStatusType.OrderSubmitted; + await _adminDal.AddTransferAsync(transfer); + } + + // Helper method to find or create user + [NonAction] + private async Task FindOrCreateUser(string Email) + { + + } + + // Helper method to send an email for the transfer + [NonAction] + private async Task SendTransferEmailAsync(Transfer transfer) + { + _logger.Info($"Created transfer, sending email..."); + + var message = new MessageSenderModel + { + Message = new EmailMessage + { + Id = Guid.NewGuid(), + EmailAddress = TiamConstClient.SystemEmailAddress, + Subject = $"[#{transfer.OrderId}][Tour I Am] New transfer in Budapest", + ContextId = transfer.Id, + ContextType = MessageContextType.Transfer, + SenderId = TiamConstClient.SysAccounts["SystemEmailSender"], + Text = EmailTemplateHelper.GenerateNewTransferEmail( + transfer.FullName, + transfer.FromAddress, + transfer.ToAddress, + transfer.Appointment.ToString(), + transfer.FullName, + transfer.PassengerCount.ToString(), + transfer.LuggageCount.ToString(), + Setting.BaseUrl, + transfer.Id.ToString()) + }, + MessageType = AyCode.Models.Enums.MessageTypesEnum.email + }; + + message.Message.Recipients.Add(new EmailRecipient(Guid.NewGuid(), transfer.UserId, message.Message.Id, transfer.ContactEmail)); + + foreach (var admin in TiamConstClient.SysAdmins) + { + var adminUser = _adminDal.GetUserById(admin, true); + message.Message.Recipients.Add(new EmailRecipient(Guid.NewGuid(), admin, message.Message.Id, adminUser.EmailAddress)); + } + + var result = await _messageSenderService.SendMessageAsync(message.Message, (int)message.MessageType); + await _adminDal.AddEmailMessageAsync(message.Message); + + _logger.Info("SendEmail result: " + result); } [Authorize] @@ -702,7 +578,7 @@ namespace TIAMWebApp.Server.Controllers return result; } - [NonAction] + [NonAction] [SignalR(SignalRTags.GetTransfersByOrderingProductId)] public async Task> GetTransfersByProductId(Guid productId) { @@ -743,7 +619,7 @@ namespace TIAMWebApp.Server.Controllers public async Task UpdateTransfer(Transfer transfer) { _logger.Info($"UpdateTransfer called! transferId: {transfer.Id}"); - + return await _adminDal.UpdateTransferAsync(transfer); } @@ -775,7 +651,7 @@ namespace TIAMWebApp.Server.Controllers public async Task RemoveTransfer(Transfer transfer) { _logger.Info($"RemoveTransfer called! transferId: {transfer.Id}"); - + var result = await _adminDal.RemoveTransferAsync(transfer); return result ? transfer : null; } diff --git a/TIAMWebApp/Shared/Models/ClientSide/UI/WizardModels/MessageWizardModel.cs b/TIAMWebApp/Shared/Models/ClientSide/UI/WizardModels/MessageWizardModel.cs index 7a565f9b..fb061e2e 100644 --- a/TIAMWebApp/Shared/Models/ClientSide/UI/WizardModels/MessageWizardModel.cs +++ b/TIAMWebApp/Shared/Models/ClientSide/UI/WizardModels/MessageWizardModel.cs @@ -1,4 +1,5 @@ -using System.ComponentModel.DataAnnotations; +using AyCode.Core.Enums; +using System.ComponentModel.DataAnnotations; using TIAM.Resources; namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels @@ -13,6 +14,8 @@ namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels public string SenderFullName { get; set; } public Guid SenderId { get; set; } public Guid ContextId { get; set; } + public MessageContextType ContextType { get; set; } + [Required(ErrorMessage = "The subject value should be specified.")] [DataType(DataType.Text)] [Display(Name = ResourceKeys.Subject, ResourceType = typeof(TIAMResources))] @@ -23,11 +26,12 @@ namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels public string Content { get; set; } public MessageWizardModel() { } - public MessageWizardModel(string receiverEmailAddress, string receiverFullName, Guid contextId, Guid receiverId, string senderEmailAddress, Guid senderId, string subject, string content) + public MessageWizardModel(string receiverEmailAddress, string receiverFullName, Guid contextId, MessageContextType contextType, Guid receiverId, string senderEmailAddress, Guid senderId, string subject, string content) { ReceiverEmailAddress = receiverEmailAddress; ReceiverFullName = receiverFullName; ContextId = contextId; + ContextType = contextType; ReceiverId = receiverId; SenderEmailAddress = senderEmailAddress; SenderId = senderId; diff --git a/TIAMWebApp/Shared/Models/ClientSide/UI/WizardModels/MessageWizardModelExtensions.cs b/TIAMWebApp/Shared/Models/ClientSide/UI/WizardModels/MessageWizardModelExtensions.cs index 9cd53c48..0832b7e3 100644 --- a/TIAMWebApp/Shared/Models/ClientSide/UI/WizardModels/MessageWizardModelExtensions.cs +++ b/TIAMWebApp/Shared/Models/ClientSide/UI/WizardModels/MessageWizardModelExtensions.cs @@ -27,19 +27,17 @@ namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels return new EmailMessage { Id = id, - SenderId = obj.SenderId, + SenderId = obj.SenderId, ContextId = obj.ContextId, + ContextType = obj.ContextType, Subject = obj.Subject, Text = obj.Content, EmailAddress = obj.SenderEmailAddress, - Recipients = new List { + Recipients = new List { new EmailRecipient( - Guid.NewGuid(), obj.ReceiverId, id, obj.ReceiverEmailAddress), - new EmailRecipient( - Guid.NewGuid(), Guid.Parse("4CBAED43-2465-4D99-84F1-C8BC6B7025F7"), id, "wsdservers@gmail.com") + Guid.NewGuid(), obj.ReceiverId, id, obj.ReceiverEmailAddress) } }; } - } }