Implement UserProductMapping add/update/delete; improvements, fixes, etc...

This commit is contained in:
Loretta 2024-07-04 18:33:10 +02:00
parent 716fa33e90
commit 2ca48c4ae8
10 changed files with 143 additions and 72 deletions

View File

@ -268,7 +268,7 @@ namespace TIAM.Database.DataLayers.Admins
return isSucces ? userProductMapping : null;
}
public Task<bool> UpdateUserProductMappingAsync(UserProductMapping userProductMapping) => TransactionAsync(ctx => ctx.UpdateUserProductMapping(userProductMapping));
public Task<UserProductMapping?> UpdateUserProductMappingAsync(UserProductMapping userProductMapping) => UpdateSafeAsync(userProductMapping, (ctx, safeUserProductMapping) => ctx.UpdateUserProductMapping(safeUserProductMapping));
public async Task<UserProductMapping?> UpdateUserProductMappingAsync(Guid userProductMappingId, int permissions = 1, UserProductJsonDetailModel? userProductToCars = null)
{

View File

@ -100,5 +100,7 @@ public class SignalRTags : AcSignalRTags
public const int GetTransferDestinationToProductsByProductId = 95;
public const int GetTransferDestinationToProductsByTransferDestinationId = 96;
public const int GetAllLogItemsByFilterText = 100;
public const int GetAllUsers = 120;
public const int GetAllLogItemsByFilterText = 1000;
}

View File

@ -54,8 +54,7 @@
TextFieldName="@userEmailFieldNameComboItem"
Value="@_drivers.FirstOrDefault(x => x.Id == transferToDriverEditModel.UserProductMappingId)"
ValueChanged="v => transferToDriverEditModel.UserProductMappingId = v.Id"
SearchFilterCondition="ListSearchFilterCondition.Contains"
SearchMode="ListSearchMode.AutoSearch">
SearchFilterCondition="ListSearchFilterCondition.Contains" SearchMode="ListSearchMode.AutoSearch">
<Columns>
@* <DxListEditorColumn FieldName="Id"/> *@
<DxListEditorColumn FieldName="@userEmailFieldNameComboItem" Caption="Driver email" />
@ -147,15 +146,24 @@
_logger.Info($"DetailGridData: {ParentData.TransferToDrivers.Count}");
_cars.AddRange((await AdminSignalRClient.GetAllAsync<List<Car>>(SignalRTags.GetAllCarsByProductId, [TiamConstClient.TransferProductId]))!);
// AdminSignalRClient.GetAllAsync<List<Car>>(SignalRTags.GetAllCars, response =>
// {
// _cars.AddRange(response.ResponseData!);
// return Task.CompletedTask;
// }).Forget();
_cars.AddRange((await AdminSignalRClient.GetAllAsync<List<Car>>(SignalRTags.GetAllCarsByProductId, [TiamConstClient.TransferProductId])) ?? []);
_drivers.AddRange(_cars.DistinctBy(x => x.UserProductMappingId).Select(x => x.UserProductMapping));
// //AdminSignalRClient.GetAllIntoAsync<Car>(_cars, SignalRTags.GetAllCarsByProductId, [TiamConstClient.TransferProductId])
// AdminSignalRClient.GetAllAsync<List<Car>>(SignalRTags.GetAllCarsByProductId, response =>
// {
// if (response.Status != SignalResponseStatus.Success || response.ResponseData == null)
// {
// _logger.Error($"GetAllAsync<List<Car>>(); status: {response.Status}; dataCount: {response.ResponseData?.Count}");
// return Task.CompletedTask;
// }
// _cars.AddRange(response.ResponseData);
// _drivers.AddRange(_cars.DistinctBy(x => x.UserProductMappingId).Select(x => x.UserProductMapping));
// return Task.CompletedTask;
// }, [TiamConstClient.TransferProductId]).Forget();
await base.OnInitializedAsync();
}

View File

