Refactoring Login, SignalR, etc...

This commit is contained in:
Loretta 2024-11-06 14:36:03 +01:00
parent f6bc09c661
commit da24b45f5d
53 changed files with 279 additions and 440 deletions

View File

@ -30,8 +30,8 @@
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.6.1" />
<PackageReference Include="MSTest.TestFramework" Version="3.6.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.6.2" />
<PackageReference Include="MSTest.TestFramework" Version="3.6.2" />
<PackageReference Include="coverlet.collector" Version="6.0.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

View File

@ -28,8 +28,8 @@
</PackageReference>
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="8.0.10" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.6.1" />
<PackageReference Include="MSTest.TestFramework" Version="3.6.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.6.2" />
<PackageReference Include="MSTest.TestFramework" Version="3.6.2" />
</ItemGroup>
<ItemGroup>

View File

@ -47,31 +47,31 @@ namespace TIAMMobileApp
builder.Services.AddDevExpressBlazor(configure => configure.BootstrapVersion = BootstrapVersion.v5);
builder.Services.AddScoped<IWeatherForecastService, WeatherForecastService>();
builder.Services.AddScoped<ITransferDataService, TransferDataService>();
builder.Services.AddSingleton<IWeatherForecastService, WeatherForecastService>();
builder.Services.AddSingleton<ITransferDataService, TransferDataService>();
builder.Services.AddSingleton<IAcLogWriterClientBase, SignaRClientLogItemWriter>();
builder.Services.AddScoped<IPopulationStructureDataProvider, PopulationStructureDataProvider>();
builder.Services.AddScoped<ISupplierService, SupplierService>();
builder.Services.AddScoped<IUserDataService, UserDataServiceMobile>();
builder.Services.AddScoped<ISecureStorageHandler, SecureStorageHandler>();
builder.Services.AddSingleton<ISessionService, SessionServiceMobile>();
builder.Services.AddSingleton<IPopulationStructureDataProvider, PopulationStructureDataProvider>();
builder.Services.AddSingleton<ISupplierService, SupplierService>();
builder.Services.AddSingleton<IUserDataService, UserDataServiceMobile>();
builder.Services.AddSingleton<ISecureStorageHandler, SecureStorageHandler>();
builder.Services.AddSingleton<ISessionServiceClient, SessionServiceMobile>();
builder.Services.AddSingleton<IComponentUpdateService, ComponentUpdateServiceMobile>();
builder.Services.AddScoped<IServiceProviderDataService, ServiceProviderDataService>();
builder.Services.AddScoped<IClientNoticeSenderService, ClientNoticeSenderService>();
builder.Services.AddScoped<IWizardProcessor, WizardProcessor>();
builder.Services.AddScoped<IImageDataService, ImageDataService>();
builder.Services.AddSingleton<IServiceProviderDataService, ServiceProviderDataService>();
builder.Services.AddSingleton<IClientNoticeSenderService, ClientNoticeSenderService>();
builder.Services.AddSingleton<IWizardProcessor, WizardProcessor>();
builder.Services.AddSingleton<IImageDataService, ImageDataService>();
builder.Services.AddSingleton(x => new ResourceManager("TIAMWebApp.Shared.Application.Resources", typeof(Main).Assembly));
builder.Services.AddSingleton<AdminSignalRClient>();
builder.Services.AddSingleton<SignalRService>();
builder.Services.AddSingleton<SumupService>();
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
builder.Services.AddScoped<ExchangeRateService>();
builder.Services.AddScoped<SmartyStreetsService>();
builder.Services.AddScoped<GooglePlacesService>();
builder.Services.AddSingleton<AuthenticationStateProvider, CustomAuthStateProvider>();
builder.Services.AddSingleton<ExchangeRateService>();
builder.Services.AddSingleton<SmartyStreetsService>();
builder.Services.AddSingleton<GooglePlacesService>();
builder.Services.AddSingleton<PageHistoryState>();
builder.Services.AddAuthorizationCore();
builder.Services.Configure<AnimationOptions>(Guid.NewGuid().ToString(), c => { });

View File

@ -1,4 +1,6 @@
using System.Net;
using AyCode.Interfaces.StorageHandlers;
using Microsoft.AspNetCore.Components.Authorization;
using System.Net;
using TIAM.Core.Consts;
using TIAM.Entities.Products;
using TIAM.Entities.Users;
@ -10,16 +12,17 @@ using static System.Runtime.InteropServices.JavaScript.JSType;
namespace TIAMMobileApp.Services
{
public class SessionServiceMobile : SessionServiceClientBase
public class SessionServiceMobile(ISecureStorageHandler secureStorageHandler, AuthenticationStateProvider authStateProvider)
: SessionServiceClientBase(secureStorageHandler, authStateProvider)
{
public override List<Product> GetHotels()
{
return base.GetHotels();
}
public override void ClearAll()
public override Task ClearAll()
{
base.ClearAll();
return base.ClearAll();
}
}
}

View File

@ -17,7 +17,7 @@ using TIAMWebApp.Shared.Application.Utility;
namespace TIAMMobileApp.Services
{
public class UserDataServiceMobile(HttpClient http, AdminSignalRClient adminSignalRClient, ISessionService sessionService, ISecureStorageHandler secureStorageHandler, IServiceProviderDataService serviceProviderDataService, IEnumerable<IAcLogWriterClientBase> logWriters)
public class UserDataServiceMobile(HttpClient http, AdminSignalRClient adminSignalRClient, ISessionServiceClient sessionService, ISecureStorageHandler secureStorageHandler, IServiceProviderDataService serviceProviderDataService, IEnumerable<IAcLogWriterClientBase> logWriters)
: UserDataServiceClientBase(http, adminSignalRClient, sessionService, secureStorageHandler, serviceProviderDataService, logWriters);
}

View File

