diff --git a/TIAM.Models/Dtos/Profiles/ProfileDto.cs b/TIAM.Models/Dtos/Profiles/ProfileDto.cs index bee0afab..fc81c162 100644 --- a/TIAM.Models/Dtos/Profiles/ProfileDto.cs +++ b/TIAM.Models/Dtos/Profiles/ProfileDto.cs @@ -14,6 +14,8 @@ public class ProfileDto : IProfileDto //TODO: AcProfileDtoBase - J. public string? LastName { get; set; } //public string NickName { get; set; } + public string? EmailAddress { get; set; } + public string? Description { get; set; } public string? ThumbnailUrl { get; set; } diff --git a/TIAM.Services/AcSignalRTags.cs b/TIAM.Services/AcSignalRTags.cs new file mode 100644 index 00000000..6472bacc --- /dev/null +++ b/TIAM.Services/AcSignalRTags.cs @@ -0,0 +1,9 @@ +using AyCode.Services.SignalRs; + +namespace TIAM.Services; + +public class SignalRTags : AcSignalRTags +{ + public const int GetTransfersAsync = 5; + public const int GetPropertiesByOwnerIdAsync = 6; +} \ No newline at end of file diff --git a/TIAM.Services/TIAM.Services.csproj b/TIAM.Services/TIAM.Services.csproj index 00cad14a..5c1bbbf6 100644 --- a/TIAM.Services/TIAM.Services.csproj +++ b/TIAM.Services/TIAM.Services.csproj @@ -25,6 +25,9 @@ ..\..\AyCode.Core\AyCode.Services.Server\bin\Debug\net8.0\AyCode.Models.dll + + ..\..\AyCode.Core\AyCode.Services.Server\bin\Debug\net8.0\AyCode.Services.dll + diff --git a/TIAMSharedUI/Pages/User/MyServiceProviders.razor b/TIAMSharedUI/Pages/User/MyServiceProviders.razor index 29958c92..219169d2 100644 --- a/TIAMSharedUI/Pages/User/MyServiceProviders.razor +++ b/TIAMSharedUI/Pages/User/MyServiceProviders.razor @@ -8,11 +8,13 @@ @using TIAMWebApp.Shared.Application.Utility @using AyCode.Core.Loggers @using AyCode.Services.Loggers +@using TIAMWebApp.Shared.Application.Services @layout AdminLayout @inject IAcLogWriterClientBase BrowserConsoleLogWriter @inject IStringLocalizer localizer @inject ISessionService SessionService @inject IServiceProviderDataService ServiceProviderDataService +

Properties