@ -12,6 +12,10 @@
@using AyCode.Core.Loggers
@using AyCode.Services.Loggers
@using AyCode.Core
@using AyCode.Core.Helpers
@using AyCode.Models.Users
@using AyCode.Services.SignalRs
@using TIAM.Core.Consts
@inject IServiceProviderDataService ServiceProviderDataService
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject AdminSignalRClient AdminSignalRClient
@ -24,27 +28,44 @@
PageSize="10"
ValidationEnabled="false"
CustomizeEditModel="CustomizeEditModel"
EditMode="GridEditMode.EditForm"
EditMode="GridEditMode.EditRow"
ColumnResizeMode="GridColumnResizeMode.NextColumn"
OnGridEditModelSaving="OnGridEditModelSaving"
DetailExpandButtonDisplayMode="DetailExpandButtonDisplayMode">
<Columns>
<DxGridCommandColumn Width="135" MinWidth="135" Visible="CommandColumnVisible" NewButtonVisible="NewButtonVisible" EditButtonVisible="EditButtonVisible" DeleteButtonVisible="DeleteButtonVisible" FixedPosition="GridColumnFixedPosition.Left" />
<DxGridCommandColumn Width="150" MinWidth="150" Visible="CommandColumnVisible" NewButtonVisible="NewButtonVisible" EditButtonVisible="EditButtonVisible" DeleteButtonVisible="DeleteButtonVisible" FixedPosition="GridColumnFixedPosition.Left" />
<DxGridDataColumn FieldName="Id" ShowInColumnChooser="AcDomain.IsDeveloperVersion" Visible="AcDomain.IsDeveloperVersion" DisplayFormat="N" />
<DxGridDataColumn FieldName="UserId" Caption="UserId" ShowInColumnChooser="AcDomain.IsDeveloperVersion" Visible="AcDomain.IsDeveloperVersion" DisplayFormat="N" />
@{
var userEmailFieldName = $"{nameof(UserProductMapping.User)}.{nameof(User.EmailAddress)}";
}
<DxGridDataColumn FieldName="@userEmailFieldName" Caption="User email" SortIndex="0" />
@* <DxGridDataColumn FieldName="@nameof(UserProductMapping.User.EmailAddress)" Caption="User name" /> *@
<DxGridDataColumn FieldName="ProductId" Caption="ServiceId" ShowInColumnChooser="AcDomain.IsDeveloperVersion" Visible="AcDomain.IsDeveloperVersion" DisplayFormat="N" />
@{
var productNameFieldName = $"{nameof(UserProductMapping.Product)}.{nameof(Product.Name)}";
}
<DxGridDataColumn FieldName="@productNameFieldName" Caption="Service name" />
<DxGridDataColumn FieldName="@productNameFieldName" Caption="Service name">
<CellEditTemplate>
@{
var userProductMappingEditModel = (UserProductMapping)context.EditModel;
}
<DxComboBox Data="@_products" TextFieldName="Name" ValueFieldName="Id" @bind-Value="userProductMappingEditModel.ProductId" ReadOnly="@(!_isNewState!.Value)"
SearchFilterCondition="ListSearchFilterCondition.Contains" SearchMode="ListSearchMode.AutoSearch">
</DxComboBox>
</CellEditTemplate>
</DxGridDataColumn>
<DxGridDataColumn FieldName="UserId" Caption="UserId" ShowInColumnChooser="AcDomain.IsDeveloperVersion" Visible="AcDomain.IsDeveloperVersion" DisplayFormat="N" />
@{
var userEmailFieldName = $"{nameof(UserProductMapping.User)}.{nameof(User.EmailAddress)}";
}
<DxGridDataColumn FieldName="@userEmailFieldName" Caption="User email" SortIndex="0">
<CellEditTemplate>
@{
var userProductMappingEditModel = (UserProductMapping)context.EditModel;
}
<DxComboBox Data="@_users" TextFieldName="EmailAddress" ValueFieldName="Id" @bind-Value="userProductMappingEditModel.UserId" ReadOnly="@(!_isNewState!.Value)"
SearchFilterCondition="ListSearchFilterCondition.Contains" SearchMode="ListSearchMode.AutoSearch">
</DxComboBox>
</CellEditTemplate>
</DxGridDataColumn>
@* <DxGridDataColumn FieldName="@nameof(UserProductMapping.Product.Name)" Caption="Service name" /> *@
@* <DxGridDataColumn FieldName="UserProductMapping.Product.Name" Caption="Service name" /> *@
@* <DxGridDataColumn FieldName="@nameof(Product.ServiceProvider.Name)" Caption="Company name" /> *@
<DxGridDataColumn FieldName="Permissions" />
<DxGridDataColumn FieldName="Created" DisplayFormat="g" Width="140" CaptionAlignment="GridTextAlignment.Center" TextAlignment="GridTextAlignment.Center" />
<DxGridDataColumn FieldName="Modified" DisplayFormat="g" Width="140" CaptionAlignment="GridTextAlignment.Center" TextAlignment="GridTextAlignment.Center" />
@ -59,24 +80,24 @@
}
</DetailRowTemplate>
<EditFormTemplate Context="userEditFormContext">
@{
var userProduct = (UserProductMapping)userEditFormContext.EditModel;
}
<DxFormLayout CssClass="w-100">
<DxFormLayoutItem Caption="User" ColSpanMd="4">
@userEditFormContext.GetEditor("UserId")
</DxFormLayoutItem>
<DxFormLayoutItem Caption="Product:" ColSpanMd="4">
<DxComboBox Data="@_availableProducts" TextFieldName="Name" @bind-Value="((UserProductMapping)userEditFormContext.EditModel).ProductId" />
</DxFormLayoutItem>
<DxFormLayoutItem Caption="Permissions" ColSpanMd="4">
@userEditFormContext.GetEditor("Permissions")
</DxFormLayoutItem>
@* <EditFormTemplate Context="userEditFormContext">
@{
var userProduct = (UserProductMapping)userEditFormContext.EditModel;
}
<DxFormLayout CssClass="w-100">
<DxFormLayoutItem Caption="User" ColSpanMd="4">
@userEditFormContext.GetEditor("UserId")
</DxFormLayoutItem>
<DxFormLayoutItem Caption="Product:" ColSpanMd="4">
<DxComboBox Data="@_availableProducts" TextFieldName="Name" @bind-Value="((UserProductMapping)userEditFormContext.EditModel).ProductId" />
</DxFormLayoutItem>
<DxFormLayoutItem Caption="Permissions" ColSpanMd="4">
@userEditFormContext.GetEditor("Permissions")
</DxFormLayoutItem>
</DxFormLayout>
</DxFormLayout>
</EditFormTemplate>
*@
</UserProductMappingGrid>
@code {
@ -92,22 +113,51 @@
[Parameter] public Guid[]? ContextIds { get; set; }
private bool? _isNewState = null;
private LoggerClient<UserProductMappingGridComponent> _logger;
List<Product> _availableProducts;
private List<User> _users = [];
private List<Product> _products = [];
private ProductDetailGridComponent bleh;
protected override void OnInitialized()
protected override async Task OnInitializedAsync()
{
_logger = new LoggerClient<UserProductMappingGridComponent>(LogWriters.ToArray());
base.OnInitialized();
//_products = (await AdminSignalRClient.GetAllAsync<List<Product>>(SignalRTags.GetAllProducts)) ?? [];
AdminSignalRClient.GetAllIntoAsync(_products, SignalRTags.GetAllProducts).Forget();
AdminSignalRClient.GetAllIntoAsync(_users, SignalRTags.GetAllUsers).Forget();
// AdminSignalRClient.GetAllAsync<List<Product>>(SignalRTags.GetAllProducts, response =>
// {
// if (response.Status != SignalResponseStatus.Success || response.ResponseData == null)
// {
// _logger.Error($"GetAllAsync<List<Car>>(); status: {response.Status}; dataCount: {response.ResponseData?.Count}");
// return Task.CompletedTask;
// }
// _products.AddRange(response.ResponseData);
// return Task.CompletedTask;
// }).Forget();
// AdminSignalRClient.GetAllAsync<List<User>>(SignalRTags.getal, response =>
// {
// if (response.Status != SignalResponseStatus.Success || response.ResponseData == null)
// {
// _logger.Error($"GetAllAsync<List<Car>>(); status: {response.Status}; dataCount: {response.ResponseData?.Count}");
// return Task.CompletedTask;
// }
// _products.AddRange(response.ResponseData);
// return Task.CompletedTask;
// }).Forget();
await base.OnInitializedAsync();
}
void CustomizeEditModel(GridCustomizeEditModelEventArgs e)
{
_isNewState = e.IsNew;
if (!e.IsNew) return;
// var newProductMapping = new UserProductMapping
@ -119,4 +169,10 @@
//e.EditModel = newProductMapping;
}
private void OnGridEditModelSaving(GridEditModelSavingEventArgs e)
{
_isNewState = false;
}
}

