general message, transfer edit fix, email sennding from admin

This commit is contained in:
Adam 2024-08-19 19:26:36 +02:00
parent ab695efb66
commit df7e7cf613
13 changed files with 389 additions and 312 deletions

View File

@ -22,6 +22,7 @@ public static class TiamConstClient
public static string NewTransferEmailTemplateName = "NewTransferEmailTemplate"; public static string NewTransferEmailTemplateName = "NewTransferEmailTemplate";
public static string TransferModifiedEmailTemplateName = "TramsferModifiedEmailTemplate"; public static string TransferModifiedEmailTemplateName = "TramsferModifiedEmailTemplate";
public static string ForgotPasswordEmailTemplateName = "ForgotPasswordEmailTemplate"; public static string ForgotPasswordEmailTemplateName = "ForgotPasswordEmailTemplate";
public static string GeneralEmailTemplateName = "GeneralEmailTemplate";
public static List<string> WelcomeEmailParameters = new List<string>() public static List<string> WelcomeEmailParameters = new List<string>()
{ {
@ -53,6 +54,15 @@ public static class TiamConstClient
"TransferId" "TransferId"
}; };
public static List<string> GeneralEmailParameters = new List<string>()
{
//string userName, string settingBaseUrl, string userId, string token
"UserName",
"MessageBody",
"SettingBaseUrl",
"UserId"
};
#if RELEASE #if RELEASE
public static string SystemEmailAddress = "system@touriam.com"; public static string SystemEmailAddress = "system@touriam.com";
public static LogLevel DefaultLogLevelClient = LogLevel.Debug; public static LogLevel DefaultLogLevelClient = LogLevel.Debug;

View File

@ -102,5 +102,20 @@ namespace TIAM.Services.Server
return EmailTemplateHelper.ReplacePlaceholders(template, placeholders); 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<string, string>
{
{ TiamConstClient.GeneralEmailParameters[0], userName },
{ TiamConstClient.GeneralEmailParameters[1], messageBody },
{ TiamConstClient.GeneralEmailParameters[2], settingBaseUrl },
{ TiamConstClient.GeneralEmailParameters[3], userId }
};
return EmailTemplateHelper.ReplacePlaceholders(template, placeholders);
}
} }
} }

View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Hello, {{UserName}}!</h1>
<p>You have received a message in the TourIam System: </p>
<p>{{MessageBody}}</p>
<hr/>
<p>You can check out your messages <a href="{{SettingBaseUrl}}/user/messages/{{UserId}}">here</a></p>
</body>
</html>

View File

@ -8,6 +8,7 @@
<ItemGroup> <ItemGroup>
<None Remove="EmbeddedResources\EmailTemplates\ForgotPasswordEmailTemplate.html" /> <None Remove="EmbeddedResources\EmailTemplates\ForgotPasswordEmailTemplate.html" />
<None Remove="EmbeddedResources\EmailTemplates\GeneralEmailTemplate.html" />
<None Remove="EmbeddedResources\EmailTemplates\NewTransferEmailTemplate.html" /> <None Remove="EmbeddedResources\EmailTemplates\NewTransferEmailTemplate.html" />
<None Remove="EmbeddedResources\EmailTemplates\TransferModifiedEmailTemplate.html" /> <None Remove="EmbeddedResources\EmailTemplates\TransferModifiedEmailTemplate.html" />
<None Remove="EmbeddedResources\EmailTemplates\WelcomeEmailTemplate.html" /> <None Remove="EmbeddedResources\EmailTemplates\WelcomeEmailTemplate.html" />
@ -23,6 +24,9 @@
<EmbeddedResource Include="EmbeddedResources\EmailTemplates\TransferModifiedEmailTemplate.html"> <EmbeddedResource Include="EmbeddedResources\EmailTemplates\TransferModifiedEmailTemplate.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="EmbeddedResources\EmailTemplates\GeneralEmailTemplate.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -27,12 +27,15 @@ namespace TIAM.Services.Server
public double GetTransferPrice(Product product, TransferDestination fromTransferDestination, TransferDestination toTransferDestination, in byte seatNumber) 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 baseDestination = product.Profile.AddressId == fromTransferDestination.AddressId ? toTransferDestination : fromTransferDestination;
var transferDestinationToProduct = adminDal.GetTransferDestinationToProduct(product.Id, baseDestination.Id); var transferDestinationToProduct = adminDal.GetTransferDestinationToProduct(product.Id, baseDestination.Id);
var tranferDestinationPrice = transferDestinationToProduct ?? baseDestination as ITransfeDestinationPrices; 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); var price = GetSeatNumberPrice(in tranferDestinationPrice, seatNumber) + tranferDestinationPrice.ProductCommis + GetExtraPrice(in fromTransferDestination);
//TODO: ExtraPrice - J. seatnum percent price, FirstName, LastName, CascadeDelete //TODO: ExtraPrice - J. seatnum percent price, FirstName, LastName, CascadeDelete