@ -15,6 +15,7 @@
@using AyCode.Core.Helpers
@using AyCode.Core.Loggers
@using AyCode.Services.Loggers
@using AyCode.Utils.Extensions
@using TIAM.Core.Loggers
@using TIAM.Models
@using TIAM.Services
@ -26,7 +27,7 @@
@inject IUserDataService UserDataService
@inject IServiceProviderDataService ServiceProviderDataService
@inject ISecureStorageHandler SecureStorageHandler
@inject ISessionService sessionService;
@inject ISessionServiceClient sessionService;
@inject HttpClient http;
@inject IComponentUpdateService ComponentUpdateService
@inject AuthenticationStateProvider AuthStateProvider
@ -213,17 +214,22 @@
private async Task SignOut()
{
_logger.Info("SignOut called");
_logger.Info("Applaunch->SignOut called");
var userBasicDetail = userDetailsStr.JsonTo<UserBasicDetails>();
// var userBasicDetail = userDetailsStr.JsonTo<UserBasicDetails>();
await AuthStateProvider.GetAuthenticationStateAsync();
await SecureStorageHandler.ClearAllSecureStorageAsync();
sessionService.ClearAll();
ComponentUpdateService.CallRequestRefreshAll();
// if (userBasicDetail != null && !userBasicDetail.RefreshToken.IsNullOrWhiteSpace())
// await UserDataService.Logout(userBasicDetail.RefreshToken);
UserDataService.Logout(userBasicDetail?.RefreshToken).Forget();
// await SecureStorageHandler.ClearAllSecureStorageAsync();
// await AuthStateProvider.GetAuthenticationStateAsync();
//sessionService.ClearAll();
await UserDataService.SignOut();
//navigationManager.NavigateTo("/");
ComponentUpdateService.CallRequestRefreshAll();
}
CultureInfo Culture

View File

@ -1,7 +1,7 @@
@page "/auction"
@using TIAMSharedUI.Pages.Components
@using TIAMWebApp.Shared.Application.Interfaces;
@inject ISessionService sessionService
@inject ISessionServiceClient sessionService
<div class="container-fluid">
<h1>Auction</h1>

View File

@ -1,7 +1,7 @@
@using TIAMWebApp.Shared.Application.Interfaces;
@using TIAMWebApp.Shared.Application.Models.PageModels;
@using TIAMWebApp.Shared.Application.Models;
@inject ISessionService sessionService;
@inject ISessionServiceClient sessionService;
<EditForm Model="@auctionBidModel" OnValidSubmit="GoToNextStep">
<DataAnnotationsValidator />

View File

@ -1,7 +1,7 @@
@using TIAMWebApp.Shared.Application.Models.PageModels;
@using TIAMWebApp.Shared.Application.Models;
@using TIAMWebApp.Shared.Application.Interfaces;
@inject ISessionService sessionService;
@inject ISessionServiceClient sessionService;
<EditForm Model="@auctionBidModel" OnValidSubmit="GoToNextStep">
<DataAnnotationsValidator />

View File

@ -18,7 +18,7 @@ namespace TIAMSharedUI.Pages.Components
public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; }
[Inject]
public ISessionService sessionService { get; set; }
public ISessionServiceClient sessionService { get; set; }
public bool IsLoggedIn = false;
[Inject]
public IComponentUpdateService componentUpdateService { get; set; }

View File

@ -11,7 +11,7 @@
@using TIAMWebApp.Shared.Application.Interfaces
@using TIAMWebApp.Shared.Application.Utility
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject ISessionService _sessionService
@inject ISessionServiceClient _sessionService
@if (isEditing)
{

View File

@ -28,7 +28,7 @@ namespace TIAMSharedUI.Pages.Components
IStringLocalizer<TIAMResources> localizer { get; set; }
[Inject]
public ISessionService sessionService { get; set; }
public ISessionServiceClient sessionService { get; set; }
public Dictionary<int, Guid> FormSteps { get; set; } = new Dictionary<int, Guid>();
public int CurrentStep { get; set; } = 0;

View File

@ -1,6 +1,6 @@
@using TIAMWebApp.Shared.Application.Interfaces;
@using TIAMWebApp.Shared.Application.Models;
@inject ISessionService sessionService;
@inject ISessionServiceClient sessionService;
<EditForm Model="@auctionBidModel" OnValidSubmit="GoToNextStep">
<DataAnnotationsValidator />

View File

@ -1,6 +1,6 @@
@using TIAMWebApp.Shared.Application.Models;
@using TIAMWebApp.Shared.Application.Interfaces;
@inject ISessionService sessionService;
@inject ISessionServiceClient sessionService;
<EditForm Model="@auctionBidModel" OnValidSubmit="GoToNextStep">
<DataAnnotationsValidator />

View File

@ -17,7 +17,7 @@
@inject IUserDataService UserDataService;
@inject IJSRuntime jsRuntime;
@inject ISecureStorageHandler SecureStorageHandler
@inject ISessionService sessionService;
@inject ISessionServiceClient sessionService;
@inject IStringLocalizer<MyResources> localizer;
@inject NavigationManager navManager
@inject IAcLogWriterClientBase BrowserConsoleLogWriter

View File

@ -14,7 +14,7 @@
@inject IUserDataService UserDataService;
@inject IJSRuntime jsRuntime;
@inject ISecureStorageHandler SecureStorageHandler
@inject ISessionService sessionService;
@inject ISessionServiceClient sessionService;
@inject IStringLocalizer<TIAMResources> localizer;
@inject NavigationManager navManager
@inject IAcLogWriterClientBase BrowserConsoleLogWriter

View File

@ -39,7 +39,7 @@ namespace TIAMSharedUI.Pages
[Inject]
public AuthenticationStateProvider AuthStateProvider { get; set; }
[Inject] public IComponentUpdateService componentUpdateService { get; set; }
[Inject] public ISessionService sessionService { get; set; }
[Inject] public ISessionServiceClient sessionService { get; set; }
//fill loginmodel with fake but valid data
//LoginModel loginModel = new();

View File

@ -16,7 +16,7 @@
@using AyCode.Core.Extensions
@layout AdminLayout
@inject IPopulationStructureDataProvider DataProvider
@inject ISessionService SessionService
@inject ISessionServiceClient SessionService
@inject IUserDataService UserDataService
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject AdminSignalRClient _adminSignalRClient

View File

@ -17,7 +17,7 @@ namespace TIAMSharedUI.Pages
public IStringLocalizer<MyResources>? localizer { get; set; }
[Inject]
public ISessionService SessionService { get; set; }
public ISessionServiceClient SessionService { get; set; }
public string Language { get; set; } = "en-US";

View File

@ -17,7 +17,7 @@
@layout AdminLayout
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject IStringLocalizer<TIAMResources> Localizer
@inject ISessionService SessionService
@inject ISessionServiceClient SessionService
@inject IWizardProcessor WizardProcessor
@inject IUserDataService UserDataService
<PageTitle>Car list</PageTitle>

View File

@ -34,7 +34,7 @@
@inject IStringLocalizer<TIAMResources> localizer
@inject IWizardProcessor wizardProcessor
@inject ITransferDataService transferDataService;
@inject ISessionService sessionService;
@inject ISessionServiceClient sessionService;
@inject AdminSignalRClient AdminSignalRClient;
<PageTitle>Transfers</PageTitle>

View File

@ -37,7 +37,7 @@ namespace TIAMSharedUI.Pages.User.Hotels
[Inject] IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; }
[Inject] ISessionService SessionService { get; set; }
[Inject] ISessionServiceClient SessionService { get; set; }
private LoggerClient<HotelComponent> _logger;