View File

@ -203,7 +203,7 @@ namespace TIAMWebApp.Server.Controllers
var result = await adminDal.UpdateUserProductMappingAsync(userProductMapping);
return result ? userProductMapping.ToJson() : string.Empty;
return result == null ? string.Empty : userProductMapping.ToJson();
}
[AllowAnonymous]

View File

@ -15,21 +15,23 @@ using TIAM.Entities.Addresses;
using TIAM.Services.Server.Logins;
using ILogger = TIAM.Core.Loggers.ILogger;
using AyCode.Core.Helpers;
using AyCode.Services.SignalRs;
using TIAM.Services;
namespace TIAMWebApp.Server.Controllers
{
[Authorize]
[ApiController]
[Route("api/v1/[controller]")]
public class UserAPIController : ControllerBase
public class UserAPIController(IConfiguration configuration, UserDal userDal, IEnumerable<IAcLogWriterBase> logWriters) : ControllerBase
{
private LoginService _loginService;
private UserDal _userDal;
private readonly IConfiguration _configuration;
private readonly TIAM.Core.Loggers.Logger<UserAPIController> _logger = new(logWriters.ToArray());
private LoginService _loginService = new LoginService(userDal, configuration);
//private readonly IWebHostEnvironment _webHostEnvironment;
//readonly PasswordHasher _hasher = new();
private readonly ILogger _logger;
//private readonly ILogger _logger;
/*private UserModel[] users = new UserModel[]
{
new UserModel(new Guid("540271f6-c604-4c16-8160-d5a7cafedf00"), "test@tiam.hu", "+36701234567", "Asdasd123456"),
@ -37,18 +39,6 @@ namespace TIAMWebApp.Server.Controllers
};*/
//private readonly ILogger<UserAPIController> _logger;
public UserAPIController(IConfiguration configuration, UserDal userDal, IEnumerable<IAcLogWriterBase> logWriters)
{
_configuration = configuration;
//_webHostEnvironment = webHostEnvironment;
_userDal = userDal;
_loginService = new LoginService(_userDal, _configuration);
_logger = new TIAM.Core.Loggers.Logger<UserAPIController>(logWriters.ToArray());
}
//[AllowAnonymous]
//[HttpPost]
//[Route(APIUrls.LoggerRouteName)]
@ -148,7 +138,7 @@ namespace TIAMWebApp.Server.Controllers
if (email != null)
{
//get user from db
dbUser = await _userDal.GetUserByEmailAsync(email.Value, true);
dbUser = await userDal.GetUserByEmailAsync(email.Value, true);
_logger.Info($@"DbUser email: {dbUser?.EmailAddress}");
}
@ -168,7 +158,7 @@ namespace TIAMWebApp.Server.Controllers
//mocking - update userModel with new refreshToken
dbUser.RefreshToken = refreshToken;
//TODO await _userManager.UpdateAsync(userModel);
await _userDal.UpdateJwtRefreshTokenAsync(dbUser.EmailAddress, dbUser.RefreshToken);
await userDal.UpdateJwtRefreshTokenAsync(dbUser.EmailAddress, dbUser.RefreshToken);
response.IsSuccess = true;
response.Content = new AuthenticationResponse
@ -271,7 +261,7 @@ namespace TIAMWebApp.Server.Controllers
_logger.Info($"User to be updated: {email}");
_logger.Info($"User to be updated: {phoneNumber}");
await _userDal.UpdateUserAsync(new User(userId, email, phoneNumber));
await userDal.UpdateUserAsync(new User(userId, email, phoneNumber));
}
}
@ -362,7 +352,7 @@ namespace TIAMWebApp.Server.Controllers
{
//var users = await _userDal.Ctx.Users.ToListAsync();//.GetUsersAsync();
//return users;
return _userDal.GetAllUserModelDtoAsync<UserModelDto>();
return userDal.GetAllUserModelDtoAsync<UserModelDto>();
}
[AllowAnonymous]
@ -373,7 +363,17 @@ namespace TIAMWebApp.Server.Controllers
_logger.Info("GetUsersWithDetails called");
//var users = await _userDal.Ctx.Users.ToListAsync();//.GetUsersAsync();
//return users;
return _userDal.GetAllUserModelDtoAsync<UserModelDtoDetail>();
return userDal.GetAllUserModelDtoAsync<UserModelDtoDetail>();
}
[NonAction]
[SignalR(SignalRTags.GetAllUsers)]
public async Task<List<User>> GetAllUsers()
{
_logger.Info("GetAllUsers called");
//var users = await _userDal.Ctx.Users.ToListAsync();//.GetUsersAsync();
//return users;
return await userDal.GetUsersAsync();
}
[AllowAnonymous]
@ -382,7 +382,7 @@ namespace TIAMWebApp.Server.Controllers
public async Task<UserModelDto>? GetUserByEmail(string email)
{
_logger.Info($"GetUserByEmail called with email: {email}");
var result = _userDal.GetUserModelDtoByEmailAsync<UserModelDto>(email, false);
var result = userDal.GetUserModelDtoByEmailAsync<UserModelDto>(email, false);
if (result.Result == null)
{
UserModelDto resultDto = new UserModelDto();
@ -401,7 +401,7 @@ namespace TIAMWebApp.Server.Controllers
public Task<UserModelDto?> GetUserById([FromBody] Guid id)
{
_logger.Info($"GetUserById called with id: {id}");
return _userDal.GetUserModelDtoByIdAsync<UserModelDto>(id, true);
return userDal.GetUserModelDtoByIdAsync<UserModelDto>(id, true);
}
[AllowAnonymous]
@ -410,7 +410,7 @@ namespace TIAMWebApp.Server.Controllers
public async Task<UserModelDtoDetail?> GetUserDetailById([FromBody] Guid id)
{
_logger.Info($"GetUserDetailById called with id: {id}");
var result = await _userDal.GetUserModelDtoByIdAsync<UserModelDtoDetail>(id, true);
var result = await userDal.GetUserModelDtoByIdAsync<UserModelDtoDetail>(id, true);
return result;
}
}

View File

@ -39,6 +39,7 @@ builder.Services.AddScoped<AdminDal>();
builder.Services.AddScoped<AuctionDal>();
builder.Services.AddScoped<TransferDestinationDal>();
builder.Services.AddSingleton<AuthService>();
builder.Services.AddScoped<UserAPIController>();
builder.Services.AddScoped<ServiceProviderAPIController>();
builder.Services.AddScoped<TransferDataAPIController>();
builder.Services.AddScoped<MessageAPIController>();

View File

@ -100,7 +100,7 @@ public class DevAdminSignalRHub : Hub<ISignalRHubItemServer>, IAcSignalRHubServe
//private readonly ServiceProviderAPIController _serviceProviderApiController;
//private readonly TransferDataAPIController _transferDataApiController;
public DevAdminSignalRHub(AdminDal adminDal, ServiceProviderAPIController serviceProviderApiController, TransferDataAPIController transferDataApiController, MessageAPIController messageApiController, ProfileAPIController profileApiController, LoggerApiController loggerApiController, IEnumerable<IAcLogWriterBase> logWriters)
public DevAdminSignalRHub(AdminDal adminDal, UserAPIController userApiController, ServiceProviderAPIController serviceProviderApiController, TransferDataAPIController transferDataApiController, MessageAPIController messageApiController, ProfileAPIController profileApiController, LoggerApiController loggerApiController, IEnumerable<IAcLogWriterBase> logWriters)
{
_adminDal = adminDal;
//_serviceProviderApiController = serviceProviderApiController;
@ -108,6 +108,7 @@ public class DevAdminSignalRHub : Hub<ISignalRHubItemServer>, IAcSignalRHubServe
_logger = new(logWriters.ToArray());
_dynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(userApiController));
_dynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(serviceProviderApiController));
_dynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(transferDataApiController));
_dynamicMethodCallModels.Add(new DynamicMethodCallModel<SignalRAttribute>(messageApiController));

View File

@ -4,6 +4,7 @@ using AyCode.Core;
using AyCode.Core.Extensions;
using AyCode.Core.Helpers;
using AyCode.Core.Interfaces;
using AyCode.Interfaces.Entities;
using AyCode.Services.Loggers;
using AyCode.Services.SignalRs;
using MessagePack.Resolvers;
@ -20,5 +21,6 @@ namespace TIAMWebApp.Shared.Application.Services
{
ConstHelper.NameByValue<SignalRTags>(0);
}
}
}

View File

@ -40,6 +40,7 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DD32C7C2-218C-4148-8FD6-1AB3C824A7D5}"
ProjectSection(SolutionItems) = preProject
DeployReadme.txt = DeployReadme.txt
C:\Users\Fullepi\Desktop\SqlDataCompare_DevRelese_to_Prod.dcmp = C:\Users\Fullepi\Desktop\SqlDataCompare_DevRelese_to_Prod.dcmp
SqlSchemaCompare_Dev_to_DevRelease.scmp = SqlSchemaCompare_Dev_to_DevRelease.scmp
EndProjectSection
EndProject