View File

@ -1,6 +1,7 @@
using TIAM.Entities.Transfers; using TIAM.Entities.Transfers;
using TIAM.Entities.Emails;
//using TIAM.Entities.TransferDestinations;
using TIAMWebApp.Shared.Application.Interfaces; using TIAMWebApp.Shared.Application.Interfaces;
using TIAMWebApp.Shared.Application.Models;
using TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels; using TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels;
namespace TIAMMobileApp.Services namespace TIAMMobileApp.Services
@ -8,29 +9,37 @@ namespace TIAMMobileApp.Services
public class WizardProcessor : IWizardProcessor public class WizardProcessor : IWizardProcessor
{ {
public ITransferDataService transferDataService { get; set; } public ITransferDataService TransferDataService { get; set; }
public IUserDataService userDataService { 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.TransferDataService = transferDataService;
this.userDataService = userDataService; this.UserDataService = userDataService;
this.MessageSenderService = messageSenderService;
} }
public async Task<TModelType?> ProcessWizardAsync<TModelType>(Type type, object data) where TModelType: class public async Task<TModelType?> ProcessWizardAsync<TModelType>(Type type, object data) where TModelType: class
{ {
switch (type.Name) switch (type.Name)
{ {
case "TransferDestinationWizardModel": case nameof(TransferDestinationWizardModel):
var result = await transferDataService.CreateTransferDestination((TransferDestination)data); var result = await TransferDataService.CreateTransferDestination((TransferDestination)data);
return result as TModelType; return result as TModelType;
//var a = new WizardProcessorResult<TransferDestination>(); case nameof(TransferWizardModel):
//a.Model = result; Console.WriteLine(@"TransferWizardModel");
//return a as TResult; var transferResult = await TransferDataService.CreateTransfer((TransferWizardModel)data);
return transferResult as TModelType;
case "ServiceProvider": case nameof(MessageWizardModel):
return null; 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: default:
return null; return null;
} }

View File

@ -2,6 +2,7 @@
@using AyCode.Core.Extensions @using AyCode.Core.Extensions
@using TIAM.Entities.Transfers @using TIAM.Entities.Transfers
@using TIAM.Resources @using TIAM.Resources
@using TIAMSharedUI.Shared.Components.BaseComponents
@using TIAMWebApp.Shared.Application.Interfaces @using TIAMWebApp.Shared.Application.Interfaces
@using AyCode.Services.Loggers @using AyCode.Services.Loggers
@using TIAM.Core.Enums @using TIAM.Core.Enums
@ -10,6 +11,7 @@
@using TIAMWebApp.Shared.Application.Utility @using TIAMWebApp.Shared.Application.Utility
@using TIAMSharedUI.Pages.User.SysAdmins @using TIAMSharedUI.Pages.User.SysAdmins
@using TIAMSharedUI.Pages.Components @using TIAMSharedUI.Pages.Components
@inherits BasePageComponent
@inject HttpClient Http @inject HttpClient Http
@inject NavigationManager navManager @inject NavigationManager navManager
@inject IEnumerable<IAcLogWriterClientBase> LogWriters @inject IEnumerable<IAcLogWriterClientBase> LogWriters
@ -19,6 +21,7 @@
@inject NavigationManager navigationManager @inject NavigationManager navigationManager
@inject IStringLocalizer<TIAMResources> localizer @inject IStringLocalizer<TIAMResources> localizer
@inject IWizardProcessor wizardProcessor @inject IWizardProcessor wizardProcessor
@inject AdminSignalRClient _adminSignalRClient
<PageTitle>Transfer details</PageTitle> <PageTitle>Transfer details</PageTitle>
<div class="text-center m-5"> <div class="text-center m-5">
@ -69,7 +72,7 @@ else
{ {
<div class="container mt-4"> <div class="container mt-4">
<DxTabs> <DxTabs>
<DxTabPage Text="Details"> <DxTabPage Visible="@displayCard" Text="Details">
@if (!_editMode) @if (!_editMode)
@ -238,12 +241,12 @@ else
} }
</DxTabPage> </DxTabPage>
<DxTabPage Text="Messages"> <DxTabPage Visible="@displayCard" Text="Messages">
<div style="margin-top: 10px; margin-bottom: 10px;"> <div style="margin-top: 10px; margin-bottom: 10px;">
<DxButton Click="() => SendMail(_transfer)" Text="Send a message" RenderStyle="ButtonRenderStyle.Primary" /> <DxButton Click="() => SendMail(_transfer)" Text="Send a message" RenderStyle="ButtonRenderStyle.Primary" />
</div> </div>
<MessageDetailGridComponent ContextId="transferId" IsSenderEmailVisible="false" IsMessageTextVisible="false"></MessageDetailGridComponent> <MessageDetailGridComponent ContextId="transferId" IsSenderEmailVisible="false" IsMessageTextVisible="false"></MessageDetailGridComponent>
</DxTabPage> </DxTabPage>
</DxTabs> </DxTabs>
</div> </div>
} }
@ -258,6 +261,8 @@ else
private LoggerClient<EditTransfers> _logger = null!; private LoggerClient<EditTransfers> _logger = null!;
private MessageWizardModel _messageWizardModel = new(); private MessageWizardModel _messageWizardModel = new();
private bool displayCard = true;
private bool _popupVisible; private bool _popupVisible;
public List<string> IgnoreList = public List<string> IgnoreList =
@ -361,6 +366,7 @@ else
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
foreach (var t in Enum.GetValues(typeof(TransferStatusType)).OfType<TransferStatusType>().ToList()) foreach (var t in Enum.GetValues(typeof(TransferStatusType)).OfType<TransferStatusType>().ToList())
_statusTypes.Add(t.ToString()); _statusTypes.Add(t.ToString());
@ -368,9 +374,35 @@ else
_logger.Info($"parameter: {transferId.ToString()}"); _logger.Info($"parameter: {transferId.ToString()}");
await LoadTransfer(); 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 try
{ {
var response = await transferDataService.GetTransferByIdAsync(transferId); //var response = await transferDataService.GetTransferByIdAsync(transferId);
var response = await _adminSignalRClient.GetTransferById(transferId);
if (response != null) if (response != null)
{ {

View File

@ -1,14 +1,24 @@
@page "/transfer" @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
@using TIAMSharedUI.Pages.Components.EditComponents @using TIAMSharedUI.Pages.Components.EditComponents
@using TIAMSharedUI.Shared @using TIAMSharedUI.Shared
@using TIAMSharedUI.Shared.Components.BaseComponents
@using TIAMWebApp.Shared.Application.Interfaces @using TIAMWebApp.Shared.Application.Interfaces
@using TIAMWebApp.Shared.Application.Models.ClientSide.UI @using TIAMWebApp.Shared.Application.Models.ClientSide.UI
@using TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels @using TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels
@using AyCode.Services.Loggers @using AyCode.Services.Loggers
@using TIAMWebApp.Shared.Application.Models.PageModels
@using TIAMWebApp.Shared.Application.Services
@inherits BasePageComponent
@inject NavigationManager navManager @inject NavigationManager navManager
@inject IAcLogWriterClientBase BrowserConsoleLogWriter @inject IAcLogWriterClientBase BrowserConsoleLogWriter
@inject IWizardProcessor WizardProcessor @inject IWizardProcessor WizardProcessor
@inject IUserDataService UserDataService
@inject AdminSignalRClient _adminSignalRClient
<PageTitle>Transfer</PageTitle> <PageTitle>Transfer</PageTitle>
<HeroSlider SliderItems="sliders" Height="30vh"></HeroSlider> <HeroSlider SliderItems="sliders" Height="30vh"></HeroSlider>
@ -113,13 +123,93 @@ new HeroSliderItem
public async Task SubmitForm(object Result) 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<UserModelDtoDetail>(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<TransferWizardModel>(Result.GetType(), Result); var transfer = await WizardProcessor.ProcessWizardAsync<TransferWizardModel>(Result.GetType(), Result);
BrowserConsoleLogWriter.Info($"Submitted nested form: {Result.GetType().FullName}"); BrowserConsoleLogWriter.Info($"Submitted nested form: {Result.GetType().FullName}");
navManager.NavigateTo("/transfer2/"+transfer.Id); navManager.NavigateTo($"/transfer2/{resModel.Id}");
} }
} }

View File

@ -1,5 +1,6 @@
@page "/sysadmin/transfers" @page "/sysadmin/transfers"
@using BlazorAnimation @using BlazorAnimation
@using TIAM.Core.Consts
@using TIAM.Core.Enums @using TIAM.Core.Enums
@using TIAM.Entities.Emails @using TIAM.Entities.Emails
@using TIAM.Entities.Transfers @using TIAM.Entities.Transfers
@ -250,19 +251,20 @@
"SenderFullName", "SenderFullName",
"SenderId", "SenderId",
"ContextId", "ContextId",
"ContextType"
]; ];
private static readonly List<TransferStatusModel> Statuses = private static readonly List<TransferStatusModel> Statuses =
[ [
new(Convert.ToByte(TransferStatusType.OrderSubmitted), "Order submitted"), new(Convert.ToByte(TransferStatusType.OrderSubmitted), "Order submitted"),
new(Convert.ToByte(TransferStatusType.OrderConfirmed), "Order confirmed"), new(Convert.ToByte(TransferStatusType.OrderConfirmed), "Order confirmed"),
new(Convert.ToByte(TransferStatusType.AssignedToDriver), "Assigned to driver"), new(Convert.ToByte(TransferStatusType.AssignedToDriver), "Assigned to driver"),
new(Convert.ToByte(TransferStatusType.DriverConfirmed), "Driver confirmed"), new(Convert.ToByte(TransferStatusType.DriverConfirmed), "Driver confirmed"),
new(Convert.ToByte(TransferStatusType.DriverEnRoute), "Driver enroute"), new(Convert.ToByte(TransferStatusType.DriverEnRoute), "Driver enroute"),
new(Convert.ToByte(TransferStatusType.PassengerPickup), "Passenger in car"), new(Convert.ToByte(TransferStatusType.PassengerPickup), "Passenger in car"),
new(Convert.ToByte(TransferStatusType.Finished), "Finished"), new(Convert.ToByte(TransferStatusType.Finished), "Finished"),
new(Convert.ToByte(TransferStatusType.UserCanceled), "User cancelled"), new(Convert.ToByte(TransferStatusType.UserCanceled), "User cancelled"),
new(Convert.ToByte(TransferStatusType.AdminDenied), "Admin cancelled") new(Convert.ToByte(TransferStatusType.AdminDenied), "Admin cancelled")
]; ];
private static List<TransferStatusModel> _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(); private static List<TransferStatusModel> _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) 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.ReceiverId = item.UserId;
_messageWizardModel.ContextId = item.Id; _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.ReceiverEmailAddress = item.ContactEmail;
_messageWizardModel.ReceiverFullName = item.FullName; _messageWizardModel.ReceiverFullName = item.FullName;
_popupVisible = true; _popupVisible = true;
@ -311,28 +315,11 @@
public async Task SubmitForm(object result) public async Task SubmitForm(object result)
{ {
var messageModel = (result as MessageWizardModel)!; var messageModel = (result as MessageWizardModel)!;
messageModel.ContextId = _messageWizardModel.ContextId;
//messageModel.SenderId = sessionService.User.UserId;
string FormatEmailContent()
{
return $@"
<html>
<body>
<p>Dear {messageModel.SenderFullName},</p>
<p>{messageModel.Content}:</p>
<p>Best regards,<br/>Tour I Am team</p>
</body>
</html>";
}
messageModel.Content = FormatEmailContent();
_logger.Info(messageModel.Content); _logger.Info(messageModel.Content);
var email = await wizardProcessor.ProcessWizardAsync<MessageWizardModel>(result.GetType(), messageModel); var email = await wizardProcessor.ProcessWizardAsync<MessageWizardModel>(result.GetType(), messageModel);
_logger.Info($"Submitted nested form: {result.GetType().FullName}"); _logger.Info($"Submitted nested form: {result.GetType().FullName}");
CancelCreateClick();
} }
void Grid_CustomizeElement(GridCustomizeElementEventArgs e) void Grid_CustomizeElement(GridCustomizeElementEventArgs e)