View File

@ -29,7 +29,7 @@
@inject IStringLocalizer<TIAMResources> localizer
@inject IWizardProcessor wizardProcessor
@inject ITransferDataService transferDataService
@inject ISessionService sessionService
@inject ISessionServiceClient sessionService
@inject AdminSignalRClient AdminSignalRClient;
<PageTitle>Transfers</PageTitle>

View File

@ -33,7 +33,7 @@
@inject IStringLocalizer<TIAMResources> localizer
@inject IWizardProcessor wizardProcessor
@inject ITransferDataService transferDataService
@inject ISessionService sessionService
@inject ISessionServiceClient sessionService
@inject AdminSignalRClient AdminSignalRClient;
<PageTitle>Transfers</PageTitle>

View File

@ -19,7 +19,7 @@
@inject IStringLocalizer<TIAMResources> localizer
@inject IServiceProviderDataService serviceProviderDataService
@inject IUserDataService userDataService
@inject ISessionService sessionService
@inject ISessionServiceClient sessionService
@inject AdminSignalRClient AdminSignalRClient;
<PageTitle>Admin - Companies</PageTitle>

View File

@ -5,7 +5,7 @@
@using TIAMSharedUI.Pages.User.SysAdmins
@using TIAMWebApp.Shared.Application.Interfaces
@using TIAMWebApp.Shared.Application.Services
@inject ISessionService sessionService;
@inject ISessionServiceClient sessionService;
@inject AdminSignalRClient AdminSignalRClient;
@inject IJSRuntime jsRuntime

View File

@ -19,7 +19,7 @@
@layout AdminLayout
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject IStringLocalizer<TIAMResources> localizer
@inject ISessionService SessionService
@inject ISessionServiceClient SessionService
@inject IServiceProviderDataService ServiceProviderDataService
@inject AdminSignalRClient AdminSignalRClient;
<PageTitle>User permissions</PageTitle>

View File

@ -16,7 +16,7 @@
@inject IStringLocalizer<TIAMResources> localizer
@inject IServiceProviderDataService serviceProviderDataService
@inject IUserDataService userDataService
@inject ISessionService sessionService
@inject ISessionServiceClient sessionService
@inject AdminSignalRClient AdminSignalRClient;
<PageTitle>Admin - Companies</PageTitle>

View File

@ -15,7 +15,7 @@
@layout AdminLayout
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject IStringLocalizer<TIAMResources> Localizer
@inject ISessionService SessionService
@inject ISessionServiceClient SessionService
<PageTitle>User permissions</PageTitle>

View File

@ -13,7 +13,7 @@
@using TIAM.Core.Consts
@layout AdminLayout
@inject IStringLocalizer<TIAMResources> Localizer
@inject ISessionService SessionService
@inject ISessionServiceClient SessionService
@using TIAMSharedUI.Shared.Components.BaseComponents
@inherits UserBasePageComponent

View File

@ -25,7 +25,7 @@
@inherits UserBasePageComponent
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject AdminSignalRClient AdminSignalRClient;
@inject ISessionService sessionService
@inject ISessionServiceClient sessionService
@inject IComponentUpdateService ComponentUpdateService
<MessageDetailGrid CssClass="my-grid" @ref="_messageGrid"

View File

@ -31,7 +31,7 @@
@inject IStringLocalizer<TIAMResources> localizer
@inject IWizardProcessor wizardProcessor
@inject ITransferDataService transferDataService
@inject ISessionService sessionService
@inject ISessionServiceClient sessionService
@inject AdminSignalRClient AdminSignalRClient;
<PageTitle>Transfers</PageTitle>

View File

@ -10,7 +10,7 @@
@inject NavigationManager NavManager
@inject IJSRuntime jsRuntime
@inject ISecureStorageHandler SecureStorageHandler
@inject ISessionService sessionService
@inject ISessionServiceClient sessionService
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject IUserDataService userDataService
@attribute [Authorize]

View File