@@ -186,9 +188,7 @@ { base.OnInitialized(); var myId = SessionService.User.UserId; - ServiceProviderDataService.GetPropertiesByOwnerIdAsync(myId); - + var companyPropertiesByOwner = ServiceProviderDataService.GetPropertiesByOwnerIdAsync(myId); } - } diff --git a/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor b/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor index 65f5084e..7fc202ba 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 TIAM.Services @layout AdminLayout @inject IEnumerable LogWriters @inject IStringLocalizer localizer @@ -389,11 +390,12 @@ { _logger = new LoggerClient(LogWriters.ToArray()); - devAdminSignalClient.SendRequestToServerAsync(SignalRTags.GetTransfersAsync, responseBytes => + devAdminSignalClient.SendMessageToServerAsync>(SignalRTags.GetTransfersAsync, response => { - var transfers = responseBytes.MessagePackTo(ContractlessStandardResolver.Options).JsonTo>(); + if (response.Status == SignalResponseStatus.Error) + return; - InitializeDataSources(transfers ?? []); + InitializeDataSources(response.ResponseData ?? []); StateHasChanged(); }).Forget(); diff --git a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs index b68adfc2..5303159b 100644 --- a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs +++ b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs @@ -380,10 +380,10 @@ namespace TIAMWebApp.Server.Controllers [Route(APIUrls.GetTransfersRouteName)] public async Task GetTransfers() { - var token = _authService.GetAuthTokenFromRequest(Request); - _logger.Detail(token); - var result = await _adminDal.GetTransfersJsonAsync(); + //var token = _authService.GetAuthTokenFromRequest(Request); + //_logger.Detail(token); + var result = await _adminDal.GetTransfersJsonAsync(); return result; } diff --git a/TIAMWebApp/Server/Program.cs b/TIAMWebApp/Server/Program.cs index 770482b7..71c8504b 100644 --- a/TIAMWebApp/Server/Program.cs +++ b/TIAMWebApp/Server/Program.cs @@ -41,6 +41,9 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); + builder.Services.AddSignalR();//.AddMessagePackProtocol(options => options.SerializerOptions = MessagePackSerializerOptions.Standard.WithSecurity(MessagePackSecurity.UntrustedData)); diff --git a/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs b/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs index 9a900624..29393e19 100644 --- a/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs +++ b/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs @@ -8,10 +8,12 @@ using MessagePack; using MessagePack.Resolvers; using AyCode.Services.Server.SignalRs; using System.ServiceModel.Channels; +using TIAM.Services; +using TIAMWebApp.Server.Controllers; namespace TIAMWebApp.Server.Services; -public class DevAdminSignalRHub(AdminDal adminDal, IEnumerable logWriters) : Hub, IAcSignalRHubServer +public class DevAdminSignalRHub(AdminDal adminDal, ServiceProviderAPIController serviceProviderAPIController, TransferDataAPIController transferDataAPIController, IEnumerable logWriters) : Hub, IAcSignalRHubServer { private readonly TIAM.Core.Loggers.Logger _logger = new(logWriters.ToArray()); @@ -35,41 +37,61 @@ public class DevAdminSignalRHub(AdminDal adminDal, IEnumerable await base.OnDisconnectedAsync(exception); } - public async Task OnRequestMessage(int messageTag, int requestId) - { - _logger.Info($"Server OnRequestMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}"); + //public async Task OnRequestMessage(int messageTag, int requestId) + //{ + // _logger.Info($"Server OnRequestMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}"); - if (messageTag == SignalRTags.GetTransfersAsync) - await ResponseToCaller(SignalRTags.PostTransfersAsync, await adminDal.GetTransfersJsonAsync(), requestId); - } + // if (messageTag == SignalRTags.GetTransfersAsync) + // await ResponseToCaller(SignalRTags.PostTransfersAsync, await adminDal.GetTransfersJsonAsync(), requestId); + //} - public async Task OnReceiveMessage(int messageTag, byte[] message, int? requestId) + public async Task OnReceiveMessage(int messageTag, byte[]? message, int? requestId) { var logText = $"Server OnReceiveMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}"; - if (message.Length == 0) _logger.Warning($"message.Length == 0! {logText}"); + if (message is { Length: 0 }) _logger.Warning($"message.Length == 0! {logText}"); else _logger.Info(logText); - //if (messageTag == SignalRTags.GetTransfersAsync) - // ResponseToClient(messageTag, await adminDal.GetTransfersJsonAsync(), requestId); + try + { + if (messageTag == SignalRTags.GetTransfersAsync) + { + await ResponseToCaller(messageTag, new SignalResponseMessage(SignalResponseStatus.Success, await transferDataAPIController.GetTransfers()), requestId); + } + else if (messageTag == SignalRTags.GetPropertiesByOwnerIdAsync) + { + var ownerId = message.MessagePackTo().Id; + var json = (await serviceProviderAPIController.GetServiceProvidersByOwnerId(ownerId)).ToJson(); + + await ResponseToCaller(messageTag, new SignalResponseMessage(SignalResponseStatus.Success, json), requestId); + } + + return; + } + catch (Exception ex) + { + _logger.Error($"Server OnReceiveMessage; {ex.Message}", ex); + } + + await ResponseToCaller(messageTag, new SignalResponseMessage(SignalResponseStatus.Error, null), requestId); } - protected async Task ResponseToCaller(int messageTag, object message, int requestId) + protected async Task ResponseToCaller(int messageTag, ISignalRMessage message, int? requestId) => await SendMessageToClient(Clients.Caller, messageTag, message, requestId); - protected async Task SendMessageToClient(ISignalRHubItemServer sendTo, int messageTag, object message, int? requestId = null) + protected async Task SendMessageToClient(ISignalRHubItemServer sendTo, int messageTag, ISignalRMessage message, int? requestId = null) { _logger.Info($"Server SendMessageToClient; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}"); await sendTo.OnReceiveMessage(messageTag, message.ToMessagePack(ContractlessStandardResolver.Options), requestId); } - protected void SendRequestToClient(ISignalRHubItemServer sendTo, int messageTag, int requestId) - { - _logger.Info($"Server SendRequestToClient; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}"); + //protected void SendRequestToClient(ISignalRHubItemServer sendTo, int messageTag, int requestId) + //{ + // _logger.Info($"Server SendRequestToClient; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}"); - sendTo.OnRequestMessage(messageTag, requestId).Forget(); - } + // sendTo.OnRequestMessage(messageTag, requestId).Forget(); + //} public async Task SendMessageToGroup(string groupId, int messageTag, string message) { diff --git a/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs b/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs index c81a9fcc..feee21e4 100644 --- a/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs +++ b/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using System.Security.Cryptography.X509Certificates; using AyCode.Core; using AyCode.Core.Enums; using AyCode.Core.Extensions; @@ -12,6 +13,7 @@ using MessagePack; using MessagePack.Resolvers; using Microsoft.AspNetCore.SignalR.Client; using Microsoft.Extensions.DependencyInjection; +using Microsoft.IdentityModel.Tokens; using TIAM.Entities.Transfers; using TIAMWebApp.Shared.Application.Models.ClientSide; using TIAMWebApp.Shared.Application.Utility; @@ -28,7 +30,9 @@ namespace TIAMWebApp.Shared.Application.Services protected readonly LoggerClient Logger; public event Action OnMessageReceived; - public event Action OnMessageRequested; + //public event Action OnMessageRequested; + + public int Timeout = 10000; protected AcSignalRClientBase(string hubName, IEnumerable logWriters) { @@ -41,8 +45,8 @@ namespace TIAMWebApp.Shared.Application.Services HubConnection.Closed += HubConnection_Closed; - _ = HubConnection.On("OnReceiveMessage", OnReceiveMessage); - _ = HubConnection.On(nameof(IAcSignalRHubClient.OnRequestMessage), OnRequestMessage); + _ = HubConnection.On(nameof(IAcSignalRHubClient.OnReceiveMessage), OnReceiveMessage); + //_ = HubConnection.On(nameof(IAcSignalRHubClient.OnRequestMessage), OnRequestMessage); HubConnection.StartAsync().Forget(); @@ -63,7 +67,7 @@ namespace TIAMWebApp.Shared.Application.Services await HubConnection.StartAsync(); if (HubConnection.State != HubConnectionState.Connected) - await TaskHelper.WaitToAsync(() => HubConnection.State == HubConnectionState.Connected, 10000, 25); + await TaskHelper.WaitToAsync(() => HubConnection.State == HubConnectionState.Connected, Timeout, 25); } public async Task StopConnection() @@ -72,60 +76,78 @@ namespace TIAMWebApp.Shared.Application.Services await HubConnection.DisposeAsync(); } - public virtual async Task SendMessageToServerAsync(int messageTag, object message, int? requestId = null) + public virtual Task SendMessageToServerAsync(int messageTag) + => SendMessageToServerAsync(messageTag, null, AcDomain.NextUniqueInt32); + + public virtual Task SendMessageToServerAsync(int messageTag, int requestId) + => SendMessageToServerAsync(messageTag, null, requestId); + + public virtual async Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, int? requestId) { Logger.DebugConditional($"Client SendMessageToServerAsync; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};"); await StartConnection(); - HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, message, requestId).Forget(); + HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, message?.ToMessagePack(ContractlessStandardResolver.Options), requestId).Forget(); } - public virtual void SendRequestToServerAsync(int messageTag) - => SendRequestToServerAsync(messageTag, AcDomain.NextUniqueInt32).Forget(); + public virtual Task SendMessageToServerAsync(int messageTag) where TResponse : class + => SendMessageToServerAsync(messageTag, null, AcDomain.NextUniqueInt32); - public virtual async Task SendRequestToServerAsync(int messageTag, int requestId) + public virtual Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message) where TResponse : class + => SendMessageToServerAsync(messageTag, message, AcDomain.NextUniqueInt32); + + public virtual async Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, int requestId) where TResponse : class { - Logger.DebugConditional($"Client SendRequestToServerAsync; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};"); - - await StartConnection(); - - HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnRequestMessage), messageTag, requestId).Forget(); - } - - public virtual async Task SendRequestToServerAsync(int messageTag) - { - var requestId = AcDomain.NextUniqueInt32; - - Logger.DebugConditional($"Client SendRequestToServerAsync; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};"); + Logger.DebugConditional($"Client SendMessageToServerAsync; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};"); _responseByRequestId[requestId] = null; - await SendRequestToServerAsync(messageTag, requestId); + await SendMessageToServerAsync(messageTag, message, requestId); try { - if (await TaskHelper.WaitToAsync(() => _responseByRequestId[requestId] != null, 10000, 25) && - _responseByRequestId.TryRemove(requestId, out var obj) && obj is byte[] messagePackBytes) + if (await TaskHelper.WaitToAsync(() => _responseByRequestId[requestId] != null, Timeout, 25) && + _responseByRequestId.TryRemove(requestId, out var obj) && obj is ISignalResponseMessage responseMessage) { - var json = messagePackBytes.MessagePackTo(ContractlessStandardResolver.Options); - return json.JsonTo() ?? default; + if (responseMessage.Status == SignalResponseStatus.Error || responseMessage.ResponseData == null) + { + Logger.Error($"Client SendMessageToServerAsync; tag: {messageTag}; Status: {responseMessage.Status}"); + return default; + } + + return responseMessage.ResponseData.JsonTo(); } } catch (Exception ex) { - Logger.Error($"SendRequestToServerAsync; messageTag: {messageTag}; requestId: {requestId}; {ex.Message}", ex); + Logger.Error($"SendMessageToServerAsync; messageTag: {messageTag}; requestId: {requestId}; {ex.Message}", ex); } _responseByRequestId.TryRemove(requestId, out _); return default; } - public virtual Task SendRequestToServerAsync(int messageTag, Action responseCallback) + public virtual Task SendMessageToServerAsync(int messageTag, Action> responseCallback) + => SendMessageToServerAsync(messageTag, null, responseCallback); + + public virtual Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, Action> responseCallback) { var requestId = AcDomain.NextUniqueInt32; - _responseByRequestId[requestId] = responseCallback; - return SendRequestToServerAsync(messageTag, requestId); + _responseByRequestId[requestId] = new Action>(responseMessage => + { + TResponseData? responseData = default; + + if (responseMessage.Status == SignalResponseStatus.Success) + { + responseData = string.IsNullOrEmpty(responseMessage.ResponseData) ? default : responseMessage.ResponseData.JsonTo(); + } + else Logger.Error($"Client SendMessageToServerAsync callback; tag: {messageTag}; Status: {responseMessage.Status}"); + + responseCallback(new SignalResponseMessage(responseMessage.Status, responseData)); + }); + + return SendMessageToServerAsync(messageTag, message, requestId); } public virtual Task OnReceiveMessage(int messageTag, byte[] message, int? requestId) @@ -144,16 +166,18 @@ namespace TIAMWebApp.Shared.Application.Services switch (_responseByRequestId[reqId]) { case null: - _responseByRequestId[reqId] = message; + _responseByRequestId[reqId] = message.MessagePackTo>(); return Task.CompletedTask; - case Action messagePackCallback: + case Action> messagePackCallback: _responseByRequestId.TryRemove(reqId, out _); - messagePackCallback.Invoke(message); + messagePackCallback.Invoke(message.MessagePackTo>(ContractlessStandardResolver.Options)); return Task.CompletedTask; //case Action jsonCallback: + // _responseByRequestId.TryRemove(reqId, out _); + // jsonCallback.Invoke(message.MessagePackTo()); // return Task.CompletedTask; @@ -175,23 +199,22 @@ namespace TIAMWebApp.Shared.Application.Services return Task.CompletedTask; } + //public virtual Task OnRequestMessage(int messageTag, int requestId) + //{ + // Logger.DebugConditional($"Client OnRequestMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};"); - public virtual Task OnRequestMessage(int messageTag, int requestId) - { - Logger.DebugConditional($"Client OnRequestMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};"); + // try + // { + // OnMessageRequested(messageTag, requestId); + // } + // catch(Exception ex) + // { + // Logger.Error($"Client OnReceiveMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; {ex.Message}", ex); + // throw; + // } - try - { - OnMessageRequested(messageTag, requestId); - } - catch(Exception ex) - { - Logger.Error($"Client OnReceiveMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; {ex.Message}", ex); - throw; - } + // return Task.CompletedTask; - return Task.CompletedTask; - - } + //} } } diff --git a/TIAMWebApp/Shared/Services/ServiceProviderDataService.cs b/TIAMWebApp/Shared/Services/ServiceProviderDataService.cs index 83c203d5..382eec30 100644 --- a/TIAMWebApp/Shared/Services/ServiceProviderDataService.cs +++ b/TIAMWebApp/Shared/Services/ServiceProviderDataService.cs @@ -4,7 +4,9 @@ using Microsoft.JSInterop; using Newtonsoft.Json; using SkiaSharp; using System.Net.Http.Json; +using AyCode.Core.Helpers; using AyCode.Services.Loggers; +using AyCode.Services.SignalRs; using TIAM.Core.Loggers; using TIAM.Database.DataLayers.Users; using TIAM.Entities.Products; @@ -14,6 +16,8 @@ using TIAMWebApp.Shared.Application.Interfaces; using TIAMWebApp.Shared.Application.Models; using TIAMWebApp.Shared.Application.Models.ClientSide; using TIAMWebApp.Shared.Application.Utility; +using TIAM.Services; +using System.Linq; namespace TIAMWebApp.Shared.Application.Services { @@ -21,13 +25,16 @@ namespace TIAMWebApp.Shared.Application.Services { private readonly HttpClient http; private readonly ISecureStorageHandler secureStorageHandler; - private readonly ILogger _logger; - + private readonly LoggerClient _logger; - public ServiceProviderDataService(HttpClient http, ISecureStorageHandler secureStorageHandler, IEnumerable logWriters) + private DevAdminSignalClient _devAdminSignalClient; + + public ServiceProviderDataService(HttpClient http, ISecureStorageHandler secureStorageHandler, DevAdminSignalClient devAdminSignalClient, IEnumerable logWriters) { this.http = http; this.secureStorageHandler = secureStorageHandler; + + _devAdminSignalClient = devAdminSignalClient; _logger = new LoggerClient(logWriters.ToArray()); } @@ -70,24 +77,41 @@ namespace TIAMWebApp.Shared.Application.Services //17. public async Task?> GetPropertiesByOwnerIdAsync(Guid id) { - var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetServiceProvidersByOwnerId}"; - var response = await http.PostAsJsonAsync(url, id); - if (response.IsSuccessStatusCode) - { - var result = await response.Content.ReadFromJsonAsync>(); - string resultString = ""; - foreach (var item in result) - { - resultString += item.Value + ", "; - } - _logger.Debug(resultString); - return result; - } - else - { - return null; - } - + Dictionary? companyPropertiesByOwner; + + //_devAdminSignalClient.SendMessageToServerAsync>(SignalRTags.GetPropertiesByOwnerIdAsync, new SignalRequestByIdMessage(id), response => + //{ + // if (response.Status == SignalResponseStatus.Error) + // return; + + // companyPropertiesByOwner = response.ResponseData; + // if (companyPropertiesByOwner != null) _logger.DetailConditional($"companyPropertiesByOwner async: {string.Join("; ", companyPropertiesByOwner.Values)}"); + //}).Forget(); + + + companyPropertiesByOwner = await _devAdminSignalClient.SendMessageToServerAsync>(SignalRTags.GetPropertiesByOwnerIdAsync, new SignalRequestByIdMessage(id)); + if (companyPropertiesByOwner != null) _logger.DetailConditional($"companyPropertiesByOwner: {string.Join("; ", companyPropertiesByOwner.Values)}"); + + return companyPropertiesByOwner; + + //var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetServiceProvidersByOwnerId}"; + //var response = await http.PostAsJsonAsync(url, id); + //if (response.IsSuccessStatusCode) + //{ + // var result = await response.Content.ReadFromJsonAsync>(); + // string resultString = ""; + // foreach (var item in result) + // { + // resultString += item.Value + ", "; + // } + // _logger.DetailConditional(resultString); + // return result; + //} + //else + //{ + // return null; + //} + } //18. diff --git a/TIAMWebApp/Shared/TIAMWebApp.Shared.Application.csproj b/TIAMWebApp/Shared/TIAMWebApp.Shared.Application.csproj index 603e5382..c4958048 100644 --- a/TIAMWebApp/Shared/TIAMWebApp.Shared.Application.csproj +++ b/TIAMWebApp/Shared/TIAMWebApp.Shared.Application.csproj @@ -36,6 +36,7 @@ +