EmailMessages improvements, fixes, etc...

This commit is contained in:
Loretta 2024-08-15 18:45:36 +02:00
parent 9af295d5ba
commit bb9d576a05
7 changed files with 344 additions and 292 deletions

View File

@ -614,7 +614,7 @@ namespace TIAM.Database.Test
var userId = Guid.Parse(userIdUserProductMappingIdString[0]);
var userProductMappingId = Guid.Parse(userIdUserProductMappingIdString[1]);
var emailMessages = await Dal.GetEmailMessagesAsync(userId, userProductMappingId);
var emailMessages = await Dal.GetEmailMessagesByUserIdOrUpmId(userId, userProductMappingId);
Assert.IsNotNull(emailMessages);

View File

@ -318,10 +318,28 @@ namespace TIAM.Database.DataLayers.Admins
public Task<List<EmailMessage>> GetEmailMessagesByContextIdAsync(Guid contextId) => SessionAsync(ctx => ctx.GetEmailMessagesByContextId(contextId).OrderByDescending(x => x.Created).ToList());
public Task<List<EmailMessage>> GetEmailMessagesBySenderIdAsync(Guid senderId) => SessionAsync(ctx => ctx.GetEmailMessagesBySenderId(senderId).OrderByDescending(x => x.Created).ToList());
public Task<List<EmailMessage>> GetEmailMessagesBySenderEmailAddressAsync(string emailAddress) => SessionAsync(ctx => ctx.GetEmailMessagesBySenderEmailAddress(emailAddress).OrderByDescending(x => x.Created).ToList());
public Task<List<EmailMessage>> GetEmailMessagesAsync(Guid userId, Guid userProductMappingId) => SessionAsync(ctx => ctx.GetEmailMessages<EmailMessage, EmailRecipient>(userId, userProductMappingId).OrderByDescending(x => x.Created).ToList());
public Task<List<EmailMessage>> GetEmailMessagesByUserIdOrUpmId(Guid userId, Guid userProductMappingId) => SessionAsync(ctx => ctx.GetEmailMessagesByUserIdOrUpmId<EmailMessage, EmailRecipient>(userId, userProductMappingId).OrderByDescending(x => x.Created).ToList());
public Task<List<EmailMessage>> GetEmailMessagesAsync(Guid contextId, Guid userId, Guid userProductMappingId) => SessionAsync(ctx => ctx.GetEmailMessages<EmailMessage, EmailRecipient>(contextId, userId, userProductMappingId).OrderByDescending(x => x.Created).ToList());
public Task<List<EmailMessage>> GetAllEmailMessagesAsync() => SessionAsync(ctx => ctx.GetAllEmailMessages<EmailMessage, EmailRecipient>().OrderByDescending(x => x.Created).ToList());
/// <summary>
///
/// </summary>
/// <param name="driverId">UserProductMappingId</param>
/// <returns></returns>
public Task<List<EmailMessage>> GetTransfersMessagesByDriverIdAsync(Guid driverId) => SessionAsync(ctx =>
{
//TODO: Az upm.UserId elvben nem kell, csak amíg ne fix a db! semmilyen gondot nem okoz... - J.
var upm = ctx.GetUserProductMappingById(driverId);
if (upm == null) return [];
//return ctx.GetEmailMessages<EmailMessage, EmailRecipient>(driverId) //TODO: jövőben elég lesz a driverId is és mehet vissza ez a sor! - J.
return ctx.GetEmailMessagesByUserIdOrUpmId<EmailMessage, EmailRecipient>(upm.UserId, driverId)
.Where(emailMessage => ctx.TransferToDrivers.Any(transferToDriver => transferToDriver.TransferId == emailMessage.ContextId && transferToDriver.UserProductMappingId == driverId))
.OrderByDescending(x => x.Created)
.ToList();
});
public Task<bool> AddEmailMessageAsync(EmailMessage emailMessage)
=> TransactionAsync(ctx => ctx.AddEmailMessage(emailMessage));

View File

@ -75,6 +75,10 @@ public class SignalRTags : AcSignalRTags
public const int GetMessagesByContextId = 60;
public const int GetAllMessages = 61;
/// <summary>
/// UserPropductMappingId
/// </summary>
public const int GetTransfersMessagesByDriverId = 62;
public const int CreateMessage = 63;
public const int UpdateMessage = 64;
public const int DeleteMessage = 65;