@ -29,10 +29,10 @@ namespace TIAMSharedUI.Shared.Components.BaseComponents
protected IStringLocalizer<TIAMResources> _localizer { get; set; }
[Inject]
protected ISessionService _sessionService { get; set; }
protected ISessionServiceClient _sessionService { get; set; }
private LoggerClient<BasePageComponent> _logger = null!;
public BasePageComponent(NavigationManager navManager, PageHistoryState pageState, IEnumerable<IAcLogWriterClientBase> logWriters, IStringLocalizer<TIAMResources> localizer,ISessionService sessionService)
public BasePageComponent(NavigationManager navManager, PageHistoryState pageState, IEnumerable<IAcLogWriterClientBase> logWriters, IStringLocalizer<TIAMResources> localizer,ISessionServiceClient sessionService)
{
_navManager = navManager;
_pageState = pageState;

View File

@ -32,7 +32,7 @@ namespace TIAMSharedUI.Shared.Components
[Inject] public ISecureStorageHandler SecureStorageHandler { get; set; }
[Inject] public ISessionService sessionService { get; set; }
[Inject] public ISessionServiceClient sessionService { get; set; }
[Inject] public IStringLocalizer<TIAMResources> localizer { get; set; }
[Inject] public NavigationManager navigationManager { get; set; }
@ -90,21 +90,26 @@ namespace TIAMSharedUI.Shared.Components
private async Task SignOut()
{
_logger.Info("Navbar->SignOut called");
//SiteViewModel.ClearAll();
bool serverResult;
string userDetailsStr = await SecureStorageHandler.GetFromSecureStorageAsync(nameof(Setting.UserBasicDetails));
//bool serverResult;
//string userDetailsStr = await SecureStorageHandler.GetFromSecureStorageAsync(nameof(Setting.UserBasicDetails));
if (!string.IsNullOrEmpty(userDetailsStr))
{
var userBasicDetail = JsonConvert.DeserializeObject<UserBasicDetails>(userDetailsStr);
serverResult = await UserDataService.Logout(userBasicDetail?.RefreshToken);
}
//if (!string.IsNullOrEmpty(userDetailsStr))
//{
// var userBasicDetail = JsonConvert.DeserializeObject<UserBasicDetails>(userDetailsStr);
// serverResult = await UserDataService.Logout(userBasicDetail?.RefreshToken);
//}
await SecureStorageHandler.ClearAllSecureStorageAsync();
var result = await AuthStateProvider.GetAuthenticationStateAsync();
//await SecureStorageHandler.ClearAllSecureStorageAsync();
//var result = await AuthStateProvider.GetAuthenticationStateAsync();
//sessionService.ClearAll();
await UserDataService.SignOut();
sessionService.ClearAll();
navigationManager.NavigateTo("/");
myUser = false;
}

View File

@ -6,7 +6,7 @@
@using AyCode.Interfaces.StorageHandlers;
@using TIAMWebApp.Shared.Application.Utility
@inject ISecureStorageHandler SecureStorageHandler
@inject ISessionService SessionService
@inject ISessionServiceClient SessionService
@inject IUserDataService UserDataService
@inject AuthenticationStateProvider AuthStateProvider
@inject NavigationManager NavigationManager
@ -234,7 +234,7 @@
await SecureStorageHandler.ClearAllSecureStorageAsync();
var result = await AuthStateProvider.GetAuthenticationStateAsync();
SessionService.ClearAll();
await SessionService.ClearAll();
NavigationManager.NavigateTo("/");
}
}

View File

@ -15,6 +15,7 @@ using System.Net;
using Microsoft.AspNetCore.Components.Authorization;
using TIAM.Models;
using TIAM.Models.PageViewModels;
using Microsoft.Extensions.DependencyInjection;
var builder = WebAssemblyHostBuilder.CreateDefault(args);
@ -22,23 +23,23 @@ var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");
builder.Services.AddLocalization();
builder.Services.AddScoped<IWeatherForecastService, WeatherForecastService>();
builder.Services.AddScoped<ITransferDataService, TransferDataService>();
builder.Services.AddScoped<IPopulationStructureDataProvider, PopulationStructureDataProvider>();
builder.Services.AddScoped<ISupplierService, SupplierService>();
builder.Services.AddScoped<IUserDataService, UserDataServiceWeb>();
builder.Services.AddScoped<ISecureStorageHandler, SecureStorageHandler>();
builder.Services.AddBlazoredLocalStorage();
builder.Services.AddSingleton<ISessionService, SessionServiceWeb>();
builder.Services.AddSingleton<IWeatherForecastService, WeatherForecastService>();
builder.Services.AddSingleton<ITransferDataService, TransferDataService>();
builder.Services.AddSingleton<IPopulationStructureDataProvider, PopulationStructureDataProvider>();
builder.Services.AddSingleton<ISupplierService, SupplierService>();
builder.Services.AddSingleton<IUserDataService, UserDataServiceWeb>();
builder.Services.AddSingleton<ISecureStorageHandler, SecureStorageHandler>();
builder.Services.AddBlazoredLocalStorageAsSingleton();
builder.Services.AddSingleton<ISessionServiceClient, SessionServiceWeb>();
builder.Services.AddSingleton<IComponentUpdateService, ComponentUpdateServiceWeb>();
builder.Services.AddScoped<IServiceProviderDataService, ServiceProviderDataService>();
builder.Services.AddScoped<IClientNoticeSenderService, ClientNoticeSenderService>();
builder.Services.AddScoped<IWizardProcessor, WizardProcessor>();
builder.Services.AddScoped<IImageDataService, ImageDataService>();
builder.Services.AddSingleton<IServiceProviderDataService, ServiceProviderDataService>();
builder.Services.AddSingleton<IClientNoticeSenderService, ClientNoticeSenderService>();
builder.Services.AddSingleton<IWizardProcessor, WizardProcessor>();
builder.Services.AddSingleton<IImageDataService, ImageDataService>();
//WebSpecific
builder.Services.AddScoped<SessionStorageAccessor>();
builder.Services.AddSingleton<SessionStorageAccessor>();
builder.Services.AddSingleton(x => new ResourceManager("TIAMWebApp.Client.Resources.MyResources", typeof(Program).Assembly));
#if DEBUG
@ -50,13 +51,13 @@ builder.Services.AddSingleton<IAcLogWriterClientBase, SignaRClientLogItemWriter>
builder.Services.AddSingleton<AdminSignalRClient>();
builder.Services.AddSingleton<SignalRService>();
builder.Services.AddSingleton<SumupService>();
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
builder.Services.AddSingleton<AuthenticationStateProvider, CustomAuthStateProvider>();
builder.Services.AddAuthorizationCore();
builder.Services.AddScoped<ExchangeRateService>();
builder.Services.AddScoped<SmartyStreetsService>();
builder.Services.AddScoped<GooglePlacesService>();
builder.Services.AddSingleton<ExchangeRateService>();
builder.Services.AddSingleton<SmartyStreetsService>();
builder.Services.AddSingleton<GooglePlacesService>();
builder.Services.AddSingleton<PageHistoryState>();
//builder.Services.AddScoped<BrowserConsoleLogWriter>();
//builder.Services.AddSingleton<BrowserConsoleLogWriter>();
//WebSpecific end

View File

@ -1,4 +1,6 @@
using System.Net;
using AyCode.Interfaces.StorageHandlers;
using Microsoft.AspNetCore.Components.Authorization;
using System.Net;
using TIAM.Entities.Products;
using TIAM.Models;
using TIAMWebApp.Shared.Application.Interfaces;
@ -7,16 +9,17 @@ using TIAMWebApp.Shared.Application.Services;
namespace TIAMWebApp.Client.Services
{
public class SessionServiceWeb : SessionServiceClientBase
public class SessionServiceWeb(ISecureStorageHandler secureStorageHandler, AuthenticationStateProvider authStateProvider)
: SessionServiceClientBase(secureStorageHandler, authStateProvider)
{
public override List<Product> GetHotels()
{
return base.GetHotels();
}
public override void ClearAll()
public override Task ClearAll()
{
base.ClearAll();
return base.ClearAll();
}
}
}

