diff --git a/TIAM.Core/Loggers/Logger.cs b/TIAM.Core/Loggers/Logger.cs index c40f3bd8..42a49c1f 100644 --- a/TIAM.Core/Loggers/Logger.cs +++ b/TIAM.Core/Loggers/Logger.cs @@ -3,7 +3,7 @@ using AyCode.Core.Loggers; namespace TIAM.Core.Loggers; -public class Logger : AcLoggerBase, ILogger +public class Logger : Logger, ILogger { public Logger() : base(typeof(TCategory).Name) { } diff --git a/TIAM.Entities/Transfers/Transfer.cs b/TIAM.Entities/Transfers/Transfer.cs index 6238d728..038ddc4c 100644 --- a/TIAM.Entities/Transfers/Transfer.cs +++ b/TIAM.Entities/Transfers/Transfer.cs @@ -25,6 +25,7 @@ public class Transfer: IEntityGuid, IAcFullName, ITimeStampInfo, IProductForeign //public Guid? UserProductMappingId { get; set; } //public Guid? UserProductToCarId { get; set; } + public string? PaymentId { get; set; } //public virtual UserProductMapping? UserProductMapping { get; set; } public virtual List TransferToDrivers { get; set; } diff --git a/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor b/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor index 23a39d8e..296eb943 100644 --- a/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor +++ b/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor @@ -16,13 +16,17 @@ @using TIAMWebApp.Shared.Application.Utility @using AyCode.Core.Loggers @using AyCode.Services.Loggers +@using AyCode.Services.SignalRs @using TIAM.Core.Loggers +@using TIAMWebApp.Shared.Application.Services +@using AyCode.Core.Helpers @layout AdminLayout @inject IEnumerable LogWriters @inject IStringLocalizer localizer @inject IWizardProcessor wizardProcessor @inject ITransferDataService transferDataService @inject ISessionService sessionService +@* @inject DevAdminSignalClient DevAdminSignalClient; *@ Transfers
@@ -387,6 +391,8 @@ { _logger = new LoggerClient(LogWriters.ToArray()); + //await DevAdminSignalClient.Get("", SignalRTags.GetTransfersAsync); + TransferDataList = await transferDataService.GetTransfersAsync(); AppointmentModels = new List(TransferDataList.Count); diff --git a/TIAMSharedUI/Shared/AdminLayout.razor b/TIAMSharedUI/Shared/AdminLayout.razor index b9eabd01..e7a97b09 100644 --- a/TIAMSharedUI/Shared/AdminLayout.razor +++ b/TIAMSharedUI/Shared/AdminLayout.razor @@ -51,7 +51,7 @@ protected override void OnInitialized() { - _logger = new LoggerClient(LogWriters.ToArray()); + _logger = new LoggerClient(LogWriters.ToArray()); base.OnInitialized(); } @@ -68,10 +68,10 @@ } catch (Exception loggerException) { - jsRuntime.InvokeVoidAsync("console.error", $"{nameof(MainLayout)}->HandleError; Logger error! {loggerException}"); + jsRuntime.InvokeVoidAsync("console.error", $"{nameof(AdminLayout)}->HandleError; Logger error! {loggerException}"); - jsRuntime.InvokeVoidAsync("console.error", $"{nameof(MainLayout)}->{memberName}; An error occurred: {exception}"); - //jsRuntime.InvokeVoidAsync("console.warn", $"{nameof(MainLayout)}->{memberName}; Error details: {exception.StackTrace}"); + jsRuntime.InvokeVoidAsync("console.error", $"{nameof(AdminLayout)}->{memberName}; An error occurred: {exception}"); + //jsRuntime.InvokeVoidAsync("console.warn", $"{nameof(AdminLayout)}->{memberName}; Error details: {exception.StackTrace}"); } // Log the error to server diff --git a/TIAMSharedUI/Shared/MainLayout.razor b/TIAMSharedUI/Shared/MainLayout.razor index 193972f5..4f20df2e 100644 --- a/TIAMSharedUI/Shared/MainLayout.razor +++ b/TIAMSharedUI/Shared/MainLayout.razor @@ -18,11 +18,8 @@ @inject NavigationManager NavManager @inject IJSRuntime jsRuntime @inject ISecureStorageHandler SecureStorageHandler -@inject ISessionService sessionService @inject IEnumerable LogWriters - -
@@ -61,10 +58,19 @@ protected override void OnInitialized() { _logger = new LoggerClient(LogWriters.ToArray()); - + //_logger.Writer()?.StartConnection(Setting.UserBasicDetails?.RefreshToken ?? Guid.NewGuid().ToString("N")); + base.OnInitialized(); } + protected override void OnAfterRender(bool firstRender) + { + // if (firstRender) + // _logger.Writer()?.StartConnection(Setting.UserBasicDetails?.RefreshToken ?? Guid.NewGuid().ToString("N")); + + base.OnAfterRender(firstRender); + } + private void HandleError(Exception exception)//, [CallerMemberName] string? memberName = null) { exception.GetCategoryAndMemberNameFromStackTraceString(out var memberName, out var categoryName); diff --git a/TIAMWebApp/Client/Program.cs b/TIAMWebApp/Client/Program.cs index f8dee3a1..d04a513f 100644 --- a/TIAMWebApp/Client/Program.cs +++ b/TIAMWebApp/Client/Program.cs @@ -40,7 +40,9 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(x => new ResourceManager("TIAMWebApp.Client.Resources.MyResources", typeof(Program).Assembly)); builder.Services.AddSingleton(); -builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +//builder.Services.AddSingleton(); +//builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); diff --git a/TIAMWebApp/Client/Services/UserDataServiceWeb.cs b/TIAMWebApp/Client/Services/UserDataServiceWeb.cs index 448b6cf3..2b682851 100644 --- a/TIAMWebApp/Client/Services/UserDataServiceWeb.cs +++ b/TIAMWebApp/Client/Services/UserDataServiceWeb.cs @@ -26,7 +26,7 @@ namespace TIAMWebApp.Client.Services private readonly ISecureStorageHandler secureStorageHandler; //private readonly BrowserConsoleLogWriter _browserConsoleLogWriter; private readonly IServiceProviderDataService serviceProviderDataService; - private readonly ILogger _logger; + private readonly LoggerClient _logger; public Dictionary userRoleTypes { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } diff --git a/TIAMWebApp/Server/Controllers/LoggerApiController.cs b/TIAMWebApp/Server/Controllers/LoggerApiController.cs index 52c3f3b0..0d63193b 100644 --- a/TIAMWebApp/Server/Controllers/LoggerApiController.cs +++ b/TIAMWebApp/Server/Controllers/LoggerApiController.cs @@ -44,9 +44,8 @@ namespace TIAMWebApp.Server.Controllers } catch (Exception ex) { - Console.WriteLine($@"ERROR!!! {nameof(LoggerApiController)}->WriteLogItem; ex: {ex.Message}{AcEnv.NL}{AcEnv.NL}{ex}"); + Console.WriteLine($@"ERROR!!! {nameof(LoggerApiController)}->AddLogItem; ex: {ex.Message}{AcEnv.NL}{AcEnv.NL}{ex}"); } } - } } \ No newline at end of file diff --git a/TIAMWebApp/Server/Program.cs b/TIAMWebApp/Server/Program.cs index 888355ac..291fcb28 100644 --- a/TIAMWebApp/Server/Program.cs +++ b/TIAMWebApp/Server/Program.cs @@ -4,6 +4,8 @@ using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using System.Text; using AyCode.Core.Loggers; +using MessagePack; +using MessagePack.Resolvers; using TIAM.Core.Loggers; using TIAM.Database; using TIAM.Database.DataLayers.Admins; @@ -40,7 +42,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); -builder.Services.AddSignalR(); +builder.Services.AddSignalR().AddMessagePackProtocol(options => options.SerializerOptions = MessagePackSerializerOptions.Standard.WithSecurity(MessagePackSecurity.UntrustedData)); builder.Services.AddCors(options => { @@ -172,8 +174,12 @@ app.UseAuthorization(); app.MapRazorPages(); app.MapControllers(); app.MapBlazorHub(); -app.MapHub("/myhub"); -app.MapHub("/adminhub"); + +//app.UseResponseCompression(); +app.MapHub("/TiamChatHub"); +app.MapHub("/TiamLoggerHub"); +//app.MapHub("/DevAdminHub"); + app.MapFallbackToFile("index.html"); app.Run(); diff --git a/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs b/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs index 79a99477..9599d4fb 100644 --- a/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs +++ b/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs @@ -1,34 +1,48 @@ -using Microsoft.AspNetCore.SignalR; +using AyCode.Core.Loggers; +using Microsoft.AspNetCore.SignalR; +using System.ServiceModel.Channels; +using AyCode.Services.Server.SignalRs; +using AyCode.Services.SignalRs; +using TIAM.Database.DataLayers.Admins; namespace TIAMWebApp.Server.Services; -public class DevAdminSignalRHub : Hub + +public class DevAdminSignalRHub(AdminDal adminDal, IEnumerable logWriters) : Hub, ISignalRHubServer { - public async Task SendMessage(string user, string message) + private TIAM.Core.Loggers.Logger _logger = new(logWriters.ToArray()); + + // https://docs.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-3.1#strongly-typed-hubs + public override async Task OnConnectedAsync() { - await Clients.All.SendAsync("ReceiveMessage", user, message); + //await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users"); + await base.OnConnectedAsync(); } - public async Task MuteChat(string user) + public override async Task OnDisconnectedAsync(Exception exception) { - - await Clients.All.SendAsync("UserMuted", user); - - } - - public async Task LoggedInToChat(string user) - { - - await Clients.All.SendAsync("UserLoggedInToChat", user); - - } - - public async Task LoggedOutFromChat(string user) - { - - await Clients.All.SendAsync("UserLoggedOutFromChat", user); - + _logger.Error($"OnDisconnectedAsync", exception); + + //await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users"); + await base.OnDisconnectedAsync(exception); } + public async Task SendMessageToGroup(string groupId, int messageTag, string message) + { + //await Clients.Group(groupId).Post("", messageTag, message); + } -} + public async Task Get(string user, int messageTag) + { + _logger.Info($"{nameof(user)}: {user}; {nameof(messageTag)}: {messageTag}"); + if (messageTag == SignalRTags.GetTransfersAsync) + await Post("", SignalRTags.PostTransfersAsync, await adminDal.GetTransfersJsonAsync()); + } + + public async Task Post(string user, int messageTag, object? message) + { + _logger.Info($"{nameof(user)}: {user}; {nameof(messageTag)}: {messageTag}"); + + await Clients.Caller.Post("", messageTag, message); + } +} \ No newline at end of file diff --git a/TIAMWebApp/Server/Services/ISignalRHub.cs b/TIAMWebApp/Server/Services/ISignalRHub.cs new file mode 100644 index 00000000..f4a7a14a --- /dev/null +++ b/TIAMWebApp/Server/Services/ISignalRHub.cs @@ -0,0 +1,7 @@ +using AyCode.Services.Server.SignalRs; + +namespace TIAMWebApp.Server.Services; + +public interface ISignalRHubServer : IAcSignalRHubServer +{ +} \ No newline at end of file diff --git a/TIAMWebApp/Server/Services/LoggerSignalRHub.cs b/TIAMWebApp/Server/Services/LoggerSignalRHub.cs new file mode 100644 index 00000000..48c357f0 --- /dev/null +++ b/TIAMWebApp/Server/Services/LoggerSignalRHub.cs @@ -0,0 +1,36 @@ +using AyCode.Core.Consts; +using AyCode.Entities.Server.LogItems; +using Microsoft.AspNetCore.SignalR; +using TIAM.Database; + +namespace TIAMWebApp.Server.Services; + + +public class LoggerSignalRHub(LoggerToLoggerApiController logger) : Hub +{ + public void AddLogItem(AcLogItem? logItem) + { + try + { + if (logItem == null) + { + logger.Error("AddLogItem; LogItem == null"); + //_logger.Writer().Detail(""); + + return; + } + + //logItem.LogHeaderId = ??? + logItem.TimeStampUtc = DateTime.UtcNow; + + logger.Write(logItem); + + //_logger.Writer()?.Write(logItem.AppType, logItem.LogLevel, logItem.Text, logItem.CallerName, logItem.CategoryName, logItem.ErrorType, logItem.Exception); + //_logger.Writer().WriteLogItemAsync(logItem); + } + catch (Exception ex) + { + Console.WriteLine($@"ERROR!!! {nameof(LoggerSignalRHub)}->AddLogItem; ex: {ex.Message}{AcEnv.NL}{AcEnv.NL}{ex}"); + } + } +} \ No newline at end of file diff --git a/TIAMWebApp/Server/Services/SignalRhub.cs b/TIAMWebApp/Server/Services/SignalRhub.cs index d8e6286c..36d27203 100644 --- a/TIAMWebApp/Server/Services/SignalRhub.cs +++ b/TIAMWebApp/Server/Services/SignalRhub.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.SignalR; namespace TIAMWebApp.Server.Services; + public class SignalRHub : Hub { public async Task SendMessage(string user, string message) @@ -10,25 +11,17 @@ public class SignalRHub : Hub public async Task MuteChat(string user) { - await Clients.All.SendAsync("UserMuted", user); - } public async Task LoggedInToChat(string user) { - await Clients.All.SendAsync("UserLoggedInToChat", user); - } public async Task LoggedOutFromChat(string user) { - await Clients.All.SendAsync("UserLoggedOutFromChat", user); - } - - } diff --git a/TIAMWebApp/Server/TIAMWebApp.Server.csproj b/TIAMWebApp/Server/TIAMWebApp.Server.csproj index 6d508868..47a184b0 100644 --- a/TIAMWebApp/Server/TIAMWebApp.Server.csproj +++ b/TIAMWebApp/Server/TIAMWebApp.Server.csproj @@ -13,6 +13,7 @@ + diff --git a/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs b/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs new file mode 100644 index 00000000..50680078 --- /dev/null +++ b/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs @@ -0,0 +1,73 @@ +using AyCode.Core.Enums; +using AyCode.Core.Helpers; +using AyCode.Core.Loggers; +using AyCode.Entities.LogItems; +using AyCode.Services.Loggers; +using AyCode.Services.SignalRs; +using MessagePack; +using Microsoft.AspNetCore.SignalR.Client; +using Microsoft.Extensions.DependencyInjection; +using TIAMWebApp.Shared.Application.Models.ClientSide; +using TIAMWebApp.Shared.Application.Utility; + +namespace TIAMWebApp.Shared.Application.Services +{ + public class DevAdminSignalClient(IEnumerable logWriters) : AcSignalRClientBase("DevAdminHub", logWriters); + + public abstract class AcSignalRClientBase : IAcSignalRHubClient + { + protected readonly HubConnection HubConnection; + protected readonly LoggerClient Logger; + + protected AcSignalRClientBase(string hubName, IEnumerable logWriters) + { + Logger = new LoggerClient(GetType().Name, logWriters.ToArray()); + + HubConnection = new HubConnectionBuilder() + .WithUrl($"{Setting.BaseUrl}/{hubName}") + //.AddMessagePackProtocol(options => options.SerializerOptions = MessagePackSerializerOptions.Standard.WithSecurity(MessagePackSecurity.UntrustedData)) + .Build(); + + HubConnection.On("Post", Post); + + HubConnection.StartAsync().Forget(); + } + + public async Task StartConnection() + { + if (HubConnection.State == HubConnectionState.Disconnected) + await HubConnection.StartAsync(); + + if (HubConnection.State != HubConnectionState.Connected) + await TaskHelper.WaitToAsync(() => HubConnection.State == HubConnectionState.Connected, 3000, 100); + } + + public async Task StopConnection() + { + await HubConnection.StopAsync(); + await HubConnection.DisposeAsync(); + } + + public virtual async Task Get(string user, int messageTag) + { + Logger.Info($"{nameof(user)}: {user}; {nameof(messageTag)}: {messageTag}"); + + await StartConnection(); + + await HubConnection.SendAsync("Get", "", SignalRTags.GetTransfersAsync); + } + + public virtual async Task Post(string user, int messageTag, object? message) + { + Logger.Info($"{nameof(user)}: {user}; {nameof(messageTag)}: {messageTag}"); + + if (messageTag == SignalRTags.PostTransfersAsync) + { + return; + } + + await StartConnection(); + await HubConnection.SendAsync("Post", SignalRTags.PostTransfersAsync, message); + } + } +} diff --git a/TIAMWebApp/Shared/Services/SignalRService.cs b/TIAMWebApp/Shared/Services/SignalRService.cs index 5dad976c..0ce24db1 100644 --- a/TIAMWebApp/Shared/Services/SignalRService.cs +++ b/TIAMWebApp/Shared/Services/SignalRService.cs @@ -17,7 +17,7 @@ namespace TIAMWebApp.Shared.Application.Services public async Task StartConnection(string userName) { _hubConnection = new HubConnectionBuilder() - .WithUrl($"{Setting.BaseUrl}/myhub") + .WithUrl($"{Setting.BaseUrl}/TiamChatHub") .Build(); _hubConnection.On("ReceiveMessage", (user, message) => diff --git a/TIAMWebApp/Shared/TIAMWebApp.Shared.Application.csproj b/TIAMWebApp/Shared/TIAMWebApp.Shared.Application.csproj index 1dd158de..e48df739 100644 --- a/TIAMWebApp/Shared/TIAMWebApp.Shared.Application.csproj +++ b/TIAMWebApp/Shared/TIAMWebApp.Shared.Application.csproj @@ -23,8 +23,8 @@ - + diff --git a/TIAMWebApp/Shared/Utility/HttpClientLogItemWriter.cs b/TIAMWebApp/Shared/Utility/HttpClientLogItemWriter.cs index 2964d132..2f66b61f 100644 --- a/TIAMWebApp/Shared/Utility/HttpClientLogItemWriter.cs +++ b/TIAMWebApp/Shared/Utility/HttpClientLogItemWriter.cs @@ -4,6 +4,7 @@ using TIAMWebApp.Shared.Application.Models; using System.Net.Http.Json; using AyCode.Core.Helpers; using AyCode.Core.Loggers; +using AyCode.Entities.LogItems; namespace TIAMWebApp.Shared.Application.Utility; diff --git a/TIAMWebApp/Shared/Utility/LoggerClient.cs b/TIAMWebApp/Shared/Utility/LoggerClient.cs index f58c11ab..c4277ffe 100644 --- a/TIAMWebApp/Shared/Utility/LoggerClient.cs +++ b/TIAMWebApp/Shared/Utility/LoggerClient.cs @@ -5,14 +5,30 @@ using TIAM.Core.Loggers; namespace TIAMWebApp.Shared.Application.Utility; -public class LoggerClient : Logger, ILogger +public class LoggerClient : Logger, ILogger +{ + public LoggerClient() : this(null) + { + } + + public LoggerClient(string? categoryName) : base(AppType.Web, LogLevel.Detail, categoryName) + { } + + public LoggerClient(string? categoryName, params IAcLogWriterBase[] logWriters) : base(AppType.Web, LogLevel.Detail, categoryName, logWriters) + { } + + public LoggerClient(AppType appType, LogLevel logLevel, string? categoryName, params IAcLogWriterBase[] logWriters) : base(appType, logLevel, categoryName, logWriters) + { } +} + +public class LoggerClient : LoggerClient, ILogger { public LoggerClient() : base(AppType.Web, LogLevel.Detail, typeof(TCategory).Name) { } public LoggerClient(params IAcLogWriterClientBase[] logWriters) : base(AppType.Web, LogLevel.Detail, typeof(TCategory).Name, logWriters) { } - + public LoggerClient(AppType appType, LogLevel logLevel, params IAcLogWriterClientBase[] logWriters) : base(appType, logLevel, typeof(TCategory).Name, logWriters) { } } \ No newline at end of file diff --git a/TIAMWebApp/Shared/Utility/SignaRClientLogItemWriter.cs b/TIAMWebApp/Shared/Utility/SignaRClientLogItemWriter.cs new file mode 100644 index 00000000..1e3caea0 --- /dev/null +++ b/TIAMWebApp/Shared/Utility/SignaRClientLogItemWriter.cs @@ -0,0 +1,59 @@ +using AyCode.Core.Enums; +using AyCode.Core.Helpers; +using AyCode.Core.Loggers; +using AyCode.Entities; +using AyCode.Entities.LogItems; +using AyCode.Services.Loggers; +using MessagePack; +using Microsoft.AspNetCore.SignalR.Client; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using TIAMWebApp.Shared.Application.Models.ClientSide; + +namespace TIAMWebApp.Shared.Application.Utility +{ + public class SignaRClientLogItemWriter : AcLogItemWriterBase, IAcLogWriterClientBase + { + private readonly HubConnection _hubConnection = new HubConnectionBuilder() + .WithUrl($"{Setting.BaseUrl}/TiamLoggerHub") + .AddMessagePackProtocol(options => options.SerializerOptions = MessagePackSerializerOptions.Standard.WithSecurity(MessagePackSecurity.UntrustedData)) + .Build(); + + public SignaRClientLogItemWriter() : base(AppType.Web, LogLevel.Detail) + { + _hubConnection.StartAsync().Forget(); + } + + public async Task StartConnection() + { + if (_hubConnection.State == HubConnectionState.Disconnected) + await _hubConnection.StartAsync(); + + if (_hubConnection.State != HubConnectionState.Connected) + await TaskHelper.WaitToAsync(() => _hubConnection.State == HubConnectionState.Connected, 3000, 100); + } + + public async Task StopConnection() + { + await _hubConnection.StopAsync(); + await _hubConnection.DisposeAsync(); + } + + public override void Write(AppType appType, LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName, string? errorType, string? exMessage) + => WriteLogItem(CreateLogItem(DateTime.UtcNow, appType, Environment.CurrentManagedThreadId, logLevel, logText, callerMemberName, categoryName, errorType, exMessage)); + + protected override async void WriteLogItemCallback(AcLogItemClient logItem) + { + //Ez fontos, mert a signalR nem küldi a DateTime.Kind-ot! A szeró oldalon kap egy utc DateTime-ot, ami a kliens lokális DateTime-ját tartalmazza! - J. + logItem.TimeStampUtc = logItem.TimeStampUtc.ToUniversalTime(); + + await StartConnection(); + + if (_hubConnection.State != HubConnectionState.Connected) + return; + + //var refreshToken = Setting.UserBasicDetails?.RefreshToken ?? Guid.NewGuid().ToString("N"); + _hubConnection.SendAsync("AddLogItem", /*refreshToken,*/ logItem).Forget(); + } + } +}