From 15c919b5c777912a5c255a79b9933891d6e7ed4c Mon Sep 17 00:00:00 2001 From: "jozsef.b@aycode.com" <9Rj@D}fVwBaN> Date: Tue, 28 May 2024 08:40:43 +0200 Subject: [PATCH] SignalR, ManageTransfers imrovements, fixes, etc... --- TIAM.Services/SignalRTags.cs | 10 +- .../User/SysAdmins/ManageTransfers.razor | 118 ++++++++++-------- .../Controllers/TransferDataAPIController.cs | 10 +- .../Server/Services/DevAdminSignalRhub.cs | 48 +++---- .../Shared/Services/AcSignalRClientBase.cs | 10 +- 5 files changed, 106 insertions(+), 90 deletions(-) diff --git a/TIAM.Services/SignalRTags.cs b/TIAM.Services/SignalRTags.cs index 7b3a7993..7d676f98 100644 --- a/TIAM.Services/SignalRTags.cs +++ b/TIAM.Services/SignalRTags.cs @@ -6,11 +6,13 @@ namespace TIAM.Services; public class SignalRTags : AcSignalRTags { //[SignalMessageTag(null, typeof(SignalResponseMessage), null, null)] - public static readonly int GetTransfersAsync = 5; + public const int GetTransfersAsync = 5; - public static readonly int GetPropertiesByOwnerIdAsync = 6; + public const int GetPropertiesByOwnerIdAsync = 6; [SignalMessageTag(typeof(SignalPostJsonDataMessage), typeof(SignalResponseMessage), null, null)] - public static readonly int UpdateTransferAsync = 7; - public static readonly int GetCompaniesAsync = 8; + public const int UpdateTransferAsync = 7; + public const int AddTransferAsync = 8; + public const int DeleteTransferAsync = 9; + public const int GetCompaniesAsync = 10; } \ No newline at end of file diff --git a/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor b/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor index 0178e8c9..a97276c3 100644 --- a/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor +++ b/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor @@ -18,6 +18,7 @@ @using AyCode.Core.Extensions; @using AyCode.Core @using AyCode.Core.Helpers +@using AyCode.Interfaces.Entities @using TIAM.Services @layout AdminLayout @inject IEnumerable LogWriters @@ -338,68 +339,75 @@ transferEditModel.ContactEmail = "your@email.address"; } - async Task Grid_EditModelSaving(GridEditModelSavingEventArgs e) - { - bool success = false; - Transfer? transfer = null; - - if (e.IsNew) - { - //add new orderData to orderData array - _logger.Info("New orderData added"); - //await transferDataService.CreateTransfer((TransferWizardModel)e.EditModel); - } - else - { - _logger.Info("orderData updated at id " + ((Transfer)e.EditModel).Id); - - //transfer = await devAdminSignalClient.UpdateAsync(SignalRTags.UpdateTransferAsync, (Transfer)e.EditModel); - transfer = await transferDataService.UpdateTransferAsync((Transfer)e.EditModel); - - } - //get transfer from TransferData by Id - - // foreach (var transferToModify in (List)TransferData) - // { - // myModel = (Transfer)e.EditModel; - - // if (transferToModify.Id == myModel.Id) - // { - // //transferToModify.Driver = myModel.Driver; - // } - // } - - //if (success) - if (transfer != null) - { - UpdateDataSources(transfer); - - //e.Reload = true; - } - else UpdateAllDataAsync().Forget(); - } - - 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) { + var transfer = (Transfer)e.DataItem; + //await NwindDataService.RemoveEmployeeAsync((EditableEmployee)e.DataItem); //remove orderData from orderData array - _logger.Info("orderData deleted"); + _logger.Info("transfer delete"); + + PostDataToServerAsync(transfer, SignalRTags.DeleteTransferAsync, true).Forget(); //await UpdateDataAsync(); } + + async Task Grid_EditModelSaving(GridEditModelSavingEventArgs e) + { + var transfer = (Transfer)e.EditModel; + var logText = e.IsNew ? "add" : "update"; + + _logger.Info($"EditModelSaving, {logText} transfer; transferId " + transfer.Id); + + PostDataToServerAsync(transfer, e.IsNew ? SignalRTags.AddTransferAsync : SignalRTags.UpdateTransferAsync).Forget(); + + //await transferDataService.CreateTransfer((TransferWizardModel)e.EditModel); + //transfer = await transferDataService.UpdateTransferAsync(transfer); + } + + private Task PostDataToServerAsync(T transfer, int messageTag, bool isDelete = false) where T : Transfer //IEntityGuid + { + _logger.Info("PostDataToServerAsync called; transferId " + transfer.Id); + + RefreshDataSources(transfer, isDelete); //egybÅ‘l látszódik a változás a grid-ben, nem csak a callback lefutásakor! felhasználóbarátabb... - J. + + return devAdminSignalClient.PostDataAsync(messageTag, transfer, repsonse => + { + if (repsonse.Status != SignalResponseStatus.Success || repsonse.ResponseData == null) + { + UpdateAllDataAsync().Forget(); + return; + } + + RefreshDataSources(repsonse.ResponseData, isDelete); + StateHasChanged(); + }); + + //transfer = await devAdminSignalClient.PostDataAsync(SignalRTags.UpdateTransferAsync, transfer); + } + + private void RefreshDataSources(Transfer transfer, bool isDelete) + { + var transferIndex = TransferDataList.FindIndex(x => x.Id == transfer.Id); + + if (isDelete && transferIndex > -1) TransferDataList.RemoveAt(transferIndex); + else + { + if (transferIndex > -1) TransferDataList[transferIndex] = transfer; + else TransferDataList.Add(transfer); + } + + var appointmentIndex = AppointmentModels.FindIndex(x => x.SourceId == transfer.Id); + if (isDelete && appointmentIndex > -1) AppointmentModels.RemoveAt(appointmentIndex); + else + { + var appointment = CreateAppointmentModel(transfer); + + if (appointmentIndex > -1) AppointmentModels[appointmentIndex] = appointment; + else AppointmentModels.Add(appointment); + } + } + public Task UpdateAllDataAsync() { _logger.Info("UpdateAllDataAsync called"); diff --git a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs index 2855b334..dd6c839f 100644 --- a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs +++ b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs @@ -390,11 +390,11 @@ namespace TIAMWebApp.Server.Controllers [AllowAnonymous] [HttpPost] [Route(APIUrls.GetTransferByIdRouteName)] - public async Task GetTransferById([FromBody] Guid transferID) + public async Task GetTransferById([FromBody] Guid transferId) { - _logger.Info(@"Get transfer by id called"); - _logger.Info($"transferId: {transferID.ToString()}"); - var result = _adminDal.GetTransferById(transferID); + _logger.Info($"Get transfer by id called; transferId: {transferId}"); + + var result = _adminDal.GetTransferById(transferId); //TODO: Implementálni a Logout-ot kliens és szerver oldalon is! - J. return Ok(result); @@ -405,7 +405,7 @@ namespace TIAMWebApp.Server.Controllers [Route(APIUrls.UpdateTransferRouteName)] public async Task UpdateTransfer(Transfer transferToModify) { - _logger.Info($"UpdateTransfer called! + {Request.ReadFormAsync()}"); + _logger.Info($"UpdateTransfer called! + {Request?.ReadFormAsync()}"); await _adminDal.UpdateTransferAsync(transferToModify); return transferToModify; diff --git a/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs b/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs index 7f07b22f..fd6034f5 100644 --- a/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs +++ b/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs @@ -58,41 +58,43 @@ public class DevAdminSignalRHub(AdminDal adminDal, ServiceProviderAPIController try { - if (messageTag == SignalRTags.GetTransfersAsync) + switch (messageTag) { - await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, await transferDataAPIController.GetTransfers()), requestId); - } - else if (messageTag == SignalRTags.GetPropertiesByOwnerIdAsync) - { - var ownerId = message!.MessagePackTo().Id; - var json = (await serviceProviderAPIController.GetServiceProvidersByOwnerId(ownerId)).ToJson(); + case SignalRTags.GetTransfersAsync: + await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, await transferDataAPIController.GetTransfers()), requestId); + return; - await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, json), requestId); - } - else if (messageTag == SignalRTags.UpdateTransferAsync) - { + case SignalRTags.GetPropertiesByOwnerIdAsync: + var ownerId = message!.MessagePackTo().Id; + var json = (await serviceProviderAPIController.GetServiceProvidersByOwnerId(ownerId)).ToJson(); - //var jsonPostData = message!.MessagePackTo().PostDataJson; - //_logger.DetailConditional($"PostData: [{jsonPostData}]"); - //var transfer = jsonPostData.JsonTo()!; + await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, json), requestId); - var transfer = message!.MessagePackTo>().PostData; + return; - await transferDataAPIController.UpdateTransfer(transfer); - await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, transfer.ToJson()), requestId); + case SignalRTags.UpdateTransferAsync: + var transfer = message!.MessagePackTo>().PostData; + + await transferDataAPIController.UpdateTransfer(transfer); + await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, transfer.ToJson()), requestId); + + return; + + case SignalRTags.GetCompaniesAsync: + await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, await serviceProviderAPIController.GetServiceProviders()), requestId); + return; + + default: + _logger.Error($"Server OnReceiveMessage; messageTag not found! messageTag: {messageTag}"); + break; } - else if (messageTag == SignalRTags.GetCompaniesAsync) - { - await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, await serviceProviderAPIController.GetServiceProviders()), requestId); - } - return; } catch (Exception ex) { _logger.Error($"Server OnReceiveMessage; {ex.Message}", ex); } - await ResponseToCaller(messageTag, new SignalResponseMessage(SignalResponseStatus.Error, null), requestId); + await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Error), requestId); } protected async Task ResponseToCaller(int messageTag, ISignalRMessage message, int? requestId) diff --git a/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs b/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs index a050d569..e9e19336 100644 --- a/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs +++ b/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs @@ -104,9 +104,9 @@ namespace TIAMWebApp.Shared.Application.Services public virtual Task GetAllAsync(int messageTag, Action> responseCallback) => SendMessageToServerAsync(messageTag, null, responseCallback); - public virtual Task UpdateAsync(int messageTag, TPostData postData) where TPostData : class + public virtual Task PostDataAsync(int messageTag, TPostData postData) where TPostData : class => SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage(postData), AcDomain.NextUniqueInt32); - public virtual Task UpdateAsync(int messageTag, TPostData postData, Action> responseCallback) where TPostData : class + public virtual Task PostDataAsync(int messageTag, TPostData postData, Action> responseCallback) where TPostData : class => SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage(postData), responseCallback); #endregion CRUD @@ -182,6 +182,7 @@ namespace TIAMWebApp.Shared.Application.Services if (requestId.HasValue && _responseByRequestId.ContainsKey(requestId.Value)) { var reqId = requestId.Value; + var responseMessage = message.MessagePackTo(ContractlessStandardResolver.Options); switch (_responseByRequestId[reqId]) @@ -209,11 +210,14 @@ namespace TIAMWebApp.Shared.Application.Services _responseByRequestId.TryRemove(reqId, out _); } - + OnMessageReceived(messageTag, message, requestId); } catch(Exception ex) { + if (requestId.HasValue) + _responseByRequestId.TryRemove(requestId.Value, out _); + Logger.Error($"Client OnReceiveMessage; messageTag: {messageTag}; requestId: {requestId}; {ex.Message}", ex); throw; }