View File

@ -19,7 +19,7 @@ using TIAMWebApp.Shared.Application.Services;
namespace TIAMWebApp.Client.Services
{
public class UserDataServiceWeb(HttpClient http, AdminSignalRClient adminSignalRClient, ISessionService sessionService, ISecureStorageHandler secureStorageHandler, IServiceProviderDataService serviceProviderDataService, IEnumerable<IAcLogWriterClientBase> logWriters)
public class UserDataServiceWeb(HttpClient http, AdminSignalRClient adminSignalRClient, ISessionServiceClient sessionService, ISecureStorageHandler secureStorageHandler, IServiceProviderDataService serviceProviderDataService, IEnumerable<IAcLogWriterClientBase> logWriters)
: UserDataServiceClientBase(http, adminSignalRClient, sessionService, secureStorageHandler, serviceProviderDataService, logWriters);
}

View File

@ -0,0 +1,42 @@
using AyCode.Blazor.Components.Services;
using AyCode.Core.Loggers;
using AyCode.Services.SignalRs;
using TIAM.Database.DataLayers.Users;
using TIAM.Services;
using TIAM.Services.Server.Logins;
namespace TIAMWebApp.Server.Services;
public class AcWebSignalRHubWithSessionBase<TSignalRTags, TLogger>(IConfiguration configuration, UserDal userDal, SessionService sessionService, TLogger logger)
: AcWebSignalRHubBase<TSignalRTags, TLogger>(configuration, logger) where TSignalRTags : AcSignalRTags where TLogger : AcLoggerBase//Hub<ISignalRHubItemServer>, IAcSignalRHubServer
{
protected readonly UserDal UserDal = userDal;
protected SessionService SessionService = sessionService;
public override async Task OnConnectedAsync()
{
await base.OnConnectedAsync();
SessionService.Sessions.TryAdd(Context.ConnectionId, new SessionItem(Context.ConnectionId, new LoginService(UserDal, Configuration)));
Logger.Info($"_sessionService.Sessions count: {SessionService.Sessions.Count}");
////insert or updatde them into database.
//var CId = _context.UserIdToCId.Find(userId);
//CId.ConnectionId = connectionid;
//_context.Update(CId);
//await _context.SaveChangesAsync();
//await base.OnConnectedAsync();
////await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
}
public override async Task OnDisconnectedAsync(Exception? exception)
{
await base.OnDisconnectedAsync(exception);
if (SessionService.Sessions.TryRemove(Context.ConnectionId, out var sessionItem)) sessionItem.LoginService.Logout();
Logger.Info($"_sessionService.Sessions count: {SessionService.Sessions.Count}");
//await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
}
}

View File