View File

@ -52,7 +52,7 @@
</FooterContentTemplate>
</DxPopup>
@if (isLoading)
@if (_isLoading)
{
<div class="text-center m-5">
<DxWaitIndicator Visible="true"
@ -61,9 +61,9 @@
</div>
}
else if (!string.IsNullOrEmpty(errorMessage))
else if (!string.IsNullOrEmpty(_errorMessage))
{
<div class="alert alert-danger">@errorMessage</div>
<div class="alert alert-danger">@_errorMessage</div>
}
else
{
@ -72,7 +72,7 @@ else
<DxTabPage Text="Details">
@if (!editMode)
@if (!_editMode)
{
<section>
<div class="container py-4">
@ -82,23 +82,23 @@ else
<div class="card-header py-3 px-4">
<div class="d-flex justify-content-between align-items-center">
<div>
<span class="fw-bold text-body">Transfer identifier: @transfer.Id</span>
<p class="text-muted mb-0">@transfer.ContactPhone</p>
<span class="fw-bold text-body">Transfer identifier: @_transfer.Id</span>
<p class="text-muted mb-0">@_transfer.ContactPhone</p>
</div>
</div>
</div>
<div class="card-body p-4">
<div class="mb-4 pb-2">
<div class="mb-3">
<h4 class="fw-bold">Passenger: @transfer.FullName</h4>
<h4 class="fw-bold">E-mail address: @transfer.ContactEmail</h4>
<h5 class="text-muted">From: @transfer.FromAddress</h5>
<h5 class="text-muted">To: @transfer.ToAddress</h5>
<h5>@transfer.Appointment.ToString("MMMM dd, yyyy")</h5>
<h5 class="mb-3 text-muted">@transfer.Appointment.ToString("hh:mm tt")</h5>
<p>Passengers: @transfer.PassengerCount</p>
<p>Luggage: @transfer.LuggageCount</p>
<p>Flight number (optional): @transfer.FlightNumber</p>
<h4 class="fw-bold">Passenger: @_transfer.FullName</h4>
<h4 class="fw-bold">E-mail address: @_transfer.ContactEmail</h4>
<h5 class="text-muted">From: @_transfer.FromAddress</h5>
<h5 class="text-muted">To: @_transfer.ToAddress</h5>
<h5>@_transfer.Appointment.ToString("MMMM dd, yyyy")</h5>
<h5 class="mb-3 text-muted">@_transfer.Appointment.ToString("hh:mm tt")</h5>
<p>Passengers: @_transfer.PassengerCount</p>
<p>Luggage: @_transfer.LuggageCount</p>
<p>Flight number (optional): @_transfer.FlightNumber</p>
<hr />
<h3>License plate: POX-382</h3>
<p class="text-muted">Car looks: Silver, Toyota, Prius</p>
@ -107,7 +107,7 @@ else
</div>
</div>
<div class="d-flex justify-content-between align-items-center">
<h4>EUR @transfer.Price <span class="small text-muted"> </span></h4>
<h4>EUR @_transfer.Price <span class="small text-muted"> </span></h4>
</div>
</div>
<div class="card-footer p-4">
@ -142,10 +142,10 @@ else
<div class="card-header py-2 px-4">
<div class="d-flex justify-content-between align-items-center">
<div>
<span class="fw-bold text-body">Transfer identifier: @transfer.Id</span>
<span class="fw-bold text-body">Transfer identifier: @_transfer.Id</span>
<p class="text-muted">
<DxFormLayoutItem ColSpanLg="12" CssClass="form-field dxbl-col-12" Caption="Contact Phone">
<DxTextBox @bind-Text="transfer.ContactPhone" />
<DxTextBox @bind-Text="_transfer.ContactPhone" />
</DxFormLayoutItem>
</p>
</div>
@ -159,41 +159,41 @@ else
<div class="flex-fill">
<DxFormLayoutItem ColSpanLg="6" CssClass="form-field" Caption="First Name">
<DxTextBox @bind-Text="transfer.FirstName" />
<DxTextBox @bind-Text="_transfer.FirstName" />
</DxFormLayoutItem>
<DxFormLayoutItem ColSpanLg="6" CssClass="form-field" Caption="Last Name">
<DxTextBox @bind-Text="transfer.LastName" />
<DxTextBox @bind-Text="_transfer.LastName" />
</DxFormLayoutItem>
<DxFormLayoutItem ColSpanLg="12" CssClass="form-field" Caption="Contact Email">
<DxTextBox @bind-Text="transfer.ContactEmail" />
<DxTextBox @bind-Text="_transfer.ContactEmail" />
</DxFormLayoutItem>
<DxFormLayoutItem ColSpanLg="12" CssClass="form-field" Caption="From Address">
<DxTextBox @bind-Text="transfer.FromAddress" />
<DxTextBox @bind-Text="_transfer.FromAddress" />
</DxFormLayoutItem>
<DxFormLayoutItem ColSpanLg="12" CssClass="form-field" Caption="To Address">
<DxTextBox @bind-Text="transfer.ToAddress" />
<DxTextBox @bind-Text="_transfer.ToAddress" />
</DxFormLayoutItem>
<DxFormLayoutItem ColSpanLg="12" CssClass="form-field" Caption="Appointment">
<DxDateEdit TimeSectionVisible="true" @bind-Date="transfer.Appointment" />
<DxDateEdit TimeSectionVisible="true" @bind-Date="_transfer.Appointment" />
</DxFormLayoutItem>
<DxFormLayoutItem ColSpanLg="12" CssClass="form-field" Caption="Passenger Count">
<DxSpinEdit @bind-Value="transfer.PassengerCount" />
<DxSpinEdit @bind-Value="_transfer.PassengerCount" />
</DxFormLayoutItem>
<DxFormLayoutItem ColSpanLg="12" CssClass="form-field" Caption="Luggage Count">
<DxSpinEdit @bind-Value="transfer.LuggageCount" />
<DxSpinEdit @bind-Value="_transfer.LuggageCount" />
</DxFormLayoutItem>
<DxFormLayoutItem ColSpanLg="12" CssClass="form-field" Caption="Flight Number">
<DxTextBox @bind-Text="transfer.FlightNumber" />
<DxTextBox @bind-Text="_transfer.FlightNumber" />
</DxFormLayoutItem>
<hr />
@ -216,11 +216,11 @@ else
</ul-->
<div class="d-flex flex-row mb-4 pb-2">
<h4> EUR @transfer.Price <span class="small text-muted"> via (COD) </span></h4>
<h4> EUR @_transfer.Price <span class="small text-muted"> via (COD) </span></h4>
</div>
<div class="d-flex flex-row mb-4 pb-2">
<DxFormLayoutItem ColSpanLg="12" CssClass="form-field" Caption="Comment">
<DxMemo @bind-Text="transfer.Comment" />
<DxMemo @bind-Text="_transfer.Comment" />
</DxFormLayoutItem>
</div>
</div>
@ -239,26 +239,27 @@ else
</DxTabPage>
<DxTabPage Text="Messages">
<MessageDetailGridComponent ContextId="transferId" IsSenderEmailVisible="false" IsSubjectVisible="false"></MessageDetailGridComponent>
<DxButton Click="() => SendMail(transfer)" Text="Send a message" RenderStyle="ButtonRenderStyle.Primary" />
<div style="margin-top: 10px; margin-bottom: 10px;">
<DxButton Click="() => SendMail(_transfer)" Text="Send a message" RenderStyle="ButtonRenderStyle.Primary" />
</div>
<MessageDetailGridComponent ContextId="transferId" IsSenderEmailVisible="false" IsMessageTextVisible="false"></MessageDetailGridComponent>
</DxTabPage>
</DxTabs>
</div>
}
@code {
[Parameter]
public Guid transferId { get; set; } = Guid.Empty;
[Parameter] public Guid transferId { get; set; } = Guid.Empty;
private Transfer transfer = new Transfer();
private bool isLoading = true;
private string errorMessage = string.Empty;
private LoggerClient<EditTransfers> _logger;
private Transfer _transfer = new Transfer();
private bool _isLoading = true;
private string _errorMessage = string.Empty;
private LoggerClient<EditTransfers> _logger = null!;
private MessageWizardModel _messageWizardModel = new();
private bool _popupVisible;
public List<string> IgnoreList =
[
"ReceiverEmailAddress",
@ -270,8 +271,8 @@ else
"ContextId",
];
List<string> StatusTypes = new List<string>();
private bool editMode = false;
private bool _editMode = false;
private readonly List<string> _statusTypes = [];
void SendMail(Transfer item)
{
@ -331,19 +332,19 @@ else
private async Task Pay()
{
if (transfer != null)
if (_transfer != null)
{
string paymentId = "";
if(transfer.PaymentId!=null)
var paymentId = "";
if (_transfer.PaymentId != null)
{
//if we have already
paymentId = transfer.PaymentId;
paymentId = _transfer.PaymentId;
}
else
{
//if we have no paymentId yet
paymentId = await SumUpService.CreatePaymentAsync(transfer);
transfer.PaymentId = paymentId;
paymentId = await SumUpService.CreatePaymentAsync(_transfer);
_transfer.PaymentId = paymentId;
//and save it to Db
var resultTransfer = await UpdateTransfer(false);
if (resultTransfer.PaymentId != null)
@ -351,7 +352,8 @@ else
_logger.Debug("Added paymentId to Db: " + resultTransfer.PaymentId);
}
}
string checkoutUrl = "sumuppayment/" + paymentId;
var checkoutUrl = "sumuppayment/" + paymentId;
Console.WriteLine($"Payment Link: {paymentId}");
navigationManager.NavigateTo(checkoutUrl);
}
@ -360,15 +362,15 @@ else
protected override async Task OnInitializedAsync()
{
foreach (var t in Enum.GetValues(typeof(TransferStatusType)).OfType<TransferStatusType>().ToList())
StatusTypes.Add(t.ToString());
_statusTypes.Add(t.ToString());
_logger = new LoggerClient<EditTransfers>(LogWriters.ToArray());
_logger.Info($"parameter: {transferId.ToString()}");
await LoadTransfer();
if(transfer.UserId.IsNullOrEmpty())
if (_transfer.UserId.IsNullOrEmpty())
{
await UserDataService.SetEmailConfirmed(transfer.UserId);
await UserDataService.SetEmailConfirmed(_transfer.UserId);
}
}
@ -380,7 +382,7 @@ else
private void SetEditMode()
{
editMode = true;
_editMode = true;
}
private async Task LoadTransfer()
@ -391,19 +393,20 @@ else
if (response != null)
{
transfer = response;
_transfer = response;
}
else
{
errorMessage = $"Error loading transfer: {transfer.Id}";
_errorMessage = $"Error loading transfer: {_transfer.Id}";
}
}
catch (Exception ex)
{
errorMessage = $"Exception: {ex.Message}";
_errorMessage = $"Exception: {ex.Message}";
}
isLoading = false;
_isLoading = false;
}
private async Task UpdateTransferEventHandler(MouseEventArgs e, bool shouldRedirect = false)
@ -413,25 +416,26 @@ else
navManager.NavigateTo("/mytransfers"); // Redirect to a list or another page after successful update
}
private async Task<Transfer> UpdateTransfer(bool shouldRedirect = false)
private async Task<Transfer?> UpdateTransfer(bool shouldRedirect = false)
{
try
{
var responseTransfer = await transferDataService.UpdateTransferAsync(transfer);
var responseTransfer = await transferDataService.UpdateTransferAsync(_transfer);
if (responseTransfer != null)
{
return responseTransfer;
}
else
{
errorMessage = $"Error updating transfer: {transfer.Id}";
_errorMessage = $"Error updating transfer: {_transfer.Id}";
return null;
}
}
catch (Exception ex)
{
errorMessage = $"Exception: {ex.Message}";
_errorMessage = $"Exception: {ex.Message}";
return null;
}
}
}

