Add GetByIdAsync, GetAllAsync, UpdateAsync to SignalRClient; improvements, fixes, etc...

This commit is contained in:
jozsef.b@aycode.com 2024-05-27 08:32:48 +02:00
parent 771d32b6af
commit f21e6f56ef
12 changed files with 136 additions and 65 deletions

View File

@ -6,4 +6,5 @@ public class SignalRTags : AcSignalRTags
{ {
public const int GetTransfersAsync = 5; public const int GetTransfersAsync = 5;
public const int GetPropertiesByOwnerIdAsync = 6; public const int GetPropertiesByOwnerIdAsync = 6;
public const int UpdateTransferAsync = 7;
} }

View File

@ -265,14 +265,14 @@ else
{ {
try try
{ {
var result = await transferDataService.UpdateTransferAsync(transfer); var responseTransfer = await transferDataService.UpdateTransferAsync(transfer);
if (result) if (responseTransfer != null)
{ {
navManager.NavigateTo("/mytransfers"); // Redirect to a list or another page after successful update navManager.NavigateTo("/mytransfers"); // Redirect to a list or another page after successful update
} }
else else
{ {
errorMessage = $"Error updating transfer: {result.ToString()}"; errorMessage = $"Error updating transfer: {transfer.Id}";
} }
} }
catch (Exception ex) catch (Exception ex)

View File

@ -10,7 +10,7 @@
@using AyCode.Services.Loggers @using AyCode.Services.Loggers
@using TIAMWebApp.Shared.Application.Services @using TIAMWebApp.Shared.Application.Services
@layout AdminLayout @layout AdminLayout
@inject IAcLogWriterClientBase BrowserConsoleLogWriter @inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject IStringLocalizer<TIAMResources> localizer @inject IStringLocalizer<TIAMResources> localizer
@inject ISessionService SessionService @inject ISessionService SessionService
@inject IServiceProviderDataService ServiceProviderDataService @inject IServiceProviderDataService ServiceProviderDataService
@ -104,6 +104,7 @@
@code { @code {
private LoggerClient<MyServiceProviders> _logger;
IGrid Grid { get; set; } IGrid Grid { get; set; }
Company[]? ServiceProviderData { get; set; } Company[]? ServiceProviderData { get; set; }
@ -136,7 +137,7 @@
public async Task SubmitForm(object Result) public async Task SubmitForm(object Result)
{ {
//await WizardProcessor.ProcessWizardAsync(Result.GetType(), Result); //await WizardProcessor.ProcessWizardAsync(Result.GetType(), Result);
BrowserConsoleLogWriter.Info($"Submitted nested form: {Result.GetType().FullName}"); _logger.Info($"Submitted nested form: {Result.GetType().FullName}");
} }
@ -160,10 +161,10 @@
{ {
if (e.IsNew) if (e.IsNew)
//add new orderData to orderData array //add new orderData to orderData array
BrowserConsoleLogWriter.Info("New orderData added"); _logger.Info("New orderData added");
//await NwindDataService.InsertEmployeeAsync((EditableEmployee)e.EditModel); //await NwindDataService.InsertEmployeeAsync((EditableEmployee)e.EditModel);
else else
BrowserConsoleLogWriter.Info("orderData updated"); _logger.Info("orderData updated");
//modify orderData where orderData.Name == e.EditModel.Name //modify orderData where orderData.Name == e.EditModel.Name
//await NwindDataService.UpdateEmployeeAsync((EditableEmployee)e.DataItem, (EditableEmployee)e.EditModel); //await NwindDataService.UpdateEmployeeAsync((EditableEmployee)e.DataItem, (EditableEmployee)e.EditModel);
@ -174,21 +175,27 @@
{ {
//await NwindDataService.RemoveEmployeeAsync((EditableEmployee)e.DataItem); //await NwindDataService.RemoveEmployeeAsync((EditableEmployee)e.DataItem);
//remove orderData from orderData array //remove orderData from orderData array
BrowserConsoleLogWriter.Info("orderData deleted"); _logger.Info("orderData deleted");
//await UpdateDataAsync(); //await UpdateDataAsync();
} }
async Task UpdateDataAsync() async Task UpdateDataAsync()
{ {
//DataSource = await NwindDataService.GetEmployeesEditableAsync(); //DataSource = await NwindDataService.GetEmployeesEditableAsync();
//refresh grid //refresh grid
BrowserConsoleLogWriter.Info("orderData grid refreshed"); _logger.Info("orderData grid refreshed");
} }
protected override void OnInitialized() protected override Task OnInitializedAsync()
{ {
base.OnInitialized(); _logger = new LoggerClient<MyServiceProviders>(LogWriters.ToArray());
var myId = SessionService.User.UserId; var myId = SessionService.User.UserId;
var companyPropertiesByOwner = ServiceProviderDataService.GetPropertiesByOwnerIdAsync(myId); ServiceProviderDataService.GetPropertiesByOwnerIdAsync(myId, companyPropertiesByOwner =>
{
_logger.DetailConditional($"companyPropertiesByOwner count: {companyPropertiesByOwner?.Count.ToString() ?? "NULL"}");
});
return base.OnInitializedAsync();
} }
} }

View File

@ -212,25 +212,25 @@
public List<string> IgnoreList = public List<string> IgnoreList =
[ [
"ReceiverEmailAddress", "ReceiverEmailAddress",
"ReceiverFullName", "ReceiverFullName",
"ReceiverId", "ReceiverId",
"SenderEmailAddress", "SenderEmailAddress",
"SenderFullName", "SenderFullName",
"SenderId", "SenderId",
"ContextId", "ContextId",
]; ];
public List<TransferStatusModel> Statuses { get; set; } = public List<TransferStatusModel> Statuses { get; set; } =
[ [
new(Convert.ToInt16(TransferStatusType.OrderSubmitted), "Order submitted"), new(Convert.ToInt16(TransferStatusType.OrderSubmitted), "Order submitted"),
new(Convert.ToInt16(TransferStatusType.OrderConfirmed), "Order confirmed"), new(Convert.ToInt16(TransferStatusType.OrderConfirmed), "Order confirmed"),
new(Convert.ToInt16(TransferStatusType.AssignedToDriver), "Assigned to driver"), new(Convert.ToInt16(TransferStatusType.AssignedToDriver), "Assigned to driver"),
new(Convert.ToInt16(TransferStatusType.DriverConfirmed), "Driver confirmed"), new(Convert.ToInt16(TransferStatusType.DriverConfirmed), "Driver confirmed"),
new(Convert.ToInt16(TransferStatusType.DriverEnRoute), "Driver enroute"), new(Convert.ToInt16(TransferStatusType.DriverEnRoute), "Driver enroute"),
new(Convert.ToInt16(TransferStatusType.PassengerPickup), "Passenger in car"), new(Convert.ToInt16(TransferStatusType.PassengerPickup), "Passenger in car"),
new(Convert.ToInt16(TransferStatusType.Finished), "Finished"), new(Convert.ToInt16(TransferStatusType.Finished), "Finished"),
new(Convert.ToInt16(TransferStatusType.UserCanceled), "User cancelled"), new(Convert.ToInt16(TransferStatusType.UserCanceled), "User cancelled"),
new(Convert.ToInt16(TransferStatusType.AdminDenied), "Admin cancelled") new(Convert.ToInt16(TransferStatusType.AdminDenied), "Admin cancelled")
]; ];
private MessageWizardModel _messageWizardModel = new(); private MessageWizardModel _messageWizardModel = new();
@ -340,6 +340,8 @@
async Task Grid_EditModelSaving(GridEditModelSavingEventArgs e) async Task Grid_EditModelSaving(GridEditModelSavingEventArgs e)
{ {
bool success = false; bool success = false;
Transfer? transfer = null;
if (e.IsNew) if (e.IsNew)
{ {
//add new orderData to orderData array //add new orderData to orderData array
@ -350,7 +352,8 @@
{ {
_logger.Info("orderData updated at id " + ((Transfer)e.EditModel).Id); _logger.Info("orderData updated at id " + ((Transfer)e.EditModel).Id);
success = await transferDataService.UpdateTransferAsync((Transfer)e.EditModel); //transfer = await devAdminSignalClient.UpdateAsync(SignalRTags.UpdateTransferAsync, (Transfer)e.EditModel);
transfer = await transferDataService.UpdateTransferAsync((Transfer)e.EditModel);
} }
//get transfer from TransferData by Id //get transfer from TransferData by Id
@ -365,11 +368,29 @@
// } // }
// } // }
if (success) //if (success)
if (transfer != null)
{ {
//TODO: ne a teljes grid-et refresh-eljük, elég lenne csak az adott sort! - J. UpdateDataSources(transfer);
await UpdateDataAsync();
//e.Reload = true;
} }
else await UpdateAllDataAsync();
//StateHasChanged();
}
private void UpdateDataSources(Transfer transfer)
{
var transferIndex = TransferDataList.FindIndex(x => x.Id == transfer.Id);
if (transferIndex > -1) TransferDataList[transferIndex] = transfer;
else TransferDataList.Add(transfer);
var appointment = CreateAppointmentModel(transfer);
var appointmentIndex = AppointmentModels.FindIndex(x => x.SourceId == transfer.Id);
if (appointmentIndex > -1) AppointmentModels[appointmentIndex] = appointment;
else AppointmentModels.Add(appointment);
} }
async Task Grid_DataItemDeleting(GridDataItemDeletingEventArgs e) async Task Grid_DataItemDeleting(GridDataItemDeletingEventArgs e)
@ -380,17 +401,11 @@
//await UpdateDataAsync(); //await UpdateDataAsync();
} }
async Task UpdateDataAsync() public Task UpdateAllDataAsync()
{ {
TransferDataList = await transferDataService.GetTransfersAsync(); _logger.Info("UpdateAllDataAsync called");
_logger.Info("orderData grid refreshed");
}
protected override async Task OnInitializedAsync() devAdminSignalClient.GetAllAsync<List<Transfer>>(SignalRTags.GetTransfersAsync, response =>
{
_logger = new LoggerClient<ManageTransfers>(LogWriters.ToArray());
devAdminSignalClient.SendMessageToServerAsync<List<Transfer>>(SignalRTags.GetTransfersAsync, response =>
{ {
if (response.Status == SignalResponseStatus.Error) if (response.Status == SignalResponseStatus.Error)
return; return;
@ -400,12 +415,22 @@
}).Forget(); }).Forget();
//var transfers = await devAdminSignalClient.SendRequestToServerAsync<List<Transfer>>(SignalRTags.GetTransfersAsync); //var transfers = await devAdminSignalClient.GetAllAsync<List<Transfer>>(SignalRTags.GetTransfersAsync);
//InitializeDataSources(transfers ?? []); //InitializeDataSources(transfers ?? []);
//InitializeDataSources(await transferDataService.GetTransfersAsync()); //InitializeDataSources(await transferDataService.GetTransfersAsync());
base.OnInitialized();
return Task.CompletedTask;
}
protected override Task OnInitializedAsync()
{
_logger = new LoggerClient<ManageTransfers>(LogWriters.ToArray());
UpdateAllDataAsync().Forget();
return base.OnInitializedAsync();
} }
private void InitializeDataSources(List<Transfer> transferDataList) private void InitializeDataSources(List<Transfer> transferDataList)
@ -421,7 +446,7 @@
// bnm.Location = transfer.FromAddress; // bnm.Location = transfer.FromAddress;
// bnm.Subject = "Simple transfer"; // bnm.Subject = "Simple transfer";
AppointmentModels.Add(new AppointmentModel { StartDate = transfer.Appointment, EndDate=transfer.Appointment.AddMinutes(30), Description = $"{transfer.FullName}, {transfer.ToAddress}", Location = transfer.FromAddress, Caption = "Simple transfer" }); AppointmentModels.Add(CreateAppointmentModel(transfer));
} }
_dataStorage = new DxSchedulerDataStorage _dataStorage = new DxSchedulerDataStorage
@ -444,6 +469,11 @@
}; };
} }
public AppointmentModel CreateAppointmentModel(Transfer transfer)
{
return new AppointmentModel { SourceId = transfer.Id, StartDate = transfer.Appointment, EndDate = transfer.Appointment.AddMinutes(30), Description = $"{transfer.FullName}, {transfer.ToAddress}", Location = transfer.FromAddress, Caption = "Simple transfer" };
}
void ColumnChooserButton_Click() void ColumnChooserButton_Click()
{ {
Grid2.ShowColumnChooser(); Grid2.ShowColumnChooser();

View File

@ -403,10 +403,12 @@ namespace TIAMWebApp.Server.Controllers
[AllowAnonymous] [AllowAnonymous]
[HttpPost] [HttpPost]
[Route(APIUrls.UpdateTransferRouteName)] [Route(APIUrls.UpdateTransferRouteName)]
public async Task<bool> UpdateTransfer(Transfer transferToModify) public async Task<Transfer> UpdateTransfer(Transfer transferToModify)
{ {
_logger.Info("UpdateTransfer called!"); _logger.Info("UpdateTransfer called!");
return await _adminDal.UpdateTransferAsync(transferToModify); await _adminDal.UpdateTransferAsync(transferToModify);
return transferToModify;
} }
} }