@ -1,192 +1,39 @@
using AyCode.Core.Extensions;
using AyCode.Blazor.Models.Server.Models;
using AyCode.Core.Extensions;
using AyCode.Core.Loggers;
using AyCode.Services.SignalRs;
using Microsoft.AspNetCore.SignalR;
using TIAM.Database.DataLayers.Admins;
using MessagePack.Resolvers;
using AyCode.Services.Server.SignalRs;
using TIAM.Services;
using TIAMWebApp.Server.Controllers;
using MessagePack;
using TIAM.Entities.Addresses;
using System.Linq.Expressions;
using AyCode.Core.Helpers;
using Profile = TIAM.Entities.Profiles.Profile;
using Serialize.Linq.Serializers;
using System.Security.Claims;
using AyCode.Core;
using AyCode.Blazor.Components.Services;
using TIAM.Database.DataLayers.Users;
using TIAM.Services.Server.Logins;
using TIAMWebApp.Shared.Application.Interfaces;
using TIAM.Entities.Profiles;
using TIAM.Core.Loggers;
namespace TIAMWebApp.Server.Services;
public class DevAdminSignalRHub : Hub<ISignalRHubItemServer>, IAcSignalRHubServer
public class DevAdminSignalRHub : AcWebSignalRHubWithSessionBase<SignalRTags, TIAM.Core.Loggers.Logger<DevAdminSignalRHub>>
{
private readonly List<DynamicMethodCallModel<SignalRAttribute>> _dynamicMethodCallModels = [];
private readonly TIAM.Core.Loggers.Logger<DevAdminSignalRHub> _logger;
private SessionService _sessionService;
private IConfiguration _configuration;
private readonly AdminDal _adminDal;
private readonly UserDal _userDal;
//private readonly ServiceProviderAPIController _serviceProviderApiController;
//private readonly TransferDataAPIController _transferDataApiController;
public DevAdminSignalRHub(IConfiguration configuration, AdminDal adminDal, UserDal userDal, UserAPIController userApiController, ServiceProviderAPIController serviceProviderApiController, TransferDataAPIController transferDataApiController, MessageAPIController messageApiController, ProfileAPIController profileApiController, LoggerApiController loggerApiController, SessionService sessionService, IEnumerable<IAcLogWriterBase> logWriters)
public DevAdminSignalRHub(IConfiguration configuration, AdminDal adminDal, UserDal userDal, UserAPIController userApiController, ServiceProviderAPIController serviceProviderApiController, TransferDataAPIController transferDataApiController, MessageAPIController messageApiController, ProfileAPIController profileApiController, LoggerApiController loggerApiController, SessionService sessionService, IEnumerable<IAcLogWriterBase> logWriters)
: base(configuration, userDal, sessionService, new TIAM.Core.Loggers.Logger<DevAdminSignalRHub>(logWriters.ToArray()))
{
_adminDal = adminDal;
_userDal = userDal;
_configuration = configuration;
//_serviceProviderApiController = serviceProviderApiController;
//_transferDataApiController = transferDataApiController;
_logger = new(logWriters.ToArray());
_sessionService = sessionService;
_dynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(userApiController));
_dynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(serviceProviderApiController));
_dynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(transferDataApiController));
_dynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(messageApiController));
_dynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(profileApiController));
_dynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(loggerApiController));
DynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(userApiController));
DynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(serviceProviderApiController));
DynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(transferDataApiController));
DynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(messageApiController));
DynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(profileApiController));
DynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(loggerApiController));
//_dynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(typeof(AdminDal)));
}
// https://docs.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-3.1#strongly-typed-hubs
public override async Task OnConnectedAsync()
public override Task OnReceiveMessage(int messageTag, byte[]? message, int? requestId)
{
_logger.Debug($"Server OnConnectedAsync; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}");
LogContextUserNameAndId();
_sessionService.Sessions.TryAdd(Context.ConnectionId, new SessionItem(Context.ConnectionId, new LoginService(_userDal, _configuration)));
_logger.Info($"_sessionService.Sessions count: {_sessionService.Sessions.Count}");
////insert or updatde them into database.
//var CId = _context.UserIdToCId.Find(userId);
//CId.ConnectionId = connectionid;
//_context.Update(CId);
//await _context.SaveChangesAsync();
//await base.OnConnectedAsync();
////await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnConnectedAsync();
//Clients.Caller.ConnectionId = Context.ConnectionId;
//Clients.Caller.UserIdentifier = Context.UserIdentifier;
}
public override async Task OnDisconnectedAsync(Exception? exception)
{
var logText = $"Server OnDisconnectedAsync; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier};";
if (exception == null) _logger.Debug(logText);
else _logger.Error(logText, exception);
LogContextUserNameAndId();
if (_sessionService.Sessions.TryRemove(Context.ConnectionId, out var sessionItem)) sessionItem.LoginService.Logout();
_logger.Info($"_sessionService.Sessions count: {_sessionService.Sessions.Count}");
//await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnDisconnectedAsync(exception);
}
public async Task OnReceiveMessage(int messageTag, byte[]? message, int? requestId)
{
var tagName = ConstHelper.NameByValue<SignalRTags>(messageTag);
var logText = $"Server OnReceiveMessage; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; {tagName}";
if (message is { Length: 0 }) _logger.Warning($"message.Length == 0! {logText}");
else _logger.Info($"[{message?.Length:N0}b] {logText}");
try
return ProcessOnReceiveMessage(messageTag, message, requestId, async tagName =>
{
if (AcDomain.IsDeveloperVersion) LogContextUserNameAndId();
foreach (var methodsByDeclaringObject in _dynamicMethodCallModels)
{
if (!methodsByDeclaringObject.MethodsByMessageTag.TryGetValue(messageTag, out var methodInfoModel)) continue;
object[]? paramValues = null;
logText = $"Found dynamic method for the tag! method: {methodsByDeclaringObject.InstanceObject.GetType().Name}.{methodInfoModel.MethodInfo.Name}";
if (methodInfoModel.ParamInfos is { Length: > 0 })
{
_logger.Debug($"{logText}({string.Join(", ", methodInfoModel.ParamInfos.Select(x => x.Name))}); {tagName}");
paramValues = new object[methodInfoModel.ParamInfos.Length];
var firstParamType = methodInfoModel.ParamInfos[0].ParameterType;
if (methodInfoModel.ParamInfos.Length > 1 || firstParamType == typeof(string) || firstParamType.IsEnum || firstParamType.IsValueType || firstParamType == typeof(DateTime))
{
var msg = message!.MessagePackTo<SignalPostJsonDataMessage<IdMessage>>();
for (var i = 0; i < msg.PostData.Ids.Count; i++)
{
//var obj = (string)msg.PostData.Ids[i];
//if (msg.PostData.Ids[i] is Guid id)
//{
// if (id.IsNullOrEmpty()) throw new NullReferenceException($"PostData.Id.IsNullOrEmpty(); Ids: {msg.PostData.Ids}");
// paramValues[i] = id;
//}
//else if (Guid.TryParse(obj, out id))
//{
// if (id.IsNullOrEmpty()) throw new NullReferenceException($"PostData.Id.IsNullOrEmpty(); Ids: {msg.PostData.Ids}");
// paramValues[i] = id;
//}
//else if (Enum.TryParse(methodInfoModel.ParameterType, obj, out var enumObj))
//{
// paramValues[i] = enumObj;
//}
//else paramValues[i] = Convert.ChangeType(obj, methodInfoModel.ParameterType);
var obj = msg.PostData.Ids[i];
//var config = new MapperConfiguration(cfg =>
//{
// cfg.CreateMap(obj.GetType(), methodInfoModel.ParameterType);
//});
//var mapper = new Mapper(config);
//paramValues[i] = mapper.Map(obj, methodInfoModel.ParameterType);
//paramValues[i] = obj;
var a = Array.CreateInstance(methodInfoModel.ParamInfos[i].ParameterType, 1);
if (methodInfoModel.ParamInfos[i].ParameterType == typeof(Expression))
{
var serializer = new ExpressionSerializer(new JsonSerializer());
paramValues[i] = serializer.DeserializeText((string)(obj.JsonTo(a.GetType()) as Array)?.GetValue(0)!);
}
else paramValues[i] = (obj.JsonTo(a.GetType()) as Array)?.GetValue(0)!;
}
}
else paramValues[0] = message!.MessagePackTo<SignalPostJsonDataMessage<object>>(MessagePackSerializerOptions.Standard).PostDataJson.JsonTo(firstParamType)!;
}
else _logger.Debug($"{logText}(); {tagName}");
var responseDataJson = new SignalResponseJsonMessage(messageTag, SignalResponseStatus.Success, methodInfoModel.MethodInfo.InvokeMethod(methodsByDeclaringObject.InstanceObject, paramValues));
var responseDataJsonKiloBytes = System.Text.Encoding.Unicode.GetByteCount(responseDataJson.ResponseData!) / 1024;
//File.WriteAllText(Path.Combine("h:", $"{requestId}.json"), responseDataJson.ResponseData);
_logger.Info($"[{responseDataJsonKiloBytes}kb] responseData serialized to json");
await ResponseToCaller(messageTag, responseDataJson, requestId);
return;
}
_logger.Debug($"Not found dynamic method for the tag! {tagName}");
switch (messageTag)
{
case SignalRTags.GetAddress:
@ -257,54 +104,9 @@ public class DevAdminSignalRHub : Hub<ISignalRHubItemServer>, IAcSignalRHubServe
// return;
default:
_logger.Error($"Server OnReceiveMessage; messageTag not found! {tagName}");
Logger.Error($"Server OnReceiveMessage; messageTag not found! {tagName}");
break;
}
}
catch (Exception ex)
{
_logger.Error($"Server OnReceiveMessage; {ex.Message}; {tagName}", ex);
}
await ResponseToCaller(messageTag, new SignalResponseJsonMessage(messageTag, SignalResponseStatus.Error), requestId);
});
}
protected async Task ResponseToCaller(int messageTag, ISignalRMessage message, int? requestId)
=> await SendMessageToClient(Clients.Caller, messageTag, message, requestId);
public async Task SendMessageToUserId(string userId, int messageTag, ISignalRMessage message, int? requestId)
=> await SendMessageToClient(Clients.User(userId), messageTag, message, requestId);
public async Task SendMessageToConnectionId(string connectionId, int messageTag, ISignalRMessage message, int? requestId)
=> await SendMessageToClient(Clients.Client(Context.ConnectionId), messageTag, message, requestId);
protected async Task SendMessageToClient(ISignalRHubItemServer sendTo, int messageTag, ISignalRMessage message, int? requestId = null)
{
var responseDataMessagePack = message.ToMessagePack(ContractlessStandardResolver.Options);
_logger.Info($"[{(responseDataMessagePack.Length/1024)}kb] Server sending responseDataMessagePack to client; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; {ConstHelper.NameByValue<SignalRTags>(messageTag)}");
await sendTo.OnReceiveMessage(messageTag, responseDataMessagePack, requestId);
}
public async Task SendMessageToGroup(string groupId, int messageTag, string message)
{
//await Clients.Group(groupId).Post("", messageTag, message);
}
//[Conditional("DEBUG")]
private void LogContextUserNameAndId()
{
string? userName = null;
var userId = Guid.Empty;
if (Context.User != null)
{
userName = Context.User.Identity?.Name;
Guid.TryParse(Context.User.FindFirstValue(ClaimTypes.NameIdentifier), out userId);
}
if (AcDomain.IsDeveloperVersion) _logger.WarningConditional($"SignalR.Context; userName: {userName}; userId: {userId}");
else _logger.Debug($"SignalR.Context; userName: {userName}; userId: {userId}");
}
}

