SignalRServer InvokeMethodByMessageTag is in progress...
This commit is contained in:
parent
40d8937654
commit
e741f54555
|
|
@ -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<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 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<string> GetServiceProvidersJsonAsync()
|
||||
{
|
||||
return SessionAsync(ctx => ctx.Companies.ToJson());
|
||||
}
|
||||
public Task<string> GetServiceProvidersJsonAsync() => SessionAsync(ctx => ctx.Companies.ToJson());
|
||||
public string GetServiceProvidersJson() => Session(ctx => ctx.Companies.ToJson());
|
||||
|
||||
|
||||
|
||||
public virtual Task<Company?> GetServiceProviderByIdAsync(Guid id) => SessionAsync(ctx => ctx.GetServiceProviderById(id));
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
using System.Diagnostics.CodeAnalysis;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using QRCoder;
|
||||
|
|
@ -12,6 +13,11 @@ using Product = TIAM.Entities.Products.Product;
|
|||
using TIAM.Entities.Addresses;
|
||||
using TIAM.Entities.Profiles;
|
||||
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
|
||||
{
|
||||
|
|
@ -51,7 +57,7 @@ namespace TIAMWebApp.Server.Controllers
|
|||
|
||||
//no owner set yet
|
||||
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)
|
||||
{
|
||||
|
|
@ -59,28 +65,12 @@ namespace TIAMWebApp.Server.Controllers
|
|||
}
|
||||
else
|
||||
{
|
||||
|
||||
_logger.Info($@"ServiceProvider to be creating; id: {id}, name: {name}, ownerId: {ownerId}");
|
||||
|
||||
var toCreate = new Company(id, name, ownerId, Guid.NewGuid())
|
||||
var company = new Company(id, name, ownerId, Guid.NewGuid())
|
||||
{
|
||||
CommissionPercent = commissionRate
|
||||
};
|
||||
|
||||
toCreate.SetProfile(new Profile(Guid.NewGuid(), toCreate.Name));
|
||||
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);
|
||||
}
|
||||
return await AddCompanyAsync(company);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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.
|
||||
[AllowAnonymous]
|
||||
[HttpGet]
|
||||
[Route(APIUrls.GetServiceProvidersRouteName)]
|
||||
[SignalR(SignalRTags.GetCompaniesAsync, MethodParamType.None)]
|
||||
public async Task<string> GetServiceProviders()
|
||||
{
|
||||
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.
|
||||
[AllowAnonymous]
|
||||
[HttpPost]
|
||||
|
|
@ -115,6 +138,7 @@ namespace TIAMWebApp.Server.Controllers
|
|||
[AllowAnonymous]
|
||||
[HttpPost]
|
||||
[Route(APIUrls.UpdateServiceProviderRouteName)]
|
||||
[SignalR(SignalRTags.UpdateCompanyAsync, MethodParamType.Object, typeof(Company))]
|
||||
public async Task<string> UpdateServiceProvider(Company companyToModify)
|
||||
{
|
||||
_logger.Info($"UpdateServiceProvider called! + {companyToModify.Id}");
|
||||
|
|
@ -129,6 +153,7 @@ namespace TIAMWebApp.Server.Controllers
|
|||
[HttpPost]
|
||||
[Route(APIUrls.GetServiceProvidersByOwnerIdRouteName)]
|
||||
[Tags("Finished", "ServiceProvider")]
|
||||
[SignalR(SignalRTags.GetPropertiesByOwnerIdAsync, MethodParamType.Id)]
|
||||
public async Task<Dictionary<Guid, string>> GetServiceProvidersByOwnerId([FromBody] Guid ownerId)
|
||||
{
|
||||
_logger.Info($@"GetServiceProvidersByOwnerId called with ownerId: {ownerId}");
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ using TIAM.Core.Enums;
|
|||
using TIAM.Database.DataLayers.Admins;
|
||||
using TIAM.Entities.Emails;
|
||||
using TIAM.Entities.Transfers;
|
||||
using TIAM.Services;
|
||||
using TIAM.Services.Server;
|
||||
using TIAMWebApp.Shared.Application.Models;
|
||||
using TIAMWebApp.Shared.Application.Models.ClientSide.Messages;
|
||||
|
|
@ -379,6 +380,7 @@ namespace TIAMWebApp.Server.Controllers
|
|||
[Authorize]
|
||||
[HttpGet]
|
||||
[Route(APIUrls.GetTransfersRouteName)]
|
||||
[SignalR(SignalRTags.GetTransfersAsync, MethodParamType.None)]
|
||||
public async Task<string> GetTransfers()
|
||||
{
|
||||
//var token = _authService.GetAuthTokenFromRequest(Request);
|
||||
|
|
@ -404,6 +406,7 @@ namespace TIAMWebApp.Server.Controllers
|
|||
[AllowAnonymous]
|
||||
[HttpPost]
|
||||
[Route(APIUrls.UpdateTransferRouteName)]
|
||||
[SignalR(SignalRTags.UpdateTransferAsync, MethodParamType.Object, typeof(Transfer))]
|
||||
public async Task<Transfer> UpdateTransfer(Transfer transferToModify)
|
||||
{
|
||||
_logger.Info($"UpdateTransfer called! + {Request?.ReadFormAsync()}");
|
||||
|
|
|
|||
|
|
@ -1,26 +1,88 @@
|
|||
using AyCode.Core.Extensions;
|
||||
using AyCode.Core.Helpers;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Reflection;
|
||||
using AyCode.Core.Extensions;
|
||||
using AyCode.Core.Loggers;
|
||||
using AyCode.Services.SignalRs;
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
using TIAM.Database.DataLayers.Admins;
|
||||
using MessagePack;
|
||||
using MessagePack.Resolvers;
|
||||
using AyCode.Services.Server.SignalRs;
|
||||
using System.ServiceModel.Channels;
|
||||
using DevExpress.Utils.Filtering;
|
||||
using TIAM.Entities.Transfers;
|
||||
using TIAM.Services;
|
||||
using TIAMWebApp.Server.Controllers;
|
||||
using System.Text.Json.Nodes;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Web;
|
||||
using TIAM.Entities.ServiceProviders;
|
||||
using System.Runtime.CompilerServices;
|
||||
using MessagePack;
|
||||
using System.Security.Cryptography.Xml;
|
||||
using DevExpress.XtraPrinting.Native.WebClientUIControl;
|
||||
|
||||
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
|
||||
public override async Task OnConnectedAsync()
|
||||
|
|
@ -59,53 +121,76 @@ public class DevAdminSignalRHub(AdminDal adminDal, ServiceProviderAPIController
|
|||
|
||||
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)
|
||||
{
|
||||
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:
|
||||
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);
|
||||
|
||||
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:
|
||||
_logger.Error($"Server OnReceiveMessage; messageTag not found! messageTag: {messageTag}");
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in New Issue