This commit is contained in:
Loretta 2024-08-19 19:38:27 +02:00
commit b421cae621
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 TransferModifiedEmailTemplateName = "TramsferModifiedEmailTemplate";
public static string ForgotPasswordEmailTemplateName = "ForgotPasswordEmailTemplate";
public static string GeneralEmailTemplateName = "GeneralEmailTemplate";
public static List<string> WelcomeEmailParameters = new List<string>()
{
@ -53,6 +54,15 @@ public static class TiamConstClient
"TransferId"
};
public static List<string> GeneralEmailParameters = new List<string>()
{
//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;

View File

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

View File

@ -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

View File

@ -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<TModelType?> ProcessWizardAsync<TModelType>(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<TransferDestination>();
//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;
}

View File

@ -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<IAcLogWriterClientBase> LogWriters
@ -19,6 +21,7 @@
@inject NavigationManager navigationManager
@inject IStringLocalizer<TIAMResources> localizer
@inject IWizardProcessor wizardProcessor
@inject AdminSignalRClient _adminSignalRClient
<PageTitle>Transfer details</PageTitle>
<div class="text-center m-5">
@ -69,7 +72,7 @@ else
{
<div class="container mt-4">
<DxTabs>
<DxTabPage Text="Details">
<DxTabPage Visible="@displayCard" Text="Details">
@if (!_editMode)
@ -238,7 +241,7 @@ else
}
</DxTabPage>
<DxTabPage Text="Messages">
<DxTabPage Visible="@displayCard" Text="Messages">
<div style="margin-top: 10px; margin-bottom: 10px;">
<DxButton Click="() => SendMail(_transfer)" Text="Send a message" RenderStyle="ButtonRenderStyle.Primary" />
</div>
@ -258,6 +261,8 @@ else
private LoggerClient<EditTransfers> _logger = null!;
private MessageWizardModel _messageWizardModel = new();
private bool displayCard = true;
private bool _popupVisible;
public List<string> IgnoreList =
@ -361,6 +366,7 @@ else
protected override async Task OnInitializedAsync()
{
foreach (var t in Enum.GetValues(typeof(TransferStatusType)).OfType<TransferStatusType>().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())
{
//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)
{

View File

@ -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
<PageTitle>Transfer</PageTitle>
<HeroSlider SliderItems="sliders" Height="30vh"></HeroSlider>
@ -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<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);
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"
@using BlazorAnimation
@using TIAM.Core.Consts
@using TIAM.Core.Enums
@using TIAM.Entities.Emails
@using TIAM.Entities.Transfers
@ -250,6 +251,7 @@
"SenderFullName",
"SenderId",
"ContextId",
"ContextType"
];
private static readonly List<TransferStatusModel> Statuses =
@ -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;
@ -312,27 +316,10 @@
public async Task SubmitForm(object result)
{
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);
var email = await wizardProcessor.ProcessWizardAsync<MessageWizardModel>(result.GetType(), messageModel);
_logger.Info($"Submitted nested form: {result.GetType().FullName}");
CancelCreateClick();
}
void Grid_CustomizeElement(GridCustomizeElementEventArgs e)

View File

@ -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<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");
@ -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);

View File

@ -381,102 +381,16 @@ namespace TIAMWebApp.Server.Controllers
{
_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 (string.IsNullOrEmpty(transfer.FromAddress) || string.IsNullOrEmpty(transfer.ToAddress))
if (transfer == null || 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<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);
await ProcessTransferAsync(transfer);
await SendTransferEmailAsync(transfer);
return transfer;
}
}
else
{
return null;
}
}
[AllowAnonymous]
[HttpPost]
@ -484,43 +398,85 @@ namespace TIAMWebApp.Server.Controllers
public async Task<IActionResult> CreateTransfer([FromBody] JsonElement serializedTransferModel)
{
_logger.Info(@"CreateTransfer called!");
if (string.IsNullOrEmpty(serializedTransferModel.GetRawText()))
{
return BadRequest("SerializedTramsferDestinationWizardModel is required");
return BadRequest("SerializedTransferModel is required");
}
else
{
Transfer? transfer = JObject.Parse(serializedTransferModel.GetRawText()).ToObject<Transfer>();
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))
var transfer = DeserializeTransfer(serializedTransferModel);
if (transfer == null || 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}");
await ProcessTransferAsync(transfer);
await SendTransferEmailAsync(transfer);
return Ok(transfer);
}
[AllowAnonymous]
[HttpPost]
[Route(APIUrls.CreateTransfersRouteName)]
public async Task<IActionResult> CreateTransfers([FromBody] JsonElement serializedTransferList)
{
_logger.Info(@"CreateTransfers called!");
if (string.IsNullOrEmpty(serializedTransferList.GetRawText()))
{
return BadRequest("SerializedTransferList is required");
}
var transfers = DeserializeTransfers(serializedTransferList);
if (transfers == null || !transfers.Any())
{
return BadRequest("Invalid request");
}
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);
Product? product = null;
//TODO
if (!transfer.ProductId.IsNullOrEmpty())
{
product = await _adminDal.GetProductByIdAsync((Guid)transfer.ProductId);
var 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)
if (transfer.Price.HasValue && transfer.Price > 0)
{
transfer.Revenue = _transferBackendService.GetCommission((Guid)transfer.ProductId, (double)transfer.Price, to);
}
@ -531,27 +487,33 @@ namespace TIAMWebApp.Server.Controllers
}
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(
// 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,
@ -560,111 +522,25 @@ namespace TIAMWebApp.Server.Controllers
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");
}
}
}
[AllowAnonymous]
[HttpPost]
[Route(APIUrls.CreateTransfersRouteName)]
public async Task<IActionResult> CreateTransfers([FromBody] JsonElement serializedTransferList)
{
_logger.Info(@"CreateTransfers called!");
if (string.IsNullOrEmpty(serializedTransferList.GetRawText()))
{
return BadRequest("SerializedTramsferDestinationWizardModel is required");
}
else
{
_logger.Info($@"Serialized model: {serializedTransferList.GetRawText()}");
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
transfer.Id.ToString())
},
MessageType = AyCode.Models.Enums.MessageTypesEnum.email
};
List<Transfer>? transfers = JsonConvert.DeserializeObject<List<Transfer>>(serializedTransferList.GetRawText(), settings);
message.Message.Recipients.Add(new EmailRecipient(Guid.NewGuid(), transfer.UserId, message.Message.Id, transfer.ContactEmail));
//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);
var result = await _messageSenderService.SendMessageAsync(message.Message, (int)message.MessageType);
await _adminDal.AddEmailMessageAsync(message.Message);
_logger.Info("SendEmail result: " + result);
}
return Ok(createdTransfers);
}
else
{
return BadRequest("Invalid request");
}
}
}
[Authorize]
[HttpGet]
[Route(APIUrls.GetTransfersRouteName)]

View File

@ -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;

View File

@ -29,17 +29,15 @@ namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels
Id = id,
SenderId = obj.SenderId,
ContextId = obj.ContextId,
ContextType = obj.ContextType,
Subject = obj.Subject,
Text = obj.Content,
EmailAddress = obj.SenderEmailAddress,
Recipients = new List<EmailRecipient> {
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)
}
};
}
}
}