View File

@ -1,35 +0,0 @@
using System.Collections.Concurrent;
using System.Reflection;
using AyCode.Services.SignalRs;
namespace TIAMWebApp.Server.Services;
public class DynamicMethodCallModel<TAttribute> where TAttribute : TagAttribute
{
public object InstanceObject { get; init; }
public ConcurrentDictionary<int, MethodInfoModel<TAttribute>> MethodsByMessageTag { get; init; } = new();
public DynamicMethodCallModel(Type instanceObjectType) : this(instanceObjectType, null!)
{
}
public DynamicMethodCallModel(Type instanceObjectType, params object[] constructorParams) : this(Activator.CreateInstance(instanceObjectType, constructorParams)!)
{
}
public DynamicMethodCallModel(object instanceObject)
{
InstanceObject = instanceObject;
foreach (var methodInfo in instanceObject.GetType().GetMethods())
{
if (methodInfo.GetCustomAttribute(typeof(TAttribute)) is not TAttribute attribute) continue;
if (MethodsByMessageTag.ContainsKey(attribute.MessageTag))
throw new Exception($"Multiple SignaRMessageTag! messageTag: {attribute.MessageTag}; methodName: {methodInfo.Name}");
MethodsByMessageTag[attribute.MessageTag] = new MethodInfoModel<TAttribute>(attribute, methodInfo!);
}
}
}

View File

@ -1,18 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
namespace TIAMWebApp.Server.Services;
public static class ExtensionMethods
{
public static object? InvokeMethod(this MethodInfo methodInfo, object obj, params object[]? parameters)
{
if (methodInfo.GetCustomAttribute(typeof(AsyncStateMachineAttribute)) is AsyncStateMachineAttribute isAsyncTask)
{
dynamic awaitable = methodInfo.Invoke(obj, parameters)!;
return awaitable.GetAwaiter().GetResult();
}
return methodInfo.Invoke(obj, parameters);
}
}

View File

@ -1,24 +0,0 @@
using System.Reflection;
using AyCode.Services.SignalRs;
namespace TIAMWebApp.Server.Services;
public class MethodInfoModel<TAttribute> where TAttribute : TagAttribute
{
public ParameterInfo[]? ParamInfos { get; init; } = null;
public TAttribute Attribute { get; init; }
public MethodInfo MethodInfo { get; init; }
public MethodInfoModel(TAttribute attribute, MethodInfo methodInfo)
{
Attribute = attribute;
MethodInfo = methodInfo;
var parameters = methodInfo.GetParameters();
//if (parameters.Length > 1)
// throw new Exception("MethodInfoModel; parameters.Length > 1");
ParamInfos = parameters;
}
}

View File

@ -0,0 +1,20 @@
using System.Net;
using TIAM.Models;
using TIAMWebApp.Shared.Application.Models;
namespace TIAMWebApp.Shared.Application.Interfaces;
public interface IAcWebSessionServiceClient
{
public string? SessionId { get; set; }
public SiteViewModel SiteViewModel { get; }
public UserSessionModel? User { get; set; }
public IPAddress? IpAddress { get; set; }
public bool IsAuthenticated { get; set; }
public bool IsDevAdmin { get; set; }
public bool IsSysAdmin { get; set; }
public Task ClearAll();
}

View File

@ -1,25 +0,0 @@
using System.Net;
using TIAM.Entities.Products;
using TIAM.Models;
using TIAMWebApp.Shared.Application.Models;
namespace TIAMWebApp.Shared.Application.Interfaces
{
public interface ISessionService
{
public string? SessionId { get; set; }
public SiteViewModel SiteViewModel { get; }
public UserSessionModel? User { get; set; }
public IPAddress? IPAddress { get; set; }
public bool IsAuthenticated { get; set; }
public bool HasCompany { get; set; }
public bool IsDriver { get; set; }
public bool IsDevAdmin { get; set; }
public bool IsSysAdmin { get; set; }
public List<Product> GetHotels();
public Guid DriverPersmissionId { get; set; }
public void ClearAll();
}
}

View File

@ -0,0 +1,13 @@
using TIAM.Entities.Products;
namespace TIAMWebApp.Shared.Application.Interfaces
{
public interface ISessionServiceClient : IAcWebSessionServiceClient
{
public bool HasCompany { get; set; }
public bool IsDriver { get; set; }
public List<Product> GetHotels();
public Guid DriverPersmissionId { get; set; }
}
}

View File