View File

@ -16,6 +16,9 @@ using TIAM.Entities.Products;
using AyCode.Core.Consts; using AyCode.Core.Consts;
using AyCode.Core; using AyCode.Core;
using TIAM.Core.Consts; using TIAM.Core.Consts;
using TIAM.Entities.Users;
using TIAM.Services.Server;
using TIAMWebApp.Shared.Application.Models.ClientSide;
namespace TIAMWebApp.Server.Controllers namespace TIAMWebApp.Server.Controllers
{ {
@ -48,6 +51,23 @@ namespace TIAMWebApp.Server.Controllers
{ {
_logger.Debug($"SendEmail called!"); _logger.Debug($"SendEmail called!");
var message = JObject.Parse(serializedMessageSenderModel.GetRawText()).ToObject<MessageSenderModel<EmailMessage>>(); var message = JObject.Parse(serializedMessageSenderModel.GetRawText()).ToObject<MessageSenderModel<EmailMessage>>();
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"); if (message == null) return BadRequest("Invalid request");
@ -58,6 +78,21 @@ namespace TIAMWebApp.Server.Controllers
var messageElement = message.Message; var messageElement = message.Message;
_logger.Debug(message.Message.Subject); _logger.Debug(message.Message.Subject);
messageElement.EmailAddress = TiamConstClient.SystemEmailAddress; 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); await _adminDal.AddEmailMessageAsync(messageElement);
var result = await _messageSenderService.SendMessageAsync(messageElement, (int)message.MessageType); var result = await _messageSenderService.SendMessageAsync(messageElement, (int)message.MessageType);
//_adminDal.AddEmailMessageAsync((TIAM.Entities.Emails.EmailMessage)SerializedMessageSenderModel.Message); //_adminDal.AddEmailMessageAsync((TIAM.Entities.Emails.EmailMessage)SerializedMessageSenderModel.Message);

View File

@ -153,7 +153,7 @@ namespace TIAMWebApp.Server.Controllers
return result ? transferDestination : null; return result ? transferDestination : null;
} }
//[AllowAnonymous] //[AllowAnonymous]
//[HttpPost] //[HttpPost]
@ -379,289 +379,165 @@ namespace TIAMWebApp.Server.Controllers
public async Task<Transfer?> AddTransfer(Transfer transfer) public async Task<Transfer?> AddTransfer(Transfer transfer)
{ {
_logger.Info(@"CreateTransfer via SignalR called!"); _logger.Info(@"CreateTransfer via SignalR called!");
if (transfer != null)
{
var id = Guid.NewGuid(); if (transfer == null || string.IsNullOrEmpty(transfer.FromAddress) || string.IsNullOrEmpty(transfer.ToAddress))
//TransferDestination transferDestination = new TransferDestination(id, transferDestinationModel.Name, transferDestinationModel.Description, transferDestinationModel.AddressString); {
return null;
}
await ProcessTransferAsync(transfer);
await SendTransferEmailAsync(transfer);
if (string.IsNullOrEmpty(transfer.FromAddress) || string.IsNullOrEmpty(transfer.ToAddress)) return transfer;
{
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<EmailMessage>();
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 $@"
<html>
<body>
<p>Dear {transfer.FullName},</p>
<p>We are pleased to inform you that a transfer order has been placed. Below are the details of the transfer:</p>
<p>{transfer.FromAddress} - {transfer.ToAddress}</p>
<p>{transfer.Appointment}</p>
<p>{transfer.FullName}</p>
<p>{transfer.PassengerCount}</p>
<p>Please confirm the transfer by clicking on the following link:</p>
<p><a href=""{Setting.BaseUrl}/mytransfers/{transfer.Id}"">Confirm Transfer</a></p>
<p>If you did not request this transfer, please disregard this email.</p>
<p>Thank you,<br/>Tour I Am team</p>
</body>
</html>";
}
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;
}
} }
[AllowAnonymous] [AllowAnonymous]
[HttpPost] [HttpPost]
[Route(APIUrls.CreateTransferRouteName)] [Route(APIUrls.CreateTransferRouteName)]
public async Task<IActionResult> CreateTransfer([FromBody] JsonElement serializedTransferModel) public async Task<IActionResult> CreateTransfer([FromBody] JsonElement serializedTransferModel)
{ {
_logger.Info(@"CreateTransfer called!"); _logger.Info(@"CreateTransfer called!");
if (string.IsNullOrEmpty(serializedTransferModel.GetRawText())) 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<Transfer>(); return BadRequest("Invalid request");
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<EmailMessage>();
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");
}
} }
await ProcessTransferAsync(transfer);
await SendTransferEmailAsync(transfer);
return Ok(transfer);
} }
[AllowAnonymous] [AllowAnonymous]
[HttpPost] [HttpPost]
[Route(APIUrls.CreateTransfersRouteName)] [Route(APIUrls.CreateTransfersRouteName)]
public async Task<IActionResult> CreateTransfers([FromBody] JsonElement serializedTransferList) public async Task<IActionResult> CreateTransfers([FromBody] JsonElement serializedTransferList)
{ {
_logger.Info(@"CreateTransfers called!"); _logger.Info(@"CreateTransfers called!");
if (string.IsNullOrEmpty(serializedTransferList.GetRawText())) 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<Transfer>();
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<Transfer>();
}
// Helper method to deserialize a list of transfers
[NonAction]
private List<Transfer>? DeserializeTransfers(JsonElement serializedTransferList)
{
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
return JsonConvert.DeserializeObject<List<Transfer>>(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() transfer.Revenue = _transferBackendService.GetCommission((Guid)transfer.ProductId, (double)transfer.Price, to);
};
List<Transfer>? transfers = JsonConvert.DeserializeObject<List<Transfer>>(serializedTransferList.GetRawText(), settings);
//List<Transfer>? transfers = JObject.Parse(serializedTransferModel.GetRawText()).ToObject<List<Transfer>>();
List<Transfer> createdTransfers = new List<Transfer>();
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<EmailMessage>();
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);
} }
else 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<EmailMessage>
{
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] [Authorize]
@ -702,7 +578,7 @@ namespace TIAMWebApp.Server.Controllers
return result; return result;
} }
[NonAction] [NonAction]
[SignalR(SignalRTags.GetTransfersByOrderingProductId)] [SignalR(SignalRTags.GetTransfersByOrderingProductId)]
public async Task<List<Transfer>> GetTransfersByProductId(Guid productId) public async Task<List<Transfer>> GetTransfersByProductId(Guid productId)
{ {
@ -743,7 +619,7 @@ namespace TIAMWebApp.Server.Controllers
public async Task<Transfer?> UpdateTransfer(Transfer transfer) public async Task<Transfer?> UpdateTransfer(Transfer transfer)
{ {
_logger.Info($"UpdateTransfer called! transferId: {transfer.Id}"); _logger.Info($"UpdateTransfer called! transferId: {transfer.Id}");
return await _adminDal.UpdateTransferAsync(transfer); return await _adminDal.UpdateTransferAsync(transfer);
} }
@ -775,7 +651,7 @@ namespace TIAMWebApp.Server.Controllers
public async Task<Transfer?> RemoveTransfer(Transfer transfer) public async Task<Transfer?> RemoveTransfer(Transfer transfer)
{ {
_logger.Info($"RemoveTransfer called! transferId: {transfer.Id}"); _logger.Info($"RemoveTransfer called! transferId: {transfer.Id}");
var result = await _adminDal.RemoveTransferAsync(transfer); var result = await _adminDal.RemoveTransferAsync(transfer);
return result ? transfer : null; return result ? transfer : null;
} }

View File

@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations; using AyCode.Core.Enums;
using System.ComponentModel.DataAnnotations;
using TIAM.Resources; using TIAM.Resources;
namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels 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 string SenderFullName { get; set; }
public Guid SenderId { get; set; } public Guid SenderId { get; set; }
public Guid ContextId { get; set; } public Guid ContextId { get; set; }
public MessageContextType ContextType { get; set; }
[Required(ErrorMessage = "The subject value should be specified.")] [Required(ErrorMessage = "The subject value should be specified.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Display(Name = ResourceKeys.Subject, ResourceType = typeof(TIAMResources))] [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 string Content { get; set; }
public MessageWizardModel() { } 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; ReceiverEmailAddress = receiverEmailAddress;
ReceiverFullName = receiverFullName; ReceiverFullName = receiverFullName;
ContextId = contextId; ContextId = contextId;
ContextType = contextType;
ReceiverId = receiverId; ReceiverId = receiverId;
SenderEmailAddress = senderEmailAddress; SenderEmailAddress = senderEmailAddress;
SenderId = senderId; SenderId = senderId;

View File

@ -27,19 +27,17 @@ namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels
return new EmailMessage return new EmailMessage
{ {
Id = id, Id = id,
SenderId = obj.SenderId, SenderId = obj.SenderId,
ContextId = obj.ContextId, ContextId = obj.ContextId,
ContextType = obj.ContextType,
Subject = obj.Subject, Subject = obj.Subject,
Text = obj.Content, Text = obj.Content,
EmailAddress = obj.SenderEmailAddress, EmailAddress = obj.SenderEmailAddress,
Recipients = new List<EmailRecipient> { Recipients = new List<EmailRecipient> {
new EmailRecipient( new EmailRecipient(
Guid.NewGuid(), obj.ReceiverId, id, obj.ReceiverEmailAddress), Guid.NewGuid(), obj.ReceiverId, id, obj.ReceiverEmailAddress)
new EmailRecipient(
Guid.NewGuid(), Guid.Parse("4CBAED43-2465-4D99-84F1-C8BC6B7025F7"), id, "wsdservers@gmail.com")
} }
}; };
} }
} }
} }