SignalRServer InvokeMethodByMessageTag is in progress...

This commit is contained in:
jozsef.b@aycode.com 2024-05-31 20:52:22 +02:00
parent 40d8937654
commit e741f54555
4 changed files with 185 additions and 72 deletions

View File

@ -45,6 +45,7 @@ namespace TIAM.Database.DataLayers.Admins
public Task<List<Transfer>> GetTransfersAsync() => SessionAsync(ctx => ctx.GetTransfers().OrderBy(x => x.TransferStatusType).ThenByDescending(x => x.OrderId).ToList()); public Task<List<Transfer>> GetTransfersAsync() => SessionAsync(ctx => ctx.GetTransfers().OrderBy(x => x.TransferStatusType).ThenByDescending(x => x.OrderId).ToList());
public Task<string> GetTransfersJsonAsync() => SessionAsync(ctx => ctx.GetTransfers().OrderBy(x => x.TransferStatusType).ThenByDescending(x => x.OrderId).ToJson()); public Task<string> GetTransfersJsonAsync() => SessionAsync(ctx => ctx.GetTransfers().OrderBy(x => x.TransferStatusType).ThenByDescending(x => x.OrderId).ToJson());
public string GetTransfersJson() => Session(ctx => ctx.GetTransfers().OrderBy(x => x.TransferStatusType).ThenByDescending(x => x.OrderId).ToJson());
public Transfer? GetTransferById(Guid transferId) => Session(ctx => ctx.GetTransferById(transferId)); public Transfer? GetTransferById(Guid transferId) => Session(ctx => ctx.GetTransferById(transferId));
public string? GetTransferJsonById(Guid transferId) => Session(ctx => ctx.GetTransferById(transferId)?.ToJson()); public string? GetTransferJsonById(Guid transferId) => Session(ctx => ctx.GetTransferById(transferId)?.ToJson());
@ -236,10 +237,9 @@ namespace TIAM.Database.DataLayers.Admins
public Task<List<Company>> GetServiceProvidersAsync() => SessionAsync(ctx => ctx.GetServiceProviders().ToList()); public Task<List<Company>> GetServiceProvidersAsync() => SessionAsync(ctx => ctx.GetServiceProviders().ToList());
public Task<string> GetServiceProvidersJsonAsync() public Task<string> GetServiceProvidersJsonAsync() => SessionAsync(ctx => ctx.Companies.ToJson());
{ public string GetServiceProvidersJson() => Session(ctx => ctx.Companies.ToJson());
return SessionAsync(ctx => ctx.Companies.ToJson());
}
public virtual Task<Company?> GetServiceProviderByIdAsync(Guid id) => SessionAsync(ctx => ctx.GetServiceProviderById(id)); public virtual Task<Company?> GetServiceProviderByIdAsync(Guid id) => SessionAsync(ctx => ctx.GetServiceProviderById(id));

View File