View File

@ -8,6 +8,7 @@ using MessagePack;
using MessagePack.Resolvers; using MessagePack.Resolvers;
using AyCode.Services.Server.SignalRs; using AyCode.Services.Server.SignalRs;
using System.ServiceModel.Channels; using System.ServiceModel.Channels;
using TIAM.Entities.Transfers;
using TIAM.Services; using TIAM.Services;
using TIAMWebApp.Server.Controllers; using TIAMWebApp.Server.Controllers;
@ -31,7 +32,7 @@ public class DevAdminSignalRHub(AdminDal adminDal, ServiceProviderAPIController
public override async Task OnDisconnectedAsync(Exception? exception) public override async Task OnDisconnectedAsync(Exception? exception)
{ {
_logger.Error($"Server OnDisconnectedAsync; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}", exception); _logger.ErrorConditional($"Server OnDisconnectedAsync; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}", exception);
//await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users"); //await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnDisconnectedAsync(exception); await base.OnDisconnectedAsync(exception);
@ -60,12 +61,20 @@ public class DevAdminSignalRHub(AdminDal adminDal, ServiceProviderAPIController
} }
else if (messageTag == SignalRTags.GetPropertiesByOwnerIdAsync) else if (messageTag == SignalRTags.GetPropertiesByOwnerIdAsync)
{ {
var ownerId = message.MessagePackTo<SignalRequestByIdMessage>().Id; var ownerId = message!.MessagePackTo<SignalRequestByIdMessage>().Id;
var json = (await serviceProviderAPIController.GetServiceProvidersByOwnerId(ownerId)).ToJson(); var json = (await serviceProviderAPIController.GetServiceProvidersByOwnerId(ownerId)).ToJson();
await ResponseToCaller(messageTag, new SignalResponseMessage<string>(SignalResponseStatus.Success, json), requestId); await ResponseToCaller(messageTag, new SignalResponseMessage<string>(SignalResponseStatus.Success, json), requestId);
} }
else if (messageTag == SignalRTags.UpdateTransferAsync)
{
var signalPostJsonDataMessage = message!.MessagePackTo<SignalPostJsonDataMessage>();
var transfer = signalPostJsonDataMessage.PostData.JsonTo<Transfer>()!;
await transferDataAPIController.UpdateTransfer(transfer);
await ResponseToCaller(messageTag, new SignalResponseMessage<string>(SignalResponseStatus.Success, transfer.ToJson()), requestId);
}
return; return;
} }
catch (Exception ex) catch (Exception ex)

