This commit is contained in:
Adam 2024-05-26 13:23:10 +02:00
commit a0bb412018
55 changed files with 368 additions and 279 deletions

View File

@ -14,7 +14,7 @@ using TIAM.Entities.Emails;
namespace TIAM.Database.Test
{
[TestClass]
public class UserDalTests : AcUserDalTestBase<UserDal, UserDbContext, User, Profile, UserToken, TiamServiceProvider, UserToServiceProvider, Address, EmailMessage>
public class UserDalTests : AcUserDalTestBase<UserDal, UserDbContext, User, Profile, UserToken, Company, UserToCompany, Address, EmailMessage>
{
//private Guid _registerUserId = Guid.Parse("1f7e0591-330b-463b-81ad-d01f2e65e23e");
//private const string RegisterEmail = "qwerty@xxxxx.com";

View File

@ -220,7 +220,7 @@ namespace TIAM.Database.DataLayers.Admins
#endregion EmailMessage
//15. (IServiceProviderDataService) Create service provider
public Task<bool> CreateServiceProviderAsync(TiamServiceProvider serviceProvider)
public Task<bool> CreateServiceProviderAsync(Company serviceProvider)
{
Context.CreateServiceProvider(serviceProvider);
return Context.SaveChangesAsync().ContinueWith(x => x.Result > 0);
@ -234,12 +234,12 @@ namespace TIAM.Database.DataLayers.Admins
return result.Result > 0;
}
public Task<List<TiamServiceProvider>> GetServiceProvidersAsync()
public Task<List<Company>> GetServiceProvidersAsync()
{
return Context.ServiceProviders.ToListAsync();
}
public virtual Task<TiamServiceProvider?> GetServiceProviderByIdAsync(Guid id)
public virtual Task<Company?> GetServiceProviderByIdAsync(Guid id)
{
GlobalLogger.Info($@"Getting serviceProvider from db {id}");
return Context.ServiceProviders.SingleOrDefaultAsync(x => x.Id == id);
@ -255,7 +255,7 @@ namespace TIAM.Database.DataLayers.Admins
#region ServiceProviders
//14. (IserviceProviderDataService) Update service provider
public Task<bool> UpdateServiceProviderAsync(TiamServiceProvider serviceProvider)
public Task<bool> UpdateServiceProviderAsync(Company serviceProvider)
{
var dbServiceProvider = Context.ServiceProviders.FirstOrDefault(u => u.Id == serviceProvider.Id);
if (dbServiceProvider != null)
@ -315,7 +315,7 @@ namespace TIAM.Database.DataLayers.Admins
}
//17. (IServiceProviderDataService) get service provider by ownerId
public Task<List<TiamServiceProvider>> GetServiceProvidersByOwnerIdAsync()
public Task<List<Company>> GetServiceProvidersByOwnerIdAsync()
{
throw new NotImplementedException();
@ -495,7 +495,7 @@ namespace TIAM.Database.DataLayers.Admins
}
//8. (IPermissionService) create permission group
public Task<bool> CreatePermissionGroupAsync(PermissionGroup permissionGroup, TiamServiceProvider serviceProvider)
public Task<bool> CreatePermissionGroupAsync(PermissionGroup permissionGroup, Company serviceProvider)
{
bool result = false;
using (var transaction = Context.Database.BeginTransaction())

View File

@ -35,7 +35,7 @@ namespace TIAM.Database.DataLayers.ServiceProviders
//// #region ServiceProviders
//// //14. (IserviceProviderDataService) Update service provider
//// public Task<bool> UpdateServiceProviderAsync(TiamServiceProvider serviceProvider)
//// public Task<bool> UpdateServiceProviderAsync(Company serviceProvider)
//// {
//// var dbServiceProvider = Context.ServiceProviders.FirstOrDefault(u => u.Id == serviceProvider.Id);
//// if (dbServiceProvider != null)
@ -95,7 +95,7 @@ namespace TIAM.Database.DataLayers.ServiceProviders
//// }
//// //17. (IServiceProviderDataService) get service provider by ownerId
//// public Task<List<TiamServiceProvider>> GetServiceProvidersByOwnerIdAsync()
//// public Task<List<Company>> GetServiceProvidersByOwnerIdAsync()
//// {
//// throw new NotImplementedException();
@ -275,7 +275,7 @@ namespace TIAM.Database.DataLayers.ServiceProviders
//// }
//// //8. (IPermissionService) create permission group
//// public Task<bool> CreatePermissionGroupAsync(PermissionGroup permissionGroup, TiamServiceProvider serviceProvider)
//// public Task<bool> CreatePermissionGroupAsync(PermissionGroup permissionGroup, Company serviceProvider)
//// {
//// bool result = false;
//// using (var transaction = Context.Database.BeginTransaction())

View File

@ -19,7 +19,7 @@ using TIAM.Models.Dtos.Users;
namespace TIAM.Database.DataLayers.Users
{
public class UserDal : AcUserDalBase<UserDbContext, User, Profile, UserToken, TiamServiceProvider, UserToServiceProvider, Address, EmailMessage>, IDalBase<UserDbContext>
public class UserDal : AcUserDalBase<UserDbContext, User, Profile, UserToken, Company, UserToCompany, Address, EmailMessage>, IDalBase<UserDbContext>
{
public UserDal() : base()

View File

@ -30,7 +30,7 @@ namespace TIAM.Database.DbContexts.Admins
public DbSet<TransferToDriver> TransferToDrivers { get; set; }
public DbSet<Car> Cars { get; set; }
public DbSet<TiamServiceProvider> ServiceProviders { get; set; }
public DbSet<Company> ServiceProviders { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<UserProductMapping> UserProductMappings { get; set; }
public DbSet<PermissionGroup> PermissionGroups { get; set; }

View File

@ -95,7 +95,7 @@ namespace TIAM.Database.DbContexts.Admins
{
if (myproduct == null) return false;
//Automatically add assigneduser for owner
TiamServiceProvider? productOwner = ctx.ServiceProviders.FirstOrDefault(x => x.Id == myproduct.ServiceProviderId);
Company? productOwner = ctx.ServiceProviders.FirstOrDefault(x => x.Id == myproduct.ServiceProviderId);
if (productOwner == null) return false;
var userProductMapping = new UserProductMapping(myproduct.Id, productOwner.OwnerId);
ctx.CreateAssignedUser(userProductMapping);
@ -113,7 +113,7 @@ namespace TIAM.Database.DbContexts.Admins
return true;
}
public static TiamServiceProvider CreateServiceProvider(this IAdminDbContext ctx, TiamServiceProvider serviceProvider)
public static Company CreateServiceProvider(this IAdminDbContext ctx, Company serviceProvider)
{
if (serviceProvider == null) return null;
@ -123,7 +123,7 @@ namespace TIAM.Database.DbContexts.Admins
return serviceProvider;
}
public static TiamServiceProvider UpdateServiceProvider(this IAdminDbContext ctx, TiamServiceProvider serviceProvider)
public static Company UpdateServiceProvider(this IAdminDbContext ctx, Company serviceProvider)
{
if (serviceProvider == null) return null;

View File

@ -30,7 +30,7 @@ namespace TIAM.Database.DbContexts.ServiceProviders
public DbSet<UserProductMapping> UserProductMappings { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<TiamServiceProvider> ServiceProviders { get; set; }
public DbSet<Company> ServiceProviders { get; set; }
public DbSet<PermissionsType> PermissionsTypes { get; set; }

View File

@ -13,5 +13,5 @@ using TIAM.Entities.Users;
namespace TIAM.Database.DbContexts.Users;
public interface IUserDbContext :
IAcUserDbContextBase<User, Profile, UserToken, TiamServiceProvider, UserToServiceProvider, Address, EmailMessage>, IUserDbSet, IAddressDbSet, ITransferDestinationDbSet, ITransferDbSet, IEmailMessageDbSet
IAcUserDbContextBase<User, Profile, UserToken, Company, UserToCompany, Address, EmailMessage>, IUserDbSet, IAddressDbSet, ITransferDestinationDbSet, ITransferDbSet, IEmailMessageDbSet
{ }

View File

@ -28,7 +28,7 @@ using TIAM.Entities.Users;
namespace TIAM.Database.DbContexts.Users
{
public class UserDbContext : DbContextBase, IUserDbContext
//AcUserDbContextBase<User, Profile, UserToken, TiamServiceProvider, UserToServiceProvider, Address, EmailMessage>, IUserDbContext
//AcUserDbContextBase<User, Profile, UserToken, Company, UserToServiceProvider, Address, EmailMessage>, IUserDbContext
{
public DbSet<User> Users { get; set; }
public DbSet<UserToken> UserTokens { get; set; }

View File

@ -5,5 +5,5 @@ namespace TIAM.Database.DbSets.ServiceProvider;
public interface IServiceProviderDbSet
{
public DbSet<TiamServiceProvider> ServiceProviders { get; set; }
public DbSet<Company> ServiceProviders { get; set; }
}

View File

@ -6,6 +6,6 @@ using TIAM.Entities.Users;
namespace TIAM.Database.DbSets.Users;
public interface IUserDbSet : IAcUserDbSet<User, Profile, TiamServiceProvider, UserToServiceProvider, Address>
public interface IUserDbSet : IAcUserDbSet<User, Profile, Company, UserToCompany, Address>
{
}

View File

@ -27,7 +27,7 @@ public class UserProductMappingEntityTypeTransferConfiguration : IAcEntityTypeCo
builder.BuildUserProductMappingToRelations(false);
}
}
public class UserEntityTypeDefaultConfiguration : AcUserEntityTypeDefaultConfiguration<User, Profile, TiamServiceProvider, UserToServiceProvider, Address> //IAcEntityTypeConfiguration<User>//
public class UserEntityTypeDefaultConfiguration : AcUserEntityTypeDefaultConfiguration<User, Profile, Company, UserToCompany, Address> //IAcEntityTypeConfiguration<User>//
{
public override void Configure(EntityTypeBuilder<User> builder)
{

View File

@ -14,7 +14,7 @@ public class Product : ProductBase
[Required]
public Guid ServiceProviderId { get; set; }
public virtual TiamServiceProvider ServiceProvider { get; set; }
public virtual Company ServiceProvider { get; set; }
public virtual List<User> Users { get; } = new();
public virtual List<UserProductMapping> UserProductMappings { get; } = new();
@ -26,8 +26,8 @@ public class Product : ProductBase
{
ServiceProviderId = serviceProviderId;
}
public Product(Guid ownerId, TiamServiceProvider serviceProvider, ProductType productType, string name, string description, float price, string jsonDetails) : this(Guid.NewGuid(), ownerId, serviceProvider, productType, name, description, price, jsonDetails) { }
public Product(Guid id, Guid serviceProviderId, TiamServiceProvider serviceProvider, ProductType productType, string name, string description, float price, string jsonDetails) : base(id, productType, name, description, price, jsonDetails)
public Product(Guid ownerId, Company serviceProvider, ProductType productType, string name, string description, float price, string jsonDetails) : this(Guid.NewGuid(), ownerId, serviceProvider, productType, name, description, price, jsonDetails) { }
public Product(Guid id, Guid serviceProviderId, Company serviceProvider, ProductType productType, string name, string description, float price, string jsonDetails) : base(id, productType, name, description, price, jsonDetails)
{
ServiceProviderId = serviceProviderId;
ServiceProvider = serviceProvider;

View File

@ -6,28 +6,29 @@ using AyCode.Interfaces.Entities;
using AyCode.Interfaces.TimeStampInfo;
using AyCode.Interfaces.Users;
using TIAM.Entities.Products;
using TIAM.Entities.Profiles;
using TIAM.Entities.Users;
namespace TIAM.Entities.ServiceProviders;
[Table("ServiceProviders")]
public class TiamServiceProvider : AcServiceProvider<User, UserToServiceProvider>, ITiamServiceProvider<User, UserToServiceProvider>
public class Company : AcCompany<User, UserToCompany, Profile>, ICompany<User, UserToCompany, Profile>
{
public virtual List<Product> Products { get; } = new();
public TiamServiceProvider()
public Company()
{
}
public TiamServiceProvider(string name, Guid ownerId) : this(Guid.NewGuid(), name, ownerId)
public Company(string name, Guid ownerId) : this(Guid.NewGuid(), name, ownerId)
{
}
public TiamServiceProvider(Guid id, string name, Guid ownerId) : this(id, name, ownerId, Guid.NewGuid())
public Company(Guid id, string name, Guid ownerId) : this(id, name, ownerId, Guid.NewGuid())
{
}
public TiamServiceProvider(Guid id, string name, Guid ownerId, Guid affiliateId) : base(id, name, ownerId, affiliateId)
public Company(Guid id, string name, Guid ownerId, Guid affiliateId) : base(id, name, ownerId, affiliateId)
{
}
}

View File

@ -0,0 +1,14 @@
using AyCode.Interfaces.ServiceProviders;
using TIAM.Entities.Products;
using TIAM.Entities.Profiles;
using TIAM.Entities.Users;
namespace TIAM.Entities.ServiceProviders;
public interface ICompany<TUser, TIUserToServiceProvider, TProfile> : IAcCompany<TUser, TIUserToServiceProvider, TProfile>, ICompanyBase
where TUser : class, IUserBase
where TIUserToServiceProvider : class, IUserToCompanyBase
where TProfile : class, IProfileDto
{
public List<Product> Products { get; }
}

View File

@ -2,6 +2,6 @@
namespace TIAM.Entities.ServiceProviders;
public interface ITiamServiceProviderBase : IAcServiceProviderBase
public interface ICompanyBase : IAcCompanyBase
{
}

View File

@ -1,12 +0,0 @@
using AyCode.Interfaces.ServiceProviders;
using TIAM.Entities.Products;
using TIAM.Entities.Users;
namespace TIAM.Entities.ServiceProviders;
public interface ITiamServiceProvider<TUser, TIUserToServiceProvider> : IAcServiceProvider<TUser, TIUserToServiceProvider>, ITiamServiceProviderBase
where TUser : class, IUserBase
where TIUserToServiceProvider : class, IUserToServiceProviderBase
{
public List<Product> Products { get; }
}

View File

@ -6,7 +6,7 @@ using TIAM.Entities.ServiceProviders;
namespace TIAM.Entities.Users;
public interface IUser : IAcUser<Profile, TiamServiceProvider, UserToServiceProvider, Address>, IUserDto<Profile, TiamServiceProvider, UserToServiceProvider, Address>, IUserBase
public interface IUser : IAcUser<Profile, Company, UserToCompany, Address>, IUserDto<Profile, Company, UserToCompany, Address>, IUserBase
{
public List<Product> Products { get; }

View File

@ -10,9 +10,9 @@ using TIAM.Entities.ServiceProviders;
namespace TIAM.Entities.Users;
public interface IUserDto<TProfile, TServiceProvider, TUserToServiceProvider, TProfileAddress> : IAcUserDtoBase<TProfile, TServiceProvider, TUserToServiceProvider, TProfileAddress>
public interface IUserDto<TProfile, TCompany, TUserToServiceProvider, TProfileAddress> : IAcUserDtoBase<TProfile, TCompany, TUserToServiceProvider, TProfileAddress>
where TProfile : class, IProfile<TProfileAddress>
where TServiceProvider : class, ITiamServiceProviderBase
where TUserToServiceProvider : class, IUserToServiceProviderBase
where TCompany : class, ICompanyBase
where TUserToServiceProvider : class, IUserToCompanyBase
where TProfileAddress : class, IAddress
{ }

View File

@ -10,7 +10,7 @@ using TIAM.Entities.ServiceProviders;
namespace TIAM.Entities.Users
{
public interface IUserDtoDetail : IAcUserDtoDetailBase<Profile, TiamServiceProvider, UserToServiceProvider, Address>
public interface IUserDtoDetail : IAcUserDtoDetailBase<Profile, Company, UserToCompany, Address>
{
}
}

View File

@ -10,6 +10,6 @@ public interface IUserRelation : IAcUserRelation<User>, IUserForeignKey
{
}
public interface IUsersRelation : IAcUsersRelation<User, UserToServiceProvider>
public interface IUsersRelation : IAcUsersRelation<User, UserToCompany>
{
}

View File

@ -0,0 +1,11 @@
using TIAM.Entities.ServiceProviders;
namespace TIAM.Entities.Users;
public interface IUserToCompany<TUser, TCompany> : IUserToCompanyBase
where TUser : class, IUserBase
where TCompany : class, ICompanyBase
{
public TUser User { get; set; }
public TCompany Company { get; set; }
}

View File

@ -0,0 +1,6 @@
using AyCode.Interfaces.Users;
namespace TIAM.Entities.Users;
public interface IUserToCompanyBase : IAcUserToCompanyBase
{}

View File

@ -1,11 +0,0 @@
using TIAM.Entities.ServiceProviders;
namespace TIAM.Entities.Users;
public interface IUserToServiceProvider<TUser, TServiceProvider> : IUserToServiceProviderBase
where TUser : class, IUserBase
where TServiceProvider : class, ITiamServiceProviderBase
{
public TUser User { get; set; }
public TServiceProvider ServiceProvider { get; set; }
}

View File

@ -1,6 +0,0 @@
using AyCode.Interfaces.Users;
namespace TIAM.Entities.Users;
public interface IUserToServiceProviderBase : IAcUserToServiceProviderBase
{}

View File

@ -14,7 +14,7 @@ using TIAM.Entities.ServiceProviders;
namespace TIAM.Entities.Users
{
[Table("Users")]
public class User : AcUser<Profile, TiamServiceProvider, UserToServiceProvider, Address>, IUser
public class User : AcUser<Profile, Company, UserToCompany, Address>, IUser
{
public virtual List<Product> Products { get; } = new();

View File

@ -17,7 +17,7 @@ namespace TIAM.Entities.Users;
// public Guid ServiceProviderId { get; set; }
// public virtual User User { get; set; }
// public virtual TiamServiceProvider ServiceProvider { get; set; }
// public virtual Company ServiceProvider { get; set; }
// public DateTime Created { get; set; }
// public DateTime Modified { get; set; }

View File

@ -5,7 +5,7 @@ using TIAM.Entities.ServiceProviders;
namespace TIAM.Entities.Users;
public class UserToServiceProvider : AcUserToServiceProvider<User, TiamServiceProvider>, IUserToServiceProvider<User, TiamServiceProvider>
public class UserToCompany : AcUserToCompany<User, Company>, IUserToCompany<User, Company>
{
}

View File

@ -6,5 +6,5 @@ using TIAM.Entities.Users;
namespace TIAM.Models.Server.Logins;
public interface ILoggedInModel : IAcLoggedInModelBase<User, UserToken, Profile, TiamServiceProvider, UserToServiceProvider, Address>
public interface ILoggedInModel : IAcLoggedInModelBase<User, UserToken, Profile, Company, UserToCompany, Address>
{}

View File

@ -6,6 +6,6 @@ using TIAM.Entities.Users;
namespace TIAM.Models.Server.Logins;
public class LoggedInModel : AcLoggedInModelServer<User, UserToken, Profile, TiamServiceProvider, UserToServiceProvider, Address>, ILoggedInModel
public class LoggedInModel : AcLoggedInModelServer<User, UserToken, Profile, Company, UserToCompany, Address>, ILoggedInModel
{
}

View File

@ -6,7 +6,7 @@ using TIAM.Entities.Users;
namespace TIAM.Models.Dtos.Users;
public class UserDto : IUserDto<Profile, TiamServiceProvider, UserToServiceProvider, Address>
public class UserDto : IUserDto<Profile, Company, UserToCompany, Address>
{
public Guid Id { get; set; }
@ -15,6 +15,6 @@ public class UserDto : IUserDto<Profile, TiamServiceProvider, UserToServiceProvi
public Guid AffiliateId { get; set; }
public List<TiamServiceProvider> ServiceProviders { get; set; }
public List<UserToServiceProvider> UserToServiceProviders { get; set; }
public List<Company> ServiceProviders { get; set; }
public List<UserToCompany> UserToServiceProviders { get; set; }
}

View File

@ -10,7 +10,7 @@ using TIAM.Models.Dtos.Profiles;
namespace TIAM.Models.Dtos.Users;
public class UserModelDto : AcUserModelDtoBase<UserDto, Profile, ProfileDto, TiamServiceProvider, UserToServiceProvider, Address>, IProductsRelation, IUserModelDtoMinBase
public class UserModelDto : AcUserModelDtoBase<UserDto, Profile, ProfileDto, Company, UserToCompany, Address>, IProductsRelation, IUserModelDtoMinBase
{
public List<UserProductMapping> UserProductMappings { get; set; }
public List<Product> Products { get; set; }

View File

@ -13,7 +13,7 @@ using TIAM.Models.Dtos.Profiles;
namespace TIAM.Models.Dtos.Users
{
public class UserModelDtoDetail : AcUserModelDtoDetailBase<UserDtoDetail, Profile, ProfileDto, TiamServiceProvider, UserToServiceProvider, Address>, IProductsRelation, IUserModelDtoMinBase
public class UserModelDtoDetail : AcUserModelDtoDetailBase<UserDtoDetail, Profile, ProfileDto, Company, UserToCompany, Address>, IProductsRelation, IUserModelDtoMinBase
{
public List<UserProductMapping> UserProductMappings { get; set; }
public List<Product> Products { get; set; }

View File

@ -13,7 +13,7 @@ using TIAM.Services.Server.Logins;
namespace TIAM.Services.Server.Tests.LoginServices
{
[TestClass]
public class LoginServiceServerTests : AcLoginServiceServerTestBase<UserDal, UserDbContext, LoginService, LoggedInModel, User, Profile, UserToken, TiamServiceProvider, UserToServiceProvider, Address, EmailMessage>
public class LoginServiceServerTests : AcLoginServiceServerTestBase<UserDal, UserDbContext, LoginService, LoggedInModel, User, Profile, UserToken, Company, UserToCompany, Address, EmailMessage>
{
private const string RegisterEmail = "qwerty@xxxxx.com";
private const string RegisterPassword = "elem'r";

View File

@ -7,7 +7,7 @@ using TIAM.Models.Server.Logins;
namespace TIAM.Services.Server.Logins;
public interface ILoginService : IAcLoginServiceServer<LoggedInModel, User, UserToken, Profile, TiamServiceProvider, UserToServiceProvider, Address>
public interface ILoginService : IAcLoginServiceServer<LoggedInModel, User, UserToken, Profile, Company, UserToCompany, Address>
{
}

View File

@ -12,7 +12,7 @@ using TIAM.Models.Server.Logins;
namespace TIAM.Services.Server.Logins;
public class LoginService(UserDal userDal, IConfiguration configuration) : AcLoginServiceServer<LoggedInModel, UserDal, UserDbContext, User, UserToken, Profile, TiamServiceProvider, UserToServiceProvider, Address, EmailMessage>(userDal, configuration), ILoginService
public class LoginService(UserDal userDal, IConfiguration configuration) : AcLoginServiceServer<LoggedInModel, UserDal, UserDbContext, User, UserToken, Profile, Company, UserToCompany, Address, EmailMessage>(userDal, configuration), ILoginService
{
public override LoggedInModel Login(string? email, string? password)

View File

@ -148,7 +148,7 @@
{
if (e.IsNew)
{
var newEmployee = (TiamServiceProvider)e.EditModel;
var newEmployee = (Company)e.EditModel;
newEmployee.Name = "John";
newEmployee.OwnerId = Guid.NewGuid();
}

View File

@ -39,9 +39,9 @@ namespace TIAMSharedUI.Pages.User.SysAdmins
//List<ProductWizardModel> _productArray =
//[
// new ProductWizardModel(new TiamServiceProvider(), ProductType.Hotel, "XY hotel", "XYHotel description is here ", 10.0f, ""),
// new ProductWizardModel(new TiamServiceProvider(), ProductType.Hotel, "XY hotel", "XYHotel description is here ", 10.0f, ""),
// new ProductWizardModel(new TiamServiceProvider(), ProductType.Hotel, "XY hotel", "XYHotel description is here ", 10.0f, "")
// new ProductWizardModel(new Company(), ProductType.Hotel, "XY hotel", "XYHotel description is here ", 10.0f, ""),
// new ProductWizardModel(new Company(), ProductType.Hotel, "XY hotel", "XYHotel description is here ", 10.0f, ""),
// new ProductWizardModel(new Company(), ProductType.Hotel, "XY hotel", "XYHotel description is here ", 10.0f, "")
//];
private readonly List<ProductWizardModel> _productWizardModels = [];

View File

@ -16,6 +16,8 @@
@using MessagePack
@using MessagePack.Resolvers
@using AyCode.Core.Extensions;
@using AyCode.Core
@using AyCode.Core.Helpers
@layout AdminLayout
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject IStringLocalizer<TIAMResources> localizer
@ -387,21 +389,21 @@
{
_logger = new LoggerClient<ManageTransfers>(LogWriters.ToArray());
devAdminSignalClient.OnMessageReceived += (messageTag, message) =>
devAdminSignalClient.SendRequestToServerAsync(SignalRTags.GetTransfersAsync, responseBytes =>
{
if (messageTag == SignalRTags.PostTransfersAsync)
{
var json = message?.MessagePackTo<string>(ContractlessStandardResolver.Options);
var transfers = responseBytes.MessagePackTo<string>(ContractlessStandardResolver.Options).JsonTo<List<Transfer>>();
InitializeDataSources(json?.JsonTo<List<Transfer>>() ?? []);
StateHasChanged();
}
};
InitializeDataSources(transfers ?? []);
StateHasChanged();
}).Forget();
await devAdminSignalClient.Send("", SignalRTags.GetTransfersAsync, null);
//var transfers = await devAdminSignalClient.SendRequestToServerAsync<List<Transfer>>(SignalRTags.GetTransfersAsync);
//InitializeDataSources(transfers ?? []);
//InitializeDataSources(await transferDataService.GetTransfersAsync());
base.OnInitialized();
base.OnInitialized();
}
private void InitializeDataSources(List<Transfer> transferDataList)

View File

@ -61,9 +61,9 @@
[Parameter]
public UserModelDtoDetail UserModelDtoDetail { get; set; }
List<TiamServiceProvider> _detailGridData;
List<Company> _detailGridData;
List<TiamServiceProvider> _availableServices;
List<Company> _availableServices;
public UserModelDtoDetail UserInfo;
@ -73,7 +73,7 @@
{
_logger = new LoggerClient<UserGrid_MasterDetail_NestedGrid_ServiceProviders>(LogWriters.ToArray());
_detailGridData = UserModelDtoDetail.ServiceProviders ?? new List<TiamServiceProvider>();
_detailGridData = UserModelDtoDetail.ServiceProviders ?? new List<Company>();
_availableServices = await ServiceProviderDataService.GetServiceProvidersAsync();
_logger.Info($"DetailGridData: {_detailGridData.Count}");

View File

@ -28,16 +28,13 @@
<div class="page">
<TiamErrorBoundaryComponent OnError="HandleError">
<TiamErrorBoundaryComponent LoggerCategory="AdminLayout" OnError="HandleError">
<div class="my-sidebar">
<AdminNavMenu />
</div>
<main>
<article class="content">
@Body
</article>
</main>
@ -45,54 +42,8 @@
</div>
@code {
private ILogger _logger;
public PopupMessageBox PopupMessageBox { get; private set; } = default!;
protected override void OnInitialized()
{
_logger = new LoggerClient<AdminLayout>(LogWriters.ToArray());
base.OnInitialized();
}
private void HandleError(Exception exception)//, [CallerMemberName] string? memberName = null)
{
exception.GetCategoryAndMemberNameFromStackTraceString(out var memberName, out var categoryName);
if (memberName.IsNullOrWhiteSpace()) memberName = "..."; //ne "HandleError" memberName-el logoljunk! - J.
try
{
_logger.Error($"An error occurred: {exception.Message}", exception, categoryName, memberName);
}
catch (Exception loggerException)
{
jsRuntime.InvokeVoidAsync("console.error", $"{nameof(AdminLayout)}->HandleError; Logger error! {loggerException}");
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
//LogErrorToServer(exception);
// Show a notification on UI
ShowErrorNotification("An unexpected error occurred. Please try again later.");
//jsRuntime.InvokeVoidAsync("console.error", $"An error occurred: {exception.Message}");
//jsRuntime.InvokeVoidAsync("console.warn", $"Error details: {exception.StackTrace}");
}
// private void LogErrorToServer(Exception exception)
// {
// //_logger.Error($"An error occurred: {exception.Message}");
// }
private void ShowErrorNotification(string message)
{
jsRuntime.InvokeVoidAsync("alert", message);
}
private void HandleError(Exception exception) => jsRuntime.InvokeVoidAsync("alert", "An unexpected error occurred. Please try again later.");
}

View File

@ -1,11 +1,21 @@
@inherits ErrorBoundary
@using TIAMWebApp.Shared.Application.Utility
@using AyCode.Core.Extensions
@using AyCode.Services.Loggers
@using AyCode.Utils.Extensions
@inject IJSRuntime jsRuntime
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inherits ErrorBoundary
@if (_currentError != null)
{
@* <CascadingValue Value=PopupMessageBox> *@
<div class="error-message">
<p>An error has occurred: @_currentError.Message</p>
</div>
@* </CascadingValue>
<PopupMessageBox @ref="PopupMessageBox" /> *@
}
else
{
@ -14,17 +24,55 @@ else
@code {
private Exception? _currentError;
private LoggerClient _logger;
//public PopupMessageBox PopupMessageBox { get; private set; } = default!;
[Parameter]
public string LoggerCategory { get; set; }
[Parameter]
public EventCallback<Exception> OnError { get; set; }
protected override void OnInitialized()
{
_logger = new LoggerClient(LoggerCategory, LogWriters.ToArray());
base.OnInitialized();
}
// private void HandleError(Exception exception) //, [CallerMemberName] string? memberName = null)
// {
// }
protected override Task OnErrorAsync(Exception exception)
{
_currentError = exception;
exception.GetCategoryAndMemberNameFromStackTraceString(out var memberName, out var categoryName);
if (memberName.IsNullOrWhiteSpace()) memberName = "..."; //ne az "OnErrorAsync" memberName-el logoljunk! - J.
try
{
_logger.Error($"An error occurred: {exception.Message}", exception, categoryName, memberName);
}
catch (Exception loggerException)
{
jsRuntime.InvokeVoidAsync("console.error", $"{nameof(TiamErrorBoundaryComponent)}->OnErrorAsync; Logger error! {loggerException}");
jsRuntime.InvokeVoidAsync("console.error", $"{nameof(TiamErrorBoundaryComponent)}->{memberName}; An error occurred: {exception}");
//jsRuntime.InvokeVoidAsync("console.warn", $"{nameof(TiamErrorBoundaryComponent)}->{memberName}; Error details: {exception.StackTrace}");
}
//ShowErrorNotification("An unexpected error occurred. Please try again later.");
return OnError.HasDelegate ? OnError.InvokeAsync(exception) : base.OnErrorAsync(exception);
}
// private void ShowErrorNotification(string message)
// {
// jsRuntime.InvokeVoidAsync("alert", message);
// }
protected override void OnParametersSet()
{
_currentError = null;

View File

@ -23,90 +23,32 @@
<!--div-- class="page"-->
<div>
<TiamErrorBoundaryComponent OnError="HandleError">
<TiamErrorBoundaryComponent LoggerCategory="MainLayout" OnError="HandleError">
<AppLaunchComponent />
<Navbar />
<!--div class="my-sidebar">
<Navbar />
<!--div class="my-sidebar">
<NavMenu />
</div-->
<main>
<article class="content">
<CascadingValue Value=PopupMessageBox>
@Body
</CascadingValue>
</article>
</main>
@* <div class="footer">
</div> *@
<FooterComponent></FooterComponent>
<PopupMessageBox @ref="PopupMessageBox" />
<main>
<article class="content">
<CascadingValue Value=PopupMessageBox>
@Body
</CascadingValue>
</article>
</main>
@* <div class="footer">
</div> *@
<FooterComponent></FooterComponent>
<PopupMessageBox @ref="PopupMessageBox" />
</TiamErrorBoundaryComponent>
</div>
@code {
private ILogger _logger;
public PopupMessageBox PopupMessageBox { get; private set; } = default!;
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);
if (memberName.IsNullOrWhiteSpace()) memberName = "..."; //ne "HandleError" memberName-el logoljunk! - J.
try
{
_logger.Error($"An error occurred: {exception.Message}", exception, categoryName, memberName);
}
catch (Exception loggerException)
{
jsRuntime.InvokeVoidAsync("console.error", $"{nameof(MainLayout)}->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}");
}
// Log the error to server
//LogErrorToServer(exception);
// Show a notification on UI
ShowErrorNotification("An unexpected error occurred. Please try again later.");
//jsRuntime.InvokeVoidAsync("console.error", $"An error occurred: {exception.Message}");
//jsRuntime.InvokeVoidAsync("console.warn", $"Error details: {exception.StackTrace}");
}
// private void LogErrorToServer(Exception exception)
// {
// //_logger.Error($"An error occurred: {exception.Message}");
// }
private void ShowErrorNotification(string message)
{
jsRuntime.InvokeVoidAsync("alert", message);
}
private void HandleError(Exception exception) => jsRuntime.InvokeVoidAsync("alert", "An unexpected error occurred. Please try again later.");
}

View File

@ -15,6 +15,7 @@
<PackageReference Include="Blazor.AnimateOnScroll" Version="1.1.0" />
<PackageReference Include="BlazorAnimation" Version="2.2.0" />
<PackageReference Include="DevExpress.Blazor" Version="23.2.3" />
<PackageReference Include="MessagePack" Version="2.5.140" />
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="8.0.5" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="8.0.5" />
</ItemGroup>

View File

@ -67,7 +67,7 @@ namespace TIAMWebApp.Server.Controllers
GlobalLogger.Info($@"ServiceProvider to be created: {id}, {name}, {ownerId}");
await _adminDal.CreateServiceProviderAsync(new TiamServiceProvider(id, name, ownerId, Guid.NewGuid()));
await _adminDal.CreateServiceProviderAsync(new Company(id, name, ownerId, Guid.NewGuid()));
}
}
@ -79,7 +79,7 @@ namespace TIAMWebApp.Server.Controllers
[AllowAnonymous]
[HttpGet]
[Route(APIUrls.GetServiceProvidersRouteName)]
public Task<List<TiamServiceProvider>> GetServiceProviders()
public Task<List<Company>> GetServiceProviders()
{
//var users = await _serviceProviderDal.Ctx.Users.ToListAsync();//.GetUsersAsync();
//return users;
@ -90,7 +90,7 @@ namespace TIAMWebApp.Server.Controllers
[AllowAnonymous]
[HttpPost]
[Route(APIUrls.GetServiceProviderByIdRouteName)]
public async Task<TiamServiceProvider?> GetServiceProviderById([FromBody] Guid id)
public async Task<Company?> GetServiceProviderById([FromBody] Guid id)
{
GlobalLogger.Info($@"GetServiceProviderById called with id: {id}");
@ -110,7 +110,7 @@ namespace TIAMWebApp.Server.Controllers
//return serviceProviders.Where(x => x.OwnerId == ownerId).ToList();
var myServiceproviders = serviceProviders.Where(x => x.OwnerId == ownerId).ToDictionary(x => x.Id, x => x.Name);
//put TiamServiceProvider id and name into a dictionary
//put Company id and name into a dictionary
return myServiceproviders;
}

View File

@ -5,7 +5,6 @@ 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;

View File

@ -1,52 +1,78 @@
using AyCode.Core.Extensions;
using AyCode.Core.Helpers;
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;
namespace TIAMWebApp.Server.Services;
public class DevAdminSignalRHub(AdminDal adminDal, IEnumerable<IAcLogWriterBase> logWriters) : Hub<ISignalRHubServer>, ISignalRHubServer
public class DevAdminSignalRHub(AdminDal adminDal, IEnumerable<IAcLogWriterBase> logWriters) : Hub<ISignalRHubItemServer>, IAcSignalRHubServer
{
private readonly 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()
{
_logger.Debug($"OnConnectedAsync; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}");
_logger.Debug($"Server OnConnectedAsync; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}");
//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)
{
_logger.Error($"OnDisconnectedAsync; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}", exception);
_logger.Error($"Server OnDisconnectedAsync; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}", exception);
//await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnDisconnectedAsync(exception);
}
public async Task OnRequestMessage(int messageTag, int requestId)
{
_logger.Info($"Server OnRequestMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}");
if (messageTag == SignalRTags.GetTransfersAsync)
await ResponseToCaller(SignalRTags.PostTransfersAsync, await adminDal.GetTransfersJsonAsync(), requestId);
}
public async Task OnReceiveMessage(int messageTag, byte[] message, int? requestId)
{
var logText = $"Server OnReceiveMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}";
if (message.Length == 0) _logger.Warning($"message.Length == 0! {logText}");
else _logger.Info(logText);
//if (messageTag == SignalRTags.GetTransfersAsync)
// ResponseToClient(messageTag, await adminDal.GetTransfersJsonAsync(), requestId);
}
protected async Task ResponseToCaller(int messageTag, object message, int requestId)
=> await SendMessageToClient(Clients.Caller, messageTag, message, requestId);
protected async Task SendMessageToClient(ISignalRHubItemServer sendTo, int messageTag, object message, int? requestId = null)
{
_logger.Info($"Server SendMessageToClient; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}");
await sendTo.OnReceiveMessage(messageTag, message.ToMessagePack(ContractlessStandardResolver.Options), requestId);
}
protected void SendRequestToClient(ISignalRHubItemServer sendTo, int messageTag, int requestId)
{
_logger.Info($"Server SendRequestToClient; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}");
sendTo.OnRequestMessage(messageTag, requestId).Forget();
}
public async Task SendMessageToGroup(string groupId, int messageTag, string message)
{
//await Clients.Group(groupId).Post("", messageTag, message);
}
public async Task Send(string user, int messageTag, object? message)
{
_logger.Info($"{nameof(user)}: {user}; {nameof(messageTag)}: {messageTag}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}");
await Clients.Caller.MessageReceived("", messageTag, message?.ToMessagePack(ContractlessStandardResolver.Options));
}
public async Task MessageReceived(string user, int messageTag, byte[]? message)
{
_logger.Info($"{nameof(user)}: {user}; {nameof(messageTag)}: {messageTag}; ConnectionId: {Context.ConnectionId}; UserIdentifier: {Context.UserIdentifier}");
if (messageTag == SignalRTags.GetTransfersAsync)
await Send("", SignalRTags.PostTransfersAsync, await adminDal.GetTransfersJsonAsync());
}
}

View File

@ -2,6 +2,6 @@
namespace TIAMWebApp.Server.Services;
public interface ISignalRHubServer : IAcSignalRHubServer
public interface ISignalRHubItemServer : IAcSignalRHubItemServer
{
}

View File

@ -13,16 +13,16 @@
<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.AspNetCore.SignalR.Common" 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" />
<PackageReference Include="SendGrid" Version="9.29.3" />
<PackageReference Include="SkiaSharp" Version="2.88.8" />
<PackageReference Include="SkiaSharp.Views.Desktop.Common" Version="2.88.8" />
<PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="6.6.1" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.1" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.6.1" />
<PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="6.6.2" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.6.2" />
</ItemGroup>
<ItemGroup>

View File

@ -20,16 +20,16 @@ namespace TIAMWebApp.Shared.Application.Interfaces
public Task DeleteServiceProviderAsync(Guid serviceProviderId);
//14 Update service provider
public Task<bool> UpdateServiceProviderAsync(TiamServiceProvider serviceProvider);
public Task<bool> UpdateServiceProviderAsync(Company serviceProvider);
//15. Create service provider
public Task<bool> CreateServiceProviderAsync(TiamServiceProvider serviceProvider);
public Task<bool> CreateServiceProviderAsync(Company serviceProvider);
//16. (IServiceProviderDataService) get all service providers
public Task<List<TiamServiceProvider>> GetServiceProvidersAsync();
public Task<List<Company>> GetServiceProvidersAsync();
//18. (IServiceProviderDataService) get serviceProvider by Id
public Task<TiamServiceProvider?> GetServiceProviderByIdAsync(Guid id);
public Task<Company?> GetServiceProviderByIdAsync(Guid id);
//19. (IServiceProviderDataService) Create product
public Task<bool> CreateProductAsync(Product product);

View File

@ -31,16 +31,16 @@ namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels
public float Price { get; set; }
public string? JsonDetails { get; set; }
public TiamServiceProvider TiamServiceProvider { get; set; }
public Company Company { get; set; }
public ProductWizardModel() { }
public ProductWizardModel(TiamServiceProvider tiamServiceProvider, ProductType productType, string name, string description, float price, string? jsonDetails) : this(Guid.NewGuid(), tiamServiceProvider, productType, name, description, price, jsonDetails) { }
public ProductWizardModel(Company company, ProductType productType, string name, string description, float price, string? jsonDetails) : this(Guid.NewGuid(), company, productType, name, description, price, jsonDetails) { }
public ProductWizardModel(Guid id, TiamServiceProvider tiamServiceProvider, ProductType productType, string name, string description, float price, string? jsonDetails)
public ProductWizardModel(Guid id, Company company, ProductType productType, string name, string description, float price, string? jsonDetails)
{
Id = id;
TiamServiceProvider = tiamServiceProvider;
Company = company;
ProductType = productType;
Name = name;
Description = description;
@ -48,9 +48,9 @@ namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels
JsonDetails = jsonDetails;
}
public Product SaveToProduct(TiamServiceProvider tiamServiceProvider)
public Product SaveToProduct(Company company)
{
Product NewProduct = new(this.Id, tiamServiceProvider.Id, tiamServiceProvider, this.ProductType, this.Name, this.Description, this.Price, this.JsonDetails);
Product NewProduct = new(this.Id, company.Id, company, this.ProductType, this.Name, this.Description, this.Price, this.JsonDetails);
return NewProduct;
}
}

View File

@ -1,10 +1,15 @@
using AyCode.Core.Enums;
using System.Collections.Concurrent;
using AyCode.Core;
using AyCode.Core.Enums;
using AyCode.Core.Extensions;
using AyCode.Core.Helpers;
using AyCode.Core.Loggers;
using AyCode.Entities.LogItems;
using AyCode.Services.Loggers;
using AyCode.Services.SignalRs;
using Azure.Core;
using MessagePack;
using MessagePack.Resolvers;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Extensions.DependencyInjection;
using TIAM.Entities.Transfers;
@ -17,10 +22,13 @@ namespace TIAMWebApp.Shared.Application.Services
public abstract class AcSignalRClientBase : IAcSignalRHubClient
{
private readonly ConcurrentDictionary<int, object?> _responseByRequestId = new();
protected readonly HubConnection HubConnection;
protected readonly LoggerClient Logger;
public event Action<int, byte[]?> OnMessageReceived;
public event Action<int, byte[], int?> OnMessageReceived;
public event Action<int, int> OnMessageRequested;
protected AcSignalRClientBase(string hubName, IEnumerable<IAcLogWriterClientBase> logWriters)
{
@ -31,9 +39,22 @@ namespace TIAMWebApp.Shared.Application.Services
//.AddMessagePackProtocol(options => options.SerializerOptions = MessagePackSerializerOptions.Standard.WithSecurity(MessagePackSecurity.UntrustedData))
.Build();
_ = HubConnection.On<string, int, byte[]?>("MessageReceived", MessageReceived);
HubConnection.Closed += HubConnection_Closed;
_ = HubConnection.On<int, byte[], int?>("OnReceiveMessage", OnReceiveMessage);
_ = HubConnection.On<int, int>(nameof(IAcSignalRHubClient.OnRequestMessage), OnRequestMessage);
HubConnection.StartAsync().Forget();
}
private Task HubConnection_Closed(Exception? arg)
{
if (_responseByRequestId.IsEmpty) Logger.DebugConditional($"Client HubConnection_Closed");
else Logger.Warning($"Client HubConnection_Closed; {nameof(_responseByRequestId)} count: {_responseByRequestId.Count}");
_responseByRequestId.Clear();
return Task.CompletedTask;
}
public async Task StartConnection()
@ -42,7 +63,7 @@ namespace TIAMWebApp.Shared.Application.Services
await HubConnection.StartAsync();
if (HubConnection.State != HubConnectionState.Connected)
await TaskHelper.WaitToAsync(() => HubConnection.State == HubConnectionState.Connected, 3000, 100);
await TaskHelper.WaitToAsync(() => HubConnection.State == HubConnectionState.Connected, 10000, 25);
}
public async Task StopConnection()
@ -51,29 +72,126 @@ namespace TIAMWebApp.Shared.Application.Services
await HubConnection.DisposeAsync();
}
public virtual async Task Send(string user, int messageTag, object? message)
public virtual async Task SendMessageToServerAsync(int messageTag, object message, int? requestId = null)
{
Logger.Info($"Send; {nameof(user)}: {user}; {nameof(messageTag)}: {messageTag}");
Logger.DebugConditional($"Client SendMessageToServerAsync; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};");
await StartConnection();
HubConnection.SendAsync("MessageReceived", "", messageTag, message).Forget();
HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, message, requestId).Forget();
}
public virtual Task MessageReceived(string user, int messageTag, byte[]? message)
public virtual void SendRequestToServerAsync(int messageTag)
=> SendRequestToServerAsync(messageTag, AcDomain.NextUniqueInt32).Forget();
public virtual async Task SendRequestToServerAsync(int messageTag, int requestId)
{
Logger.Info($"MessageReceived; {nameof(user)}: {user}; {nameof(messageTag)}: {messageTag}");
Logger.DebugConditional($"Client SendRequestToServerAsync; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};");
await StartConnection();
HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnRequestMessage), messageTag, requestId).Forget();
}
public virtual async Task<TResult?> SendRequestToServerAsync<TResult>(int messageTag)
{
var requestId = AcDomain.NextUniqueInt32;
Logger.DebugConditional($"Client SendRequestToServerAsync<TResult>; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};");
_responseByRequestId[requestId] = null;
await SendRequestToServerAsync(messageTag, requestId);
try
{
OnMessageReceived(messageTag, message);
if (await TaskHelper.WaitToAsync(() => _responseByRequestId[requestId] != null, 10000, 25) &&
_responseByRequestId.TryRemove(requestId, out var obj) && obj is byte[] messagePackBytes)
{
var json = messagePackBytes.MessagePackTo<string>(ContractlessStandardResolver.Options);
return json.JsonTo<TResult>() ?? default;
}
}
catch (Exception ex)
{
Logger.Error($"SendRequestToServerAsync; messageTag: {messageTag}; requestId: {requestId}; {ex.Message}", ex);
}
_responseByRequestId.TryRemove(requestId, out _);
return default;
}
public virtual Task SendRequestToServerAsync(int messageTag, Action<byte[]> responseCallback)
{
var requestId = AcDomain.NextUniqueInt32;
_responseByRequestId[requestId] = responseCallback;
return SendRequestToServerAsync(messageTag, requestId);
}
public virtual Task OnReceiveMessage(int messageTag, byte[] message, int? requestId)
{
var logText = $"Client OnReceiveMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};";
if (message.Length == 0) Logger.Warning($"message.Length == 0! {logText}");
else Logger.Info(logText);
try
{
if (requestId.HasValue && _responseByRequestId.ContainsKey(requestId.Value))
{
var reqId = requestId.Value;
switch (_responseByRequestId[reqId])
{
case null:
_responseByRequestId[reqId] = message;
return Task.CompletedTask;
case Action<byte[]> messagePackCallback:
_responseByRequestId.TryRemove(reqId, out _);
messagePackCallback.Invoke(message);
return Task.CompletedTask;
//case Action<string> jsonCallback:
// jsonCallback.Invoke(message.MessagePackTo<string>());
// return Task.CompletedTask;
default:
Logger.Error($"Client OnReceiveMessage switch; unknown message type: {_responseByRequestId[reqId]?.GetType().Name}");
break;
}
_responseByRequestId.TryRemove(reqId, out _);
}
OnMessageReceived(messageTag, message, requestId);
}
catch(Exception ex)
{
Logger.Error($"MessageReceived error; {ex.Message}", ex);
Logger.Error($"Client OnReceiveMessage; messageTag: {messageTag}; requestId: {requestId}; {ex.Message}", ex);
throw;
}
return Task.CompletedTask;
}
public virtual Task OnRequestMessage(int messageTag, int requestId)
{
Logger.DebugConditional($"Client OnRequestMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};");
try
{
OnMessageRequested(messageTag, requestId);
}
catch(Exception ex)
{
Logger.Error($"Client OnReceiveMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId}; {ex.Message}", ex);
throw;
}
return Task.CompletedTask;
}
}
}

View File

@ -44,7 +44,7 @@ namespace TIAMWebApp.Shared.Application.Services
}
//15.
public Task<bool> CreateServiceProviderAsync(TiamServiceProvider serviceProvider)
public Task<bool> CreateServiceProviderAsync(Company serviceProvider)
{
throw new NotImplementedException();
}
@ -91,13 +91,13 @@ namespace TIAMWebApp.Shared.Application.Services
}
//18.
public Task<TiamServiceProvider?> GetServiceProviderByIdAsync(Guid id)
public Task<Company?> GetServiceProviderByIdAsync(Guid id)
{
throw new NotImplementedException();
}
//16.
public Task<List<TiamServiceProvider>> GetServiceProvidersAsync()
public Task<List<Company>> GetServiceProvidersAsync()
{
throw new NotImplementedException();
}
@ -115,7 +115,7 @@ namespace TIAMWebApp.Shared.Application.Services
}
//14.
public Task<bool> UpdateServiceProviderAsync(TiamServiceProvider serviceProvider)
public Task<bool> UpdateServiceProviderAsync(Company serviceProvider)
{
throw new NotImplementedException();
}

View File

@ -22,10 +22,10 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="MessagePack" Version="2.5.140" />
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="8.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="8.0.5" />
<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,7 +4,6 @@ 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;