SignalR logger, PaymentId to Transfer, etc...

This commit is contained in:
jozsef.b@aycode.com 2024-05-22 11:22:51 +02:00
parent 9efe9ad250
commit 1cfa0c645d
20 changed files with 271 additions and 51 deletions

View File

@ -3,7 +3,7 @@ using AyCode.Core.Loggers;
namespace TIAM.Core.Loggers;
public class Logger<TCategory> : AcLoggerBase, ILogger<TCategory>
public class Logger<TCategory> : Logger, ILogger<TCategory>
{
public Logger() : base(typeof(TCategory).Name)
{ }

View File

@ -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<TransferToDriver> TransferToDrivers { get; set; }

View File

@ -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<IAcLogWriterClientBase> LogWriters
@inject IStringLocalizer<TIAMResources> localizer
@inject IWizardProcessor wizardProcessor
@inject ITransferDataService transferDataService
@inject ISessionService sessionService
@* @inject DevAdminSignalClient DevAdminSignalClient; *@
<PageTitle>Transfers</PageTitle>
<div class="text-center m-5">
@ -387,6 +391,8 @@
{
_logger = new LoggerClient<ManageTransfers>(LogWriters.ToArray());
//await DevAdminSignalClient.Get("", SignalRTags.GetTransfersAsync);
TransferDataList = await transferDataService.GetTransfersAsync();
AppointmentModels = new List<AppointmentModel>(TransferDataList.Count);

View File

@ -51,7 +51,7 @@
protected override void OnInitialized()
{
_logger = new LoggerClient<MainLayout>(LogWriters.ToArray());
_logger = new LoggerClient<AdminLayout>(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

View File

@ -18,11 +18,8 @@
@inject NavigationManager NavManager
@inject IJSRuntime jsRuntime
@inject ISecureStorageHandler SecureStorageHandler
@inject ISessionService sessionService
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
<!--div-- class="page"-->
<div>
@ -61,10 +58,19 @@
protected override void OnInitialized()
{
_logger = new LoggerClient<MainLayout>(LogWriters.ToArray());
//_logger.Writer<SignaRClientLogItemWriter>()?.StartConnection(Setting.UserBasicDetails?.RefreshToken ?? Guid.NewGuid().ToString("N"));
base.OnInitialized();
}
protected override void OnAfterRender(bool firstRender)
{
// if (firstRender)
// _logger.Writer<SignaRClientLogItemWriter>()?.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);

View File

@ -40,7 +40,9 @@ builder.Services.AddScoped<IImageDataService, ImageDataService>();
builder.Services.AddScoped<SessionStorageAccessor>();
builder.Services.AddSingleton(x => new ResourceManager("TIAMWebApp.Client.Resources.MyResources", typeof(Program).Assembly));
builder.Services.AddSingleton<IAcLogWriterClientBase, BrowserConsoleLogWriter>();
builder.Services.AddSingleton<IAcLogWriterClientBase, HttpClientLogItemWriter>();
builder.Services.AddSingleton<IAcLogWriterClientBase, SignaRClientLogItemWriter>();
//builder.Services.AddSingleton<IAcLogWriterClientBase, HttpClientLogItemWriter>();
//builder.Services.AddSingleton<DevAdminSignalClient>();
builder.Services.AddSingleton<SignalRService>();
builder.Services.AddSingleton<SumupService>();

View File

@ -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<UserDataServiceWeb> _logger;
public Dictionary<int, string> userRoleTypes { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

View File

@ -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}");
}
}
}
}

View File

@ -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<AdminDal>();
builder.Services.AddScoped<AuctionDal>();
builder.Services.AddScoped<TransferDestinationDal>();
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<SignalRHub>("/myhub");
app.MapHub<DevAdminSignalRHub>("/adminhub");
//app.UseResponseCompression();
app.MapHub<SignalRHub>("/TiamChatHub");
app.MapHub<LoggerSignalRHub>("/TiamLoggerHub");
//app.MapHub<DevAdminSignalRHub>("/DevAdminHub");
app.MapFallbackToFile("index.html");
app.Run();

View File

@ -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<IAcLogWriterBase> logWriters) : Hub<ISignalRHubServer>, ISignalRHubServer
{
public async Task SendMessage(string user, string message)
private TIAM.Core.Loggers.Logger<DevAdminSignalRHub> _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);
}
}

View File

@ -0,0 +1,7 @@
using AyCode.Services.Server.SignalRs;
namespace TIAMWebApp.Server.Services;
public interface ISignalRHubServer : IAcSignalRHubServer
{
}

View File

@ -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<ConsoleLogWriter>().Detail("");
return;
}
//logItem.LogHeaderId = ???
logItem.TimeStampUtc = DateTime.UtcNow;
logger.Write(logItem);
//_logger.Writer<IAcConsoleLogWriter>()?.Write(logItem.AppType, logItem.LogLevel, logItem.Text, logItem.CallerName, logItem.CategoryName, logItem.ErrorType, logItem.Exception);
//_logger.Writer<DbLogItemWriter>().WriteLogItemAsync(logItem);
}
catch (Exception ex)
{
Console.WriteLine($@"ERROR!!! {nameof(LoggerSignalRHub)}->AddLogItem; ex: {ex.Message}{AcEnv.NL}{AcEnv.NL}{ex}");
}
}
}

View File

@ -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);
}
}

View File

@ -13,6 +13,7 @@
<PackageReference Include="GoogleApi" Version="5.4.3" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.5" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="8.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.5" />
<PackageReference Include="Microsoft.OpenApi" Version="1.6.14" />
<PackageReference Include="QRCoderNetCore" Version="1.0.0" />

View File

@ -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<IAcLogWriterClientBase> logWriters) : AcSignalRClientBase("DevAdminHub", logWriters);
public abstract class AcSignalRClientBase : IAcSignalRHubClient
{
protected readonly HubConnection HubConnection;
protected readonly LoggerClient Logger;
protected AcSignalRClientBase(string hubName, IEnumerable<IAcLogWriterClientBase> 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<string, int, object?>("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);
}
}
}

View File

@ -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<string, string>("ReceiveMessage", (user, message) =>

View File

@ -23,8 +23,8 @@
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="8.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="5.0.17" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.5" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="8.0.5" />
<PackageReference Include="Microsoft.JSInterop" Version="8.0.5" />
<PackageReference Include="SkiaSharp" Version="2.88.8" />
<PackageReference Include="SkiaSharp.Views.Desktop.Common" Version="2.88.8" />

View File

@ -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;

View File

@ -5,14 +5,30 @@ using TIAM.Core.Loggers;
namespace TIAMWebApp.Shared.Application.Utility;
public class LoggerClient<TCategory> : Logger, ILogger<TCategory>
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<TCategory> : LoggerClient, ILogger<TCategory>
{
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)
{ }
}

View File

@ -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<AcLogItemClient>, 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();
}
}
}