View File

@ -14,7 +14,7 @@ namespace TIAMWebApp.Shared.Application.Interfaces
public interface IServiceProviderDataService public interface IServiceProviderDataService
{ {
//17. (IServiceProviderDataService) get service providers by ownerId //17. (IServiceProviderDataService) get service providers by ownerId
public Task<Dictionary<Guid, string>?> GetPropertiesByOwnerIdAsync(Guid id); public Task<Dictionary<Guid, string>?> GetPropertiesByOwnerIdAsync(Guid id, Action<Dictionary<Guid, string>?>? callback = null);
//13. delete service provider //13. delete service provider
public Task DeleteServiceProviderAsync(Guid serviceProviderId); public Task DeleteServiceProviderAsync(Guid serviceProviderId);

View File

@ -18,6 +18,6 @@ namespace TIAMWebApp.Shared.Application.Interfaces
Task<Transfer?> GetTransferByIdAsync(Guid id); Task<Transfer?> GetTransferByIdAsync(Guid id);
Task<List<Transfer>> GetTransfersAsync(); Task<List<Transfer>> GetTransfersAsync();
Task<bool> UpdateTransferAsync(Transfer model); Task<Transfer?> UpdateTransferAsync(Transfer model);
} }
} }

View File

@ -10,6 +10,8 @@ namespace TIAMWebApp.Shared.Application.Models.PageModels
public class AppointmentModel public class AppointmentModel
{ {
public AppointmentModel() { } public AppointmentModel() { }
public Guid SourceId { get; set; } //pl: TransferId, stb... - J;
public int AppointmentType { get; set; } public int AppointmentType { get; set; }
public DateTime StartDate { get; set; } public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; } public DateTime EndDate { get; set; }

View File

@ -15,6 +15,7 @@ using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using TIAM.Entities.Transfers; using TIAM.Entities.Transfers;
using TIAM.Services;
using TIAMWebApp.Shared.Application.Models.ClientSide; using TIAMWebApp.Shared.Application.Models.ClientSide;
using TIAMWebApp.Shared.Application.Utility; using TIAMWebApp.Shared.Application.Utility;
@ -91,6 +92,24 @@ namespace TIAMWebApp.Shared.Application.Services
HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, message?.ToMessagePack(ContractlessStandardResolver.Options), requestId).Forget(); HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, message?.ToMessagePack(ContractlessStandardResolver.Options), requestId).Forget();
} }
#region CRUD
public virtual Task<TResponse?> GetByIdAsync<TResponse>(int messageTag, Guid id) where TResponse : class
=> SendMessageToServerAsync<TResponse>(messageTag, new SignalRequestByIdMessage(id), AcDomain.NextUniqueInt32);
public virtual Task GetByIdAsync<TResponseData>(int messageTag, Guid id, Action<ISignalResponseMessage<TResponseData?>> responseCallback)
=> SendMessageToServerAsync(messageTag, new SignalRequestByIdMessage(id), responseCallback);
public virtual Task<TResponse?> GetAllAsync<TResponse>(int messageTag) where TResponse : class
=> SendMessageToServerAsync<TResponse>(messageTag);
public virtual Task GetAllAsync<TResponseData>(int messageTag, Action<ISignalResponseMessage<TResponseData?>> responseCallback)
=> SendMessageToServerAsync(messageTag, null, responseCallback);
public virtual Task<TPostData?> UpdateAsync<TPostData>(int messageTag, TPostData postData) where TPostData : class
=> SendMessageToServerAsync<TPostData>(messageTag, new SignalPostJsonDataMessage(postData), AcDomain.NextUniqueInt32);
public virtual Task UpdateAsync<TPostData>(int messageTag, TPostData postData, Action<ISignalResponseMessage<TPostData?>> responseCallback)
=> SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage(postData!), responseCallback);
#endregion CRUD
public virtual Task<TResponse?> SendMessageToServerAsync<TResponse>(int messageTag) where TResponse : class public virtual Task<TResponse?> SendMessageToServerAsync<TResponse>(int messageTag) where TResponse : class
=> SendMessageToServerAsync<TResponse>(messageTag, null, AcDomain.NextUniqueInt32); => SendMessageToServerAsync<TResponse>(messageTag, null, AcDomain.NextUniqueInt32);
@ -128,7 +147,7 @@ namespace TIAMWebApp.Shared.Application.Services
} }
public virtual Task SendMessageToServerAsync<TResponseData>(int messageTag, Action<ISignalResponseMessage<TResponseData?>> responseCallback) public virtual Task SendMessageToServerAsync<TResponseData>(int messageTag, Action<ISignalResponseMessage<TResponseData?>> responseCallback)
=> SendMessageToServerAsync<TResponseData>(messageTag, null, responseCallback); => SendMessageToServerAsync(messageTag, null, responseCallback);
public virtual Task SendMessageToServerAsync<TResponseData>(int messageTag, ISignalRMessage? message, Action<ISignalResponseMessage<TResponseData?>> responseCallback) public virtual Task SendMessageToServerAsync<TResponseData>(int messageTag, ISignalRMessage? message, Action<ISignalResponseMessage<TResponseData?>> responseCallback)
{ {

View File

@ -75,21 +75,22 @@ namespace TIAMWebApp.Shared.Application.Services
} }
//17. //17.
public async Task<Dictionary<Guid, string>?> GetPropertiesByOwnerIdAsync(Guid id) public async Task<Dictionary<Guid, string>?> GetPropertiesByOwnerIdAsync(Guid id, Action<Dictionary<Guid, string>?>? callback = null)
{ {
Dictionary<Guid, string>? companyPropertiesByOwner; if (callback != null)
{
_devAdminSignalClient.GetByIdAsync<Dictionary<Guid, string>>(SignalRTags.GetPropertiesByOwnerIdAsync, id, response =>
{
if (response.Status == SignalResponseStatus.Error)
callback.Invoke(null);
//_devAdminSignalClient.SendMessageToServerAsync<Dictionary<Guid, string>>(SignalRTags.GetPropertiesByOwnerIdAsync, new SignalRequestByIdMessage(id), response => _logger.DetailConditional($"companyPropertiesByOwner async: {string.Join("; ", response.ResponseData!.Values)}");
//{
// if (response.Status == SignalResponseStatus.Error)
// return;
// companyPropertiesByOwner = response.ResponseData; callback.Invoke(response.ResponseData);
// if (companyPropertiesByOwner != null) _logger.DetailConditional($"companyPropertiesByOwner async: {string.Join("; ", companyPropertiesByOwner.Values)}"); }).Forget();
//}).Forget(); }
var companyPropertiesByOwner = await _devAdminSignalClient.GetByIdAsync<Dictionary<Guid, string>>(SignalRTags.GetPropertiesByOwnerIdAsync, id);
companyPropertiesByOwner = await _devAdminSignalClient.SendMessageToServerAsync<Dictionary<Guid, string>>(SignalRTags.GetPropertiesByOwnerIdAsync, new SignalRequestByIdMessage(id));
if (companyPropertiesByOwner != null) _logger.DetailConditional($"companyPropertiesByOwner: {string.Join("; ", companyPropertiesByOwner.Values)}"); if (companyPropertiesByOwner != null) _logger.DetailConditional($"companyPropertiesByOwner: {string.Join("; ", companyPropertiesByOwner.Values)}");
return companyPropertiesByOwner; return companyPropertiesByOwner;

View File

@ -183,7 +183,7 @@ namespace TIAMWebApp.Shared.Application.Services
return response; return response;
} }
public async Task<bool> UpdateTransferAsync(Transfer model) public async Task<Transfer?> UpdateTransferAsync(Transfer model)
{ {
var url = $"{Setting.ApiBaseUrl}/{APIUrls.UpdateTransfer}"; var url = $"{Setting.ApiBaseUrl}/{APIUrls.UpdateTransfer}";
var response = await _http.PostAsJsonAsync(url, model); var response = await _http.PostAsJsonAsync(url, model);
@ -197,9 +197,9 @@ namespace TIAMWebApp.Shared.Application.Services
//} //}
if (!response.IsSuccessStatusCode) if (!response.IsSuccessStatusCode)
return false; return null;
var result = (bool)(await response.Content.ReadFromJsonAsync(typeof(bool)))!; var result = (Transfer)(await response.Content.ReadFromJsonAsync(typeof(Transfer)))!;
return result; return result;
} }