@ -5,7 +5,8 @@ using TIAMWebApp.Shared.Application.Models.PageModels;
namespace TIAMWebApp.Shared.Application.Interfaces
{
public interface IUserDataService
{
{
public Task SignOut();
public Task<UserSessionModel> IsLoggedInAsync(Guid id);
public Task<MainResponse?> AuthenticateUser(LoginModel loginModel);

View File

@ -0,0 +1,36 @@
using System.Net;
using AyCode.Interfaces.StorageHandlers;
using Microsoft.AspNetCore.Components.Authorization;
using TIAM.Models;
using TIAMWebApp.Shared.Application.Interfaces;
using TIAMWebApp.Shared.Application.Models;
namespace TIAMWebApp.Shared.Application.Services;
public abstract class AcWebSessionServiceClientBase(ISecureStorageHandler secureStorageHandler, AuthenticationStateProvider authStateProvider) : IAcWebSessionServiceClient
{
public string? SessionId { get; set; }
public SiteViewModel SiteViewModel { get; } = new();
public UserSessionModel? User { get; set; }
public IPAddress? IpAddress { get; set; }
public bool IsAuthenticated { get; set; } = false;
public bool IsDevAdmin { get; set; } = false;
public bool IsSysAdmin { get; set; } = false;
public virtual async Task ClearAll()
{
await secureStorageHandler.ClearAllSecureStorageAsync();
await authStateProvider.GetAuthenticationStateAsync();
SessionId = string.Empty;
User = null;
IpAddress = null;
IsAuthenticated = false;
IsDevAdmin = false;
IsSysAdmin = false;
SiteViewModel.ClearAll();
}
}

View File

@ -1,24 +1,20 @@
using System.Net;
using AyCode.Core.Extensions;
using AyCode.Interfaces.StorageHandlers;
using AyCode.Utils.Extensions;
using Microsoft.AspNetCore.Components.Authorization;
using Newtonsoft.Json;
using TIAM.Core.Enums;
using TIAM.Entities.Products;
using TIAM.Models;
using TIAMWebApp.Shared.Application.Interfaces;
using TIAMWebApp.Shared.Application.Models;
using TIAMWebApp.Shared.Application.Models.ClientSide;
namespace TIAMWebApp.Shared.Application.Services;
public abstract class SessionServiceClientBase : ISessionService
public abstract class SessionServiceClientBase(ISecureStorageHandler secureStorageHandler, AuthenticationStateProvider authStateProvider)
: AcWebSessionServiceClientBase(secureStorageHandler, authStateProvider), ISessionServiceClient
{
public string? SessionId { get; set; }
public SiteViewModel SiteViewModel { get; } = new();
public UserSessionModel? User { get; set; }
public IPAddress? IPAddress { get; set; }
public bool IsAuthenticated { get; set; } = false;
public bool HasCompany { get; set; } = false;
public bool IsDriver { get; set; } = false;
public bool IsDevAdmin { get; set; } = false;
public bool IsSysAdmin { get; set; } = false;
public Guid DriverPersmissionId { get; set; } = Guid.Empty;
@ -27,18 +23,12 @@ public abstract class SessionServiceClientBase : ISessionService
return User != null ? User.UserModelDto.Products.Where(x => x.ProductType == ProductType.Hotel).ToList() : [];
}
public virtual void ClearAll()
public override async Task ClearAll()
{
SessionId = string.Empty;
User = null;
IPAddress = null;
IsAuthenticated = false;
HasCompany = false;
IsDriver = false;
IsDevAdmin = false;
IsSysAdmin = false;
DriverPersmissionId = Guid.Empty;
SiteViewModel.ClearAll();
await base.ClearAll();
}
}

View File

@ -4,6 +4,7 @@ using System.Text.Json;
using AyCode.Core.Extensions;
using AyCode.Interfaces.StorageHandlers;
using AyCode.Services.Loggers;
using AyCode.Utils.Extensions;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using TIAM.Models.Dtos.Users;
@ -22,12 +23,12 @@ public abstract class UserDataServiceClientBase : IUserDataService
protected readonly LoggerClient Logger;
protected readonly AdminSignalRClient AdminSignalRClient;
protected readonly ISessionService SessionService;
protected readonly ISessionServiceClient SessionService;
protected readonly ISecureStorageHandler SecureStorageHandler;
protected readonly IServiceProviderDataService ServiceProviderDataService;
protected UserDataServiceClientBase(HttpClient http, AdminSignalRClient adminSignalRClient, ISessionService sessionService, ISecureStorageHandler secureStorageHandler, IServiceProviderDataService serviceProviderDataService, IEnumerable<IAcLogWriterClientBase> logWriters)
protected UserDataServiceClientBase(HttpClient http, AdminSignalRClient adminSignalRClient, ISessionServiceClient sessionService, ISecureStorageHandler secureStorageHandler, IServiceProviderDataService serviceProviderDataService, IEnumerable<IAcLogWriterClientBase> logWriters)
{
Http = http;
AdminSignalRClient = adminSignalRClient;
@ -40,6 +41,21 @@ public abstract class UserDataServiceClientBase : IUserDataService
}
public virtual async Task SignOut()
{
var userDetailsStr = await SecureStorageHandler.GetFromSecureStorageAsync(nameof(Setting.UserBasicDetails));
if (!string.IsNullOrEmpty(userDetailsStr))
{
var userBasicDetail = JsonConvert.DeserializeObject<UserBasicDetails>(userDetailsStr);
if (userBasicDetail != null && !userBasicDetail.RefreshToken.IsNullOrWhiteSpace())
await Logout(userBasicDetail.RefreshToken);
}
await SessionService.ClearAll();
}
public async Task<UserSessionModel> IsLoggedInAsync(Guid id)
{
//api call to get user

View File

@ -63,5 +63,8 @@
<Reference Include="AyCode.Services">
<HintPath>..\..\..\AyCode.Core\AyCode.Services.Server\bin\Debug\net8.0\AyCode.Services.dll</HintPath>
</Reference>
<Reference Include="AyCode.Utils">
<HintPath>..\..\..\AyCode.Core\AyCode.Services.Server\bin\Debug\net8.0\AyCode.Utils.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@ -15,8 +15,8 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.6.1" />
<PackageReference Include="MSTest.TestFramework" Version="3.6.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.6.2" />
<PackageReference Include="MSTest.TestFramework" Version="3.6.2" />
</ItemGroup>
<ItemGroup>