View File

@ -161,6 +161,13 @@
</div>
</DxTabPage>
<DxTabPage Text="Messages">
<div class="d-flex flex-column mb-4 pb-2">
@* TODO: Megírni az GetMessagesByDriverId() endpoint-ot! - J. *@
<MessageDetailGridComponent ContextId="driverId" GetAllMessageTag="SignalRTags.GetTransfersMessagesByDriverId" IsSenderEmailVisible="false" IsMessageTextVisible="false"></MessageDetailGridComponent>
</div>
</DxTabPage>
</DxTabs>
</div>

View File

@ -18,6 +18,7 @@
@using TIAM.Entities.Emails
@using AyCode.Blazor.Components.Services
@using AyCode.Core.Extensions
@using TIAM.Services
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject AdminSignalRClient AdminSignalRClient;
@ -25,22 +26,24 @@
<MessageDetailGrid @ref="_messageGrid"
Logger="_logger"
SignalRClient="AdminSignalRClient"
GetAllMessageTag="GetAllMessageTag"
ContextIds="@(ContextId.IsNullOrEmpty() ? throw new InvalidDataException($"ContextId.IsNullOrEmpty(); ContextId: {ContextId}") : [ContextId.Value])"
CustomizeElement="CustomizeElement">
<Columns>
<DxGridCommandColumn Width="135" MinWidth="135" DeleteButtonVisible="AcDomain.IsDeveloperVersion" EditButtonVisible="AcDomain.IsDeveloperVersion" FixedPosition="GridColumnFixedPosition.Left" />
<DxGridCommandColumn Width="135" MinWidth="135" Visible="AcDomain.IsDeveloperVersion" DeleteButtonVisible="AcDomain.IsDeveloperVersion" EditButtonVisible="AcDomain.IsDeveloperVersion" FixedPosition="GridColumnFixedPosition.Left" />
<DxGridDataColumn FieldName="Id" ShowInColumnChooser="AcDomain.IsDeveloperVersion" Visible="AcDomain.IsDeveloperVersion" DisplayFormat="N" />
<DxGridDataColumn FieldName="ContextId" Width="80px" ShowInColumnChooser="AcDomain.IsDeveloperVersion" Visible="AcDomain.IsDeveloperVersion" DisplayFormat="N" />
<DxGridDataColumn FieldName="EmailAddress" Width="100px" Visible="@IsSenderEmailVisible" />
<DxGridDataColumn FieldName="Subject" Visible=@IsSubjectVisible />
<DxGridDataColumn FieldName="Text">
<DxGridDataColumn FieldName="Created" Caption="Received" DisplayFormat="g" Width="130" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" CaptionAlignment="GridTextAlignment.Center" TextAlignment="GridTextAlignment.Center" />
<DxGridDataColumn FieldName="EmailAddress" Caption="Sender" Width="200px" Visible="@IsSenderEmailVisible" />
<DxGridDataColumn FieldName="Subject" />
<DxGridDataColumn FieldName="Text" Visible="@IsMessageTextVisible">
<CellDisplayTemplate Context="displayTextContext">
<text>@System.Text.RegularExpressions.Regex.Replace((displayTextContext.Value as string)!, "<(.|\n)*?>", string.Empty)</text>
</CellDisplayTemplate>
</DxGridDataColumn>
<DxGridDataColumn FieldName="IsReaded" Caption="Readed" Width="70" CaptionAlignment="GridTextAlignment.Center" TextAlignment="GridTextAlignment.Center" />
<DxGridDataColumn FieldName="Created" DisplayFormat="g" Width="130" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" CaptionAlignment="GridTextAlignment.Center" TextAlignment="GridTextAlignment.Center" />
<DxGridDataColumn FieldName="IsReaded" Caption="Readed" Visible="@IsSenderEmailVisible" Width="70" CaptionAlignment="GridTextAlignment.Center" TextAlignment="GridTextAlignment.Center" />
</Columns>
<DetailRowTemplate>
@{
@ -61,9 +64,10 @@
@code {
[Parameter] public Guid? ContextId { get; set; }
//[Parameter] public IEmailMessageRelation ParentData { get; set; } = null!;
[Parameter] public bool IsSubjectVisible { get; set; } = true;
[Parameter] public bool IsMessageTextVisible { get; set; } = true;
[Parameter] public bool IsSenderEmailVisible { get; set; } = true;
[Parameter] public int GetAllMessageTag { get; set; } = SignalRTags.GetMessagesByContextId;
private MessageGrid _messageGrid = null!;
private LoggerClient<MessageDetailGridComponent> _logger = null!;

View File

@ -73,6 +73,21 @@ namespace TIAMWebApp.Server.Controllers
}
}
/// <summary>
///
/// </summary>
/// <param name="driverId">UserPropductMappingId</param>
/// <returns></returns>
[NonAction]
[ApiExplorerSettings(IgnoreApi = true)]
[SignalR(SignalRTags.GetTransfersMessagesByDriverId)]
public async Task<List<EmailMessage>> GetTransfersMessagesByDriverId(Guid driverId)
{
_logger.Info($@"GetAllMessagesByDriverId called; driverId: {driverId}");
return await _adminDal.GetTransfersMessagesByDriverIdAsync(driverId);
}
[AllowAnonymous]
[HttpGet]
[Route(APIUrls.GetMessagesByContextIdRouteName + "/{contextId}")]