@ -1,3 +1,4 @@
using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using QRCoder; using QRCoder;
@ -12,6 +13,11 @@ using Product = TIAM.Entities.Products.Product;
using TIAM.Entities.Addresses; using TIAM.Entities.Addresses;
using TIAM.Entities.Profiles; using TIAM.Entities.Profiles;
using AyCode.Core.Loggers; using AyCode.Core.Loggers;
using AyCode.Services.SignalRs;
using AyCode.Utils.Extensions;
using TIAM.Services;
using TIAMWebApp.Server.Services;
using TIAM.Entities.Transfers;
namespace TIAMWebApp.Server.Controllers namespace TIAMWebApp.Server.Controllers
{ {
@ -51,7 +57,7 @@ namespace TIAMWebApp.Server.Controllers
//no owner set yet //no owner set yet
var ownerId = serviceProvider.OwnerId == Guid.Empty ? null : serviceProvider.OwnerId; var ownerId = serviceProvider.OwnerId == Guid.Empty ? null : serviceProvider.OwnerId;
ownerId = Guid.Parse("540271F6-C604-4C16-8160-D5A7CAFEDF00"); //TESZT - J. //ownerId = Guid.Parse("540271F6-C604-4C16-8160-D5A7CAFEDF00"); //TESZT - J.
if (name is null) if (name is null)
{ {
@ -59,28 +65,12 @@ namespace TIAMWebApp.Server.Controllers
} }
else else
{ {
var company = new Company(id, name, ownerId, Guid.NewGuid())
_logger.Info($@"ServiceProvider to be creating; id: {id}, name: {name}, ownerId: {ownerId}");
var toCreate = new Company(id, name, ownerId, Guid.NewGuid())
{ {
CommissionPercent = commissionRate CommissionPercent = commissionRate
}; };
toCreate.SetProfile(new Profile(Guid.NewGuid(), toCreate.Name)); return await AddCompanyAsync(company);
toCreate.Profile.SetAddress(new Address(Guid.NewGuid(), "Controller CreateServiceProvider; address text..."));
var result = await adminDal.CreateServiceProviderAsync(toCreate);
if (!result)
{
serviceProvider = null;
return string.Empty;//BadRequest(result);
}
else
{
return toCreate.ToJson();//Ok(toCreate);
}
} }
} }
@ -92,15 +82,48 @@ namespace TIAMWebApp.Server.Controllers
} }
} }
[SignalR(SignalRTags.AddCompanyAsync, MethodParamType.Object, typeof(Company))]
public async Task<string> AddCompanyAsync(Company company)
{
if (company.Id.IsNullOrEmpty()) company.Id = Guid.NewGuid();
_logger.Info($@"ServiceProvider to be creating; id: {company.Id}, name: {company.Name}, ownerId: {company.OwnerId}");
company.SetProfile(new Profile(Guid.NewGuid(), company.Name));
company.Profile.SetAddress(new Address(Guid.NewGuid(), "Controller AddCompanyAsync; address text..."));
var result = await adminDal.CreateServiceProviderAsync(company);
if (!result)
{
return string.Empty;//BadRequest(result);
}
else
{
return company.ToJson();//Ok(toCreate);
}
}
//16. //16.
[AllowAnonymous] [AllowAnonymous]
[HttpGet] [HttpGet]
[Route(APIUrls.GetServiceProvidersRouteName)] [Route(APIUrls.GetServiceProvidersRouteName)]
[SignalR(SignalRTags.GetCompaniesAsync, MethodParamType.None)]
public async Task<string> GetServiceProviders() public async Task<string> GetServiceProviders()
{ {
return await adminDal.GetServiceProvidersJsonAsync(); return await adminDal.GetServiceProvidersJsonAsync();
} }
//[AllowAnonymous]
//[HttpGet]
//[Route(APIUrls.GetServiceProvidersRouteName)]
//public Task<string> GetServiceProviders() => Task.FromResult(GetServiceProvidersMethod());
//[SignalR(SignalRTags.GetCompaniesAsync)]
//public string GetServiceProvidersMethod()
//{
// return adminDal.GetServiceProvidersJson();
//}
//18. //18.
[AllowAnonymous] [AllowAnonymous]
[HttpPost] [HttpPost]
@ -115,6 +138,7 @@ namespace TIAMWebApp.Server.Controllers
[AllowAnonymous] [AllowAnonymous]
[HttpPost] [HttpPost]
[Route(APIUrls.UpdateServiceProviderRouteName)] [Route(APIUrls.UpdateServiceProviderRouteName)]
[SignalR(SignalRTags.UpdateCompanyAsync, MethodParamType.Object, typeof(Company))]
public async Task<string> UpdateServiceProvider(Company companyToModify) public async Task<string> UpdateServiceProvider(Company companyToModify)
{ {
_logger.Info($"UpdateServiceProvider called! + {companyToModify.Id}"); _logger.Info($"UpdateServiceProvider called! + {companyToModify.Id}");
@ -129,6 +153,7 @@ namespace TIAMWebApp.Server.Controllers
[HttpPost] [HttpPost]
[Route(APIUrls.GetServiceProvidersByOwnerIdRouteName)] [Route(APIUrls.GetServiceProvidersByOwnerIdRouteName)]
[Tags("Finished", "ServiceProvider")] [Tags("Finished", "ServiceProvider")]
[SignalR(SignalRTags.GetPropertiesByOwnerIdAsync, MethodParamType.Id)]
public async Task<Dictionary<Guid, string>> GetServiceProvidersByOwnerId([FromBody] Guid ownerId) public async Task<Dictionary<Guid, string>> GetServiceProvidersByOwnerId([FromBody] Guid ownerId)
{ {
_logger.Info($@"GetServiceProvidersByOwnerId called with ownerId: {ownerId}"); _logger.Info($@"GetServiceProvidersByOwnerId called with ownerId: {ownerId}");

View File

@ -11,6 +11,7 @@ using TIAM.Core.Enums;
using TIAM.Database.DataLayers.Admins; using TIAM.Database.DataLayers.Admins;
using TIAM.Entities.Emails; using TIAM.Entities.Emails;
using TIAM.Entities.Transfers; using TIAM.Entities.Transfers;
using TIAM.Services;
using TIAM.Services.Server; using TIAM.Services.Server;
using TIAMWebApp.Shared.Application.Models; using TIAMWebApp.Shared.Application.Models;
using TIAMWebApp.Shared.Application.Models.ClientSide.Messages; using TIAMWebApp.Shared.Application.Models.ClientSide.Messages;
@ -379,6 +380,7 @@ namespace TIAMWebApp.Server.Controllers
[Authorize] [Authorize]
[HttpGet] [HttpGet]
[Route(APIUrls.GetTransfersRouteName)] [Route(APIUrls.GetTransfersRouteName)]
[SignalR(SignalRTags.GetTransfersAsync, MethodParamType.None)]
public async Task<string> GetTransfers() public async Task<string> GetTransfers()
{ {
//var token = _authService.GetAuthTokenFromRequest(Request); //var token = _authService.GetAuthTokenFromRequest(Request);
@ -404,6 +406,7 @@ namespace TIAMWebApp.Server.Controllers
[AllowAnonymous] [AllowAnonymous]
[HttpPost] [HttpPost]
[Route(APIUrls.UpdateTransferRouteName)] [Route(APIUrls.UpdateTransferRouteName)]
[SignalR(SignalRTags.UpdateTransferAsync, MethodParamType.Object, typeof(Transfer))]
public async Task<Transfer> UpdateTransfer(Transfer transferToModify) public async Task<Transfer> UpdateTransfer(Transfer transferToModify)
{ {
_logger.Info($"UpdateTransfer called! + {Request?.ReadFormAsync()}"); _logger.Info($"UpdateTransfer called! + {Request?.ReadFormAsync()}");

View File

@ -1,26 +1,88 @@
using AyCode.Core.Extensions; using System.Collections.Concurrent;
using AyCode.Core.Helpers; using System.Reflection;
using AyCode.Core.Extensions;
using AyCode.Core.Loggers; using AyCode.Core.Loggers;
using AyCode.Services.SignalRs; using AyCode.Services.SignalRs;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using TIAM.Database.DataLayers.Admins; using TIAM.Database.DataLayers.Admins;
using MessagePack;
using MessagePack.Resolvers; using MessagePack.Resolvers;
using AyCode.Services.Server.SignalRs; using AyCode.Services.Server.SignalRs;
using System.ServiceModel.Channels; using DevExpress.Utils.Filtering;
using TIAM.Entities.Transfers; using TIAM.Entities.Transfers;
using TIAM.Services; using TIAM.Services;
using TIAMWebApp.Server.Controllers; using TIAMWebApp.Server.Controllers;
using System.Text.Json.Nodes;
using System.Text.RegularExpressions;
using System.Web;
using TIAM.Entities.ServiceProviders; using TIAM.Entities.ServiceProviders;
using System.Runtime.CompilerServices;
using MessagePack;
using System.Security.Cryptography.Xml;
using DevExpress.XtraPrinting.Native.WebClientUIControl;
namespace TIAMWebApp.Server.Services; namespace TIAMWebApp.Server.Services;
public class DevAdminSignalRHub(AdminDal adminDal, ServiceProviderAPIController serviceProviderAPIController, TransferDataAPIController transferDataAPIController, IEnumerable<IAcLogWriterBase> logWriters) : Hub<ISignalRHubItemServer>, IAcSignalRHubServer public static class ExtensionMethods
{ {
private readonly TIAM.Core.Loggers.Logger<DevAdminSignalRHub> _logger = new(logWriters.ToArray()); public static object? InvokeMethod(this MethodInfo methodInfo, object obj, params object[]? parameters)
{
if (methodInfo.GetCustomAttribute(typeof(AsyncStateMachineAttribute)) is AsyncStateMachineAttribute isTaks)
{
dynamic awaitable = methodInfo.Invoke(obj, parameters)!;
return awaitable.GetAwaiter().GetResult();
}
return methodInfo.Invoke(obj, parameters);
}
}
public enum MethodParamType : byte
{
None = 0,
Id = 5,
Object = 10
}
[AttributeUsage(AttributeTargets.Method)]
public class SignalRAttribute(int messageTag, MethodParamType methodParamType, Type paramType = null) : Attribute
{
public int MessageTag { get; init; } = messageTag;
public MethodParamType MethodParamType { get; init; } = methodParamType;
public Type ParamType { get; init; } = paramType;
}
public class DevAdminSignalRHub : Hub<ISignalRHubItemServer>, IAcSignalRHubServer
{
private readonly ConcurrentDictionary<object, ConcurrentDictionary<int, MethodInfo>> _methodsByMessageTag = new();
private readonly TIAM.Core.Loggers.Logger<DevAdminSignalRHub> _logger;
private readonly AdminDal _adminDal;
private readonly ServiceProviderAPIController _serviceProviderApiController;
private readonly TransferDataAPIController _transferDataApiController;
public DevAdminSignalRHub(AdminDal adminDal, ServiceProviderAPIController serviceProviderApiController, TransferDataAPIController transferDataApiController, IEnumerable<IAcLogWriterBase> logWriters)
{
_adminDal = adminDal;
_serviceProviderApiController = serviceProviderApiController;
_transferDataApiController = transferDataApiController;
_logger = new(logWriters.ToArray());
var methods = typeof(ServiceProviderAPIController).GetMethods().Where(x => x.GetCustomAttributes(typeof(SignalRAttribute), false).Length > 0);
_methodsByMessageTag[serviceProviderApiController] = new();
foreach (var methodInfo in methods)
{
var atr = methodInfo.GetCustomAttribute(typeof(SignalRAttribute)) as SignalRAttribute;
_methodsByMessageTag[serviceProviderApiController][atr.MessageTag] = methodInfo;
}
methods = typeof(TransferDataAPIController).GetMethods().Where(x => x.GetCustomAttributes(typeof(SignalRAttribute), false).Length > 0);
_methodsByMessageTag[transferDataApiController] = new();
foreach (var methodInfo in methods)
{
var atr = methodInfo.GetCustomAttribute(typeof(SignalRAttribute)) as SignalRAttribute;
_methodsByMessageTag[transferDataApiController][atr.MessageTag] = methodInfo;
}
}
// https://docs.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-3.1#strongly-typed-hubs // https://docs.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-3.1#strongly-typed-hubs
public override async Task OnConnectedAsync() public override async Task OnConnectedAsync()
@ -59,53 +121,76 @@ public class DevAdminSignalRHub(AdminDal adminDal, ServiceProviderAPIController
try try
{ {
foreach (var methodsByDeclaringObject in _methodsByMessageTag)
{
if (methodsByDeclaringObject.Value.TryGetValue(messageTag, out var methodInfo))
{
var atr = methodInfo.GetCustomAttribute(typeof(SignalRAttribute)) as SignalRAttribute;
object[]? param = null;
if (atr.MethodParamType != MethodParamType.None)
{
param = new object[1];
if (atr.MethodParamType == MethodParamType.Id)
{
param[0] = message!.MessagePackTo<SignalRequestByIdMessage>().Id;
}
else
{
var msg = message!.MessagePackTo<SignalPostJsonDataMessage<object>>(MessagePackSerializerOptions.Standard);
param[0] = msg.PostDataJson.JsonTo(atr.ParamType)!;
}
}
await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, methodInfo.InvokeMethod(methodsByDeclaringObject.Key, param)), requestId);
return;
}
}
switch (messageTag) switch (messageTag)
{ {
case SignalRTags.GetTransfersAsync:
await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, await transferDataAPIController.GetTransfers()), requestId);
return;
case SignalRTags.GetPropertiesByOwnerIdAsync:
var ownerId = message!.MessagePackTo<SignalRequestByIdMessage>().Id;
await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, await serviceProviderAPIController.GetServiceProvidersByOwnerId(ownerId)), requestId);
return;
case SignalRTags.UpdateTransferAsync:
var transfer = message!.MessagePackTo<SignalPostJsonDataMessage<Transfer>>().PostData;
await transferDataAPIController.UpdateTransfer(transfer);
await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, transfer), requestId);
return;
case SignalRTags.GetCompaniesAsync:
await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, await serviceProviderAPIController.GetServiceProviders()), requestId);
return;
case SignalRTags.UpdateCompanyAsync:
var updateCompany = message!.MessagePackTo<SignalPostJsonDataMessage<Company>>().PostData;
await serviceProviderAPIController.UpdateServiceProvider(updateCompany);
await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, updateCompany), requestId);
return;
case SignalRTags.AddCompanyAsync:
//var createCompany = message!.MessagePackTo<SignalPostJsonDataMessage<Company>>().PostData;
//await serviceProviderAPIController.CreateServiceProvider(createCompany);
//await ResponseToCaller(messageTag, new SignalResponseMessage<string>(SignalResponseStatus.Success, createCompany), requestId);
return;
case SignalRTags.RemoveCompanyAsync: case SignalRTags.RemoveCompanyAsync:
var deleteCompany = message!.MessagePackTo<SignalPostJsonDataMessage<Company>>().PostData; var deleteCompany = message!.MessagePackTo<SignalPostJsonDataMessage<Company>>().PostData;
await adminDal.RemoveCompanyAsync(deleteCompany.Id); await _adminDal.RemoveCompanyAsync(deleteCompany.Id);
await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success), requestId); await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success), requestId);
return; return;
//case SignalRTags.GetTransfersAsync:
// await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, await _transferDataApiController.GetTransfers()), requestId);
// return;
//case SignalRTags.GetPropertiesByOwnerIdAsync:
// var ownerId = message!.MessagePackTo<SignalRequestByIdMessage>().Id;
// await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, await _serviceProviderApiController.GetServiceProvidersByOwnerId(ownerId)), requestId);
// return;
//case SignalRTags.UpdateTransferAsync:
// var transfer = message!.MessagePackTo<SignalPostJsonDataMessage<Transfer>>().PostData;
// await _transferDataApiController.UpdateTransfer(transfer);
// await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, transfer), requestId);
// return;
//case SignalRTags.GetCompaniesAsync:
// await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, await _serviceProviderApiController.GetServiceProviders()), requestId);
// return;
//case SignalRTags.UpdateCompanyAsync:
// var updateCompany = message!.MessagePackTo<SignalPostJsonDataMessage<Company>>().PostData;
// await _serviceProviderApiController.UpdateServiceProvider(updateCompany);
// await ResponseToCaller(messageTag, new SignalResponseJsonMessage(SignalResponseStatus.Success, updateCompany), requestId);
// return;
default: default:
_logger.Error($"Server OnReceiveMessage; messageTag not found! messageTag: {messageTag}"); _logger.Error($"Server OnReceiveMessage; messageTag not found! messageTag: {messageTag}");
break; break;