diff --git a/src/NetCorePal.D3Shop.Admin.Shared/Requests/AdminUserLoginRequest.cs b/src/NetCorePal.D3Shop.Admin.Shared/Requests/AdminUserLoginRequest.cs index 511e308..d0f553e 100644 --- a/src/NetCorePal.D3Shop.Admin.Shared/Requests/AdminUserLoginRequest.cs +++ b/src/NetCorePal.D3Shop.Admin.Shared/Requests/AdminUserLoginRequest.cs @@ -1,3 +1,12 @@ -namespace NetCorePal.D3Shop.Admin.Shared.Requests; +using System.ComponentModel.DataAnnotations; -public record AdminUserLoginRequest(string Name, string Password, bool IsPersistent); \ No newline at end of file +namespace NetCorePal.D3Shop.Admin.Shared.Requests; + +public class AdminUserLoginRequest +{ + [Required] public string Name { get; set; } = string.Empty; + + [Required] public string Password { get; set; } = string.Empty; + + public bool IsPersistent { get; set; } +} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/AdminUserAggregate/AdminUser.cs b/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/AdminUserAggregate/AdminUser.cs index 47d5f9f..7887420 100644 --- a/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/AdminUserAggregate/AdminUser.cs +++ b/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/AdminUserAggregate/AdminUser.cs @@ -1,5 +1,4 @@ -using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate.Dto; -using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.RoleAggregate; +using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.RoleAggregate; using NetCorePal.Extensions.Domain; using NetCorePal.Extensions.Primitives; @@ -25,20 +24,20 @@ protected AdminUser() public DateTime? DeletedAt { get; private set; } public AdminUser(string name, string phone, string password, - IEnumerable rolesToBeAssigned) + IEnumerable roles, IEnumerable permissions) { CreatedAt = DateTime.Now; Name = name; Phone = phone; Password = password; - foreach (var roleDto in rolesToBeAssigned) + foreach (var adminUserRole in roles) { - Roles.Add(new AdminUserRole(roleDto.RoleId, roleDto.RoleName)); - foreach (var rolePermission in roleDto.Permissions) - { - rolePermission.SourceRoleIds.Add(roleDto.RoleId); - Permissions.Add(rolePermission); - } + Roles.Add(adminUserRole); + } + + foreach (var adminUserPermission in permissions) + { + Permissions.Add(adminUserPermission); } } @@ -48,7 +47,8 @@ public void UpdateRoleInfo(RoleId roleId, string roleName) savedRole?.UpdateRoleInfo(roleName); } - public void UpdateRoles(IEnumerable rolesToBeAssigned) + public void UpdateRoles(IEnumerable rolesToBeAssigned, + IEnumerable permissions) { var currentRoleMap = Roles.ToDictionary(r => r.RoleId); var targetRoleMap = rolesToBeAssigned.ToDictionary(r => r.RoleId); @@ -64,45 +64,46 @@ public void UpdateRoles(IEnumerable rolesToBeAssigned) foreach (var roleId in roleIdsToAdd) { var targetRole = targetRoleMap[roleId]; - Roles.Add(new AdminUserRole(roleId, targetRole.RoleName)); - AddRolePermissions(roleId, targetRole.Permissions); + Roles.Add(targetRole); } + + AddPermissions(permissions); } public void UpdateRolePermissions(RoleId roleId, IEnumerable newPermissions) { RemoveRolePermissions(roleId); - AddRolePermissions(roleId, newPermissions); - } - - private void RemoveRolePermissions(RoleId roleId) - { - foreach (var permission in Permissions.Where(p => p.SourceRoleIds.Remove(roleId)).ToArray()) - { - if (permission.SourceRoleIds.Count == 0) - Permissions.Remove(permission); - } + AddPermissions(newPermissions); } - private void AddRolePermissions(RoleId roleId, IEnumerable permissions) + private void AddPermissions(IEnumerable permissions) { foreach (var permission in permissions) { - var existingPermission = Permissions.FirstOrDefault(p => p.PermissionCode == permission.PermissionCode); - - if (existingPermission is null) + var existedPermission = Permissions.SingleOrDefault(p => p.PermissionCode == permission.PermissionCode); + if (existedPermission is not null) { - var newPermission = new AdminUserPermission(permission.PermissionCode,permission.PermissionRemark); - newPermission.AddSourceRoleId(roleId); - Permissions.Add(newPermission); + foreach (var permissionSourceRoleId in permission.SourceRoleIds) + existedPermission.AddSourceRoleId(permissionSourceRoleId); } else { - existingPermission.AddSourceRoleId(roleId); + Permissions.Add(permission); } } } + private void RemoveRolePermissions(RoleId roleId) + { + foreach (var permission in Permissions.Where( + p => p.SourceRoleIds.Remove(roleId) && + p.SourceRoleIds.Count == 0) + .ToArray()) + { + Permissions.Remove(permission); + } + } + public void SetSpecificPermissions(IEnumerable permissionsToBeAssigned) { var currentSpecificPermissionMap = diff --git a/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/AdminUserAggregate/AdminUserPermssion.cs b/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/AdminUserAggregate/AdminUserPermssion.cs index 34c39f1..0966ad9 100644 --- a/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/AdminUserAggregate/AdminUserPermssion.cs +++ b/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/AdminUserAggregate/AdminUserPermssion.cs @@ -4,17 +4,23 @@ namespace NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate { public class AdminUserPermission { - protected AdminUserPermission() { } + protected AdminUserPermission() + { + } public AdminUserId AdminUserId { get; private set; } = default!; public string PermissionCode { get; private set; } = string.Empty; public string PermissionRemark { get; private set; } = string.Empty; - public List SourceRoleIds { get; private set; } = []; + public List SourceRoleIds { get; } = []; - public AdminUserPermission(string permissionCode, string permissionRemark) + public AdminUserPermission(string permissionCode, string permissionRemark, RoleId? sourceRoleId = null) { PermissionCode = permissionCode; PermissionRemark = permissionRemark; + if (sourceRoleId is not null) + { + SourceRoleIds.Add(sourceRoleId); + } } public void AddSourceRoleId(RoleId roleId) @@ -23,4 +29,4 @@ public void AddSourceRoleId(RoleId roleId) SourceRoleIds.Add(roleId); } } -} +} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/RoleAggregate/Role.cs b/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/RoleAggregate/Role.cs index 898c4f4..62e3dbf 100644 --- a/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/RoleAggregate/Role.cs +++ b/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/RoleAggregate/Role.cs @@ -8,7 +8,10 @@ public partial record RoleId : IInt64StronglyTypedId; public class Role : Entity, IAggregateRoot { - protected Role() { } + protected Role() + { + } + public string Name { get; private set; } = string.Empty; public string Description { get; private set; } = string.Empty; public DateTime CreatedAt { get; init; } @@ -48,6 +51,5 @@ public void UpdateRolePermissions(IEnumerable newPermissions) AddDomainEvent(new RolePermissionChangedDomainEvent(this)); } - } -} +} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Account/Login.razor b/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Account/Login.razor deleted file mode 100644 index 1dde331..0000000 --- a/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Account/Login.razor +++ /dev/null @@ -1,67 +0,0 @@ -@namespace NetCorePal.D3Shop.Web.Admin.Client.Pages.Account -@layout UserLayout -@page "/admin/login" - -
- -
\ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Account/Login.razor.cs b/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Account/Login.razor.cs deleted file mode 100644 index d3ef194..0000000 --- a/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Account/Login.razor.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using Microsoft.AspNetCore.Components; -using NetCorePal.D3Shop.Admin.Shared.Requests; -using NetCorePal.D3Shop.Web.Admin.Client.Services; - -namespace NetCorePal.D3Shop.Web.Admin.Client.Pages.Account -{ - public partial class Login - { - private readonly LoginParamsType _model = new(); - - [Inject] public NavigationManager NavigationManager { get; set; } = default!; - - [Inject] public IAccountService AccountService { get; set; } = default!; - - [Inject] public MessageService Message { get; set; } = default!; - - public async Task HandleSubmit() - { - var request = new AdminUserLoginRequest(_model.Name, _model.Password, _model.AutoLogin); - var response = await AccountService.LoginAsync(request); - if (response.Success) - NavigationManager.NavigateTo("/admin", forceLoad: true); - else - await Message.Error(response.Message); - } - - public async Task GetCaptcha() - { - await Message.Success($"Verification code validated successfully! The verification code is: "); - } - } - - public class LoginParamsType - { - [Required] public string Name { get; set; } = string.Empty; - - [Required] public string Password { get; set; } = string.Empty; - - public string? Mobile { get; set; } - - public string? Captcha { get; set; } - - public string? LoginType { get; set; } - - public bool AutoLogin { get; set; } - } -} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Roles.Razor.cs b/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Roles.Razor.cs index 82ec4db..a261178 100644 --- a/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Roles.Razor.cs +++ b/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Roles.Razor.cs @@ -2,37 +2,24 @@ namespace NetCorePal.D3Shop.Web.Admin.Client.Pages; -public sealed partial class Roles : IDisposable +public sealed partial class Roles { [Inject] private IRolesService RolesService { get; set; } = default!; [Inject] private MessageService Message { get; set; } = default!; [Inject] private ConfirmService ConfirmService { get; set; } = default!; - [Inject] private PersistentComponentState ApplicationState { get; set; } = default!; - private PersistingComponentStateSubscription _persistingSubscription; - - private PagedData _pagedRoles = default!; + private PagedData _pagedRoles = new(default!, default, default, default); private ITable _table = default!; - protected override async Task OnInitializedAsync() - { - const string persistKey = "roles"; - _persistingSubscription = ApplicationState.RegisterOnPersisting(() => - { - ApplicationState.PersistAsJson(persistKey, _pagedRoles); - return Task.CompletedTask; - }); + private readonly RoleQueryRequest _roleQueryRequest = new() { CountTotal = true }; - if (ApplicationState.TryTakeFromJson>(persistKey, out var restored)) - _pagedRoles = restored!; - else - await GetPagedRoles(); + protected override void OnAfterRender(bool firstRender) + { + if (!firstRender) return; + _table.ReloadData(1, 10); } - private readonly RoleQueryRequest _roleQueryRequest = - new() { PageIndex = 1, PageSize = 10, CountTotal = true }; - private async Task GetPagedRoles() { var response = await RolesService.GetAllRoles(_roleQueryRequest); @@ -85,9 +72,4 @@ private async Task Table_OnChange(QueryModel obj) { await GetPagedRoles(); } - - public void Dispose() - { - _persistingSubscription.Dispose(); - } } \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Users.razor b/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Users.razor index eccaf72..f91536a 100644 --- a/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Users.razor +++ b/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Users.razor @@ -6,6 +6,7 @@ 用户列表 - + diff --git a/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Users.razor.cs b/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Users.razor.cs index 6030e01..7ee80a6 100644 --- a/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Users.razor.cs +++ b/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Users.razor.cs @@ -2,43 +2,32 @@ namespace NetCorePal.D3Shop.Web.Admin.Client.Pages; -public sealed partial class Users : IDisposable +public sealed partial class Users { [Inject] private IAdminUserService AdminUserService { get; set; } = default!; [Inject] private MessageService Message { get; set; } = default!; [Inject] private ConfirmService ConfirmService { get; set; } = default!; - [Inject] private PersistentComponentState ApplicationState { get; set; } = default!; - private PersistingComponentStateSubscription _persistingSubscription; + private PagedData _pagedAdminUsers = new(default!, default, default, default); - private PagedData _pagedAdminUsers = default!; + private Table _table = default!; - protected override async Task OnInitializedAsync() - { - const string persistKey = "adminUsers"; - _persistingSubscription = ApplicationState.RegisterOnPersisting(() => - { - ApplicationState.PersistAsJson(persistKey, _pagedAdminUsers); - return Task.CompletedTask; - }); + private readonly AdminUserQueryRequest _adminUserQueryRequest = new() { CountTotal = true }; - if (ApplicationState.TryTakeFromJson>(persistKey, out var restored)) - _pagedAdminUsers = restored!; - else - await GetPagedAdminUsers(); + protected override void OnAfterRender(bool firstRender) + { + if (!firstRender) return; + _table.ReloadData(1, 10); } - private readonly AdminUserQueryRequest _adminUserQueryRequest = - new() { PageIndex = 1, PageSize = 10, CountTotal = true }; - private async Task GetPagedAdminUsers() { var response = await AdminUserService.GetAllAdminUsers(_adminUserQueryRequest); if (response.Success) { _pagedAdminUsers = response.Data; - _adminUserQueryRequest.PageIndex = _pagedAdminUsers.PageIndex; - _adminUserQueryRequest.PageSize = _pagedAdminUsers.PageSize; + _adminUserQueryRequest.PageIndex = response.Data.PageIndex; + _adminUserQueryRequest.PageSize = response.Data.PageSize; } else _ = Message.Error(response.Message); } @@ -69,8 +58,6 @@ private async Task Confirm(string message) return await ConfirmService.Show(message, "警告", ConfirmButtons.YesNo, ConfirmIcon.Warning) == ConfirmResult.Yes; } - private string _searchString = default!; - private async Task OnSearch() { await GetPagedAdminUsers(); @@ -80,9 +67,4 @@ private async Task Table_OnChange(QueryModel obj) { await GetPagedAdminUsers(); } - - public void Dispose() - { - _persistingSubscription.Dispose(); - } } \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web.Admin.Client/services/IAccountService.cs b/src/NetCorePal.D3Shop.Web.Admin.Client/services/IAccountService.cs deleted file mode 100644 index 6be503e..0000000 --- a/src/NetCorePal.D3Shop.Web.Admin.Client/services/IAccountService.cs +++ /dev/null @@ -1,10 +0,0 @@ -using NetCorePal.D3Shop.Web.Admin.Client.Attributes; - -namespace NetCorePal.D3Shop.Web.Admin.Client.Services; - -[RefitService] -public interface IAccountService -{ - [Post("/api/AdminUserAccount/login")] - Task LoginAsync([Body] AdminUserLoginRequest request); -} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/CreateAdminUserCommand.cs b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/CreateAdminUserCommand.cs index 64113ea..180d2ec 100644 --- a/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/CreateAdminUserCommand.cs +++ b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/CreateAdminUserCommand.cs @@ -1,7 +1,7 @@ using FluentValidation; using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate; -using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate.Dto; using NetCorePal.D3Shop.Infrastructure.Repositories.Identity; +using NetCorePal.D3Shop.Web.Application.Commands.Identity.Dto; using NetCorePal.D3Shop.Web.Application.Queries.Identity; using NetCorePal.Extensions.Primitives; @@ -31,7 +31,22 @@ public class CreateAdminUserCommandHandler(IAdminUserRepository adminUserReposit { public async Task Handle(CreateAdminUserCommand request, CancellationToken cancellationToken) { - var adminUser = new AdminUser(request.Name, request.Phone, request.Password, request.RolesToBeAssigned); + List adminUserRoles = []; + List adminUserPermissions = []; + + foreach (var (roleId, roleName, permissions) in request.RolesToBeAssigned) + { + adminUserRoles.Add(new AdminUserRole(roleId, roleName)); + + adminUserPermissions.AddRange( + permissions.Select(permission => + new AdminUserPermission(permission.PermissionCode, permission.PermissionRemark, roleId)) + ); + } + + var adminUser = new AdminUser(request.Name, request.Phone, request.Password, + adminUserRoles, adminUserPermissions); + await adminUserRepository.AddAsync(adminUser, cancellationToken); return adminUser.Id; } diff --git a/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/Dto/AdminUserPermissionDto.cs b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/Dto/AdminUserPermissionDto.cs new file mode 100644 index 0000000..5784cb7 --- /dev/null +++ b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/Dto/AdminUserPermissionDto.cs @@ -0,0 +1,7 @@ +namespace NetCorePal.D3Shop.Web.Application.Commands.Identity.Dto; + +public readonly struct AdminUserPermissionDto(string permissionCode, string permissionRemark) +{ + public string PermissionCode { get; } = permissionCode; + public string PermissionRemark { get; } = permissionRemark; +} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/AdminUserAggregate/Dto/AssignAdminUserRoleDto.cs b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/Dto/AssignAdminUserRoleDto.cs similarity index 50% rename from src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/AdminUserAggregate/Dto/AssignAdminUserRoleDto.cs rename to src/NetCorePal.D3Shop.Web/Application/Commands/Identity/Dto/AssignAdminUserRoleDto.cs index 27e0510..0758013 100644 --- a/src/NetCorePal.D3Shop.Domain/AggregatesModel/Identity/AdminUserAggregate/Dto/AssignAdminUserRoleDto.cs +++ b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/Dto/AssignAdminUserRoleDto.cs @@ -1,6 +1,6 @@ using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.RoleAggregate; -namespace NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate.Dto +namespace NetCorePal.D3Shop.Web.Application.Commands.Identity.Dto { - public record AssignAdminUserRoleDto(RoleId RoleId, string RoleName, IEnumerable Permissions); + public record AssignAdminUserRoleDto(RoleId RoleId, string RoleName, IEnumerable Permissions); } diff --git a/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/SetAdminUserSpecificPermissions.cs b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/SetAdminUserSpecificPermissions.cs index c43002a..19c5600 100644 --- a/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/SetAdminUserSpecificPermissions.cs +++ b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/SetAdminUserSpecificPermissions.cs @@ -1,10 +1,12 @@ using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate; using NetCorePal.D3Shop.Infrastructure.Repositories.Identity; +using NetCorePal.D3Shop.Web.Application.Commands.Identity.Dto; using NetCorePal.Extensions.Primitives; namespace NetCorePal.D3Shop.Web.Application.Commands.Identity; -public record SetAdminUserSpecificPermissions(AdminUserId Id, IEnumerable Permissions) : ICommand; +public record SetAdminUserSpecificPermissions(AdminUserId Id, IEnumerable Permissions) + : ICommand; public class SetAdminUserSpecificPermissionsCommandHandler(IAdminUserRepository adminUserRepository) : ICommandHandler @@ -14,6 +16,9 @@ public async Task Handle(SetAdminUserSpecificPermissions request, CancellationTo var adminUser = await adminUserRepository.GetAsync(request.Id, cancellationToken) ?? throw new KnownException($"用户不存在,AdminUserId={request.Id}"); - adminUser.SetSpecificPermissions(request.Permissions); + var permissions = request.Permissions + .Select(p => new AdminUserPermission(p.PermissionCode, p.PermissionRemark)); + + adminUser.SetSpecificPermissions(permissions); } } \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/UpdateAdminUserRolePermissionsCommand.cs b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/UpdateAdminUserRolePermissionsCommand.cs index fd319f4..a77ac48 100644 --- a/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/UpdateAdminUserRolePermissionsCommand.cs +++ b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/UpdateAdminUserRolePermissionsCommand.cs @@ -1,11 +1,15 @@ using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate; using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.RoleAggregate; using NetCorePal.D3Shop.Infrastructure.Repositories.Identity; +using NetCorePal.D3Shop.Web.Application.Commands.Identity.Dto; using NetCorePal.Extensions.Primitives; namespace NetCorePal.D3Shop.Web.Application.Commands.Identity; -public record UpdateAdminUserRolePermissionsCommand(AdminUserId AdminUserId, RoleId RoleId, IEnumerable Permissions) : ICommand; +public record UpdateAdminUserRolePermissionsCommand( + AdminUserId AdminUserId, + RoleId RoleId, + IEnumerable Permissions) : ICommand; public class UpdateAdminUserRolePermissionsCommandHandler(IAdminUserRepository adminUserRepository) : ICommandHandler @@ -15,6 +19,9 @@ public async Task Handle(UpdateAdminUserRolePermissionsCommand request, Cancella var adminUser = await adminUserRepository.GetAsync(request.AdminUserId, cancellationToken) ?? throw new KnownException($"用户不存在,AdminUserId={request.AdminUserId}"); - adminUser.UpdateRolePermissions(request.RoleId, request.Permissions); + var permissions = request.Permissions.Select(p => + new AdminUserPermission(p.PermissionCode, p.PermissionRemark, request.RoleId)); + + adminUser.UpdateRolePermissions(request.RoleId, permissions); } } \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/UpdateAdminUserRolesCommand.cs b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/UpdateAdminUserRolesCommand.cs index e57bae0..9d0259c 100644 --- a/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/UpdateAdminUserRolesCommand.cs +++ b/src/NetCorePal.D3Shop.Web/Application/Commands/Identity/UpdateAdminUserRolesCommand.cs @@ -1,12 +1,13 @@ using FluentValidation; using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate; -using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate.Dto; using NetCorePal.D3Shop.Infrastructure.Repositories.Identity; +using NetCorePal.D3Shop.Web.Application.Commands.Identity.Dto; using NetCorePal.Extensions.Primitives; namespace NetCorePal.D3Shop.Web.Application.Commands.Identity; -public record UpdateAdminUserRolesCommand(AdminUserId AdminUserId, List RolesToBeAssigned) : ICommand; +public record UpdateAdminUserRolesCommand(AdminUserId AdminUserId, List RolesToBeAssigned) + : ICommand; public class UpdateAdminUserRolesCommandValidator : AbstractValidator { @@ -17,14 +18,25 @@ public UpdateAdminUserRolesCommandValidator() } } -public class UpdateAdminUserRolesCommandHandler(IAdminUserRepository adminUserRepository) : ICommandHandler +public class UpdateAdminUserRolesCommandHandler(IAdminUserRepository adminUserRepository) + : ICommandHandler { public async Task Handle(UpdateAdminUserRolesCommand request, CancellationToken cancellationToken) { var adminUser = await adminUserRepository.GetAsync(request.AdminUserId, cancellationToken) ?? throw new KnownException($"未找到用户,AdminUserId = {request.AdminUserId}"); - adminUser.UpdateRoles(request.RolesToBeAssigned); - } + List roles = []; + List permissions = []; + + foreach (var assignAdminUserRoleDto in request.RolesToBeAssigned) + { + roles.Add(new AdminUserRole(assignAdminUserRoleDto.RoleId, assignAdminUserRoleDto.RoleName)); + permissions.AddRange(assignAdminUserRoleDto.Permissions.Select(permission => + new AdminUserPermission(permission.PermissionCode, permission.PermissionRemark, + assignAdminUserRoleDto.RoleId))); + } + adminUser.UpdateRoles(roles, permissions); + } } \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/Application/DomainEventHandlers/Identity/RolePermissionsChangedDomainEventHandler.cs b/src/NetCorePal.D3Shop.Web/Application/DomainEventHandlers/Identity/RolePermissionsChangedDomainEventHandler.cs index 57aedef..55cb41b 100644 --- a/src/NetCorePal.D3Shop.Web/Application/DomainEventHandlers/Identity/RolePermissionsChangedDomainEventHandler.cs +++ b/src/NetCorePal.D3Shop.Web/Application/DomainEventHandlers/Identity/RolePermissionsChangedDomainEventHandler.cs @@ -1,8 +1,8 @@ using MediatR; using Microsoft.Extensions.Caching.Memory; -using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate; using NetCorePal.D3Shop.Domain.DomainEvents.Identity; using NetCorePal.D3Shop.Web.Application.Commands.Identity; +using NetCorePal.D3Shop.Web.Application.Commands.Identity.Dto; using NetCorePal.D3Shop.Web.Application.Queries.Identity; using NetCorePal.D3Shop.Web.Const; using NetCorePal.Extensions.Domain; @@ -19,7 +19,7 @@ public async Task Handle(RolePermissionChangedDomainEvent notification, Cancella var roleId = notification.Role.Id; var adminUserIds = await adminUserQuery.GetAdminUserIdsByRoleIdAsync(roleId, cancellationToken); var permissions = notification.Role.Permissions - .Select(p => new AdminUserPermission(p.PermissionCode, p.PermissionRemark)) + .Select(p => new AdminUserPermissionDto(p.PermissionCode, p.PermissionRemark)) .ToArray(); foreach (var adminUserId in adminUserIds) diff --git a/src/NetCorePal.D3Shop.Web/Application/Queries/Identity/RoleQuery.cs b/src/NetCorePal.D3Shop.Web/Application/Queries/Identity/RoleQuery.cs index dff44e3..d27fd44 100644 --- a/src/NetCorePal.D3Shop.Web/Application/Queries/Identity/RoleQuery.cs +++ b/src/NetCorePal.D3Shop.Web/Application/Queries/Identity/RoleQuery.cs @@ -1,9 +1,8 @@ using Microsoft.EntityFrameworkCore; using NetCorePal.D3Shop.Admin.Shared.Requests; using NetCorePal.D3Shop.Admin.Shared.Responses; -using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate; -using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate.Dto; using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.RoleAggregate; +using NetCorePal.D3Shop.Web.Application.Commands.Identity.Dto; using NetCorePal.D3Shop.Web.Extensions; using NetCorePal.Extensions.Dto; using NetCorePal.Extensions.Primitives; @@ -40,7 +39,7 @@ public async Task> GetAdminRolesForAssignmentAsync( r.Id, r.Name, r.Permissions.Select(rp => - new AdminUserPermission(rp.PermissionCode, rp.PermissionRemark))) + new AdminUserPermissionDto(rp.PermissionCode, rp.PermissionRemark))) ) .ToListAsync(cancellationToken: cancellationToken); } diff --git a/src/NetCorePal.D3Shop.Web/Blazor/BlazorServiceExtensions.cs b/src/NetCorePal.D3Shop.Web/Blazor/BlazorServiceExtensions.cs index 0007eae..7c5d718 100644 --- a/src/NetCorePal.D3Shop.Web/Blazor/BlazorServiceExtensions.cs +++ b/src/NetCorePal.D3Shop.Web/Blazor/BlazorServiceExtensions.cs @@ -1,5 +1,5 @@ using NetCorePal.D3Shop.Web.Admin.Client.Services; -using NetCorePal.D3Shop.Web.Blazor.Services; +using NetCorePal.D3Shop.Web.Controllers.Identity; namespace NetCorePal.D3Shop.Web.Blazor; @@ -7,7 +7,7 @@ public static class BlazorServiceExtensions { public static void AddClientServices(this IServiceCollection services) { - services.AddScoped(); - services.AddScoped(); + services.AddScoped(); + services.AddScoped(); } } \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/Blazor/Components/Account/Login.razor b/src/NetCorePal.D3Shop.Web/Blazor/Components/Account/Login.razor new file mode 100644 index 0000000..2609d81 --- /dev/null +++ b/src/NetCorePal.D3Shop.Web/Blazor/Components/Account/Login.razor @@ -0,0 +1,34 @@ +@using NetCorePal.D3Shop.Web.Admin.Client.Layouts +@layout UserLayout +@page "/admin/login" + +
+ +
\ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/Blazor/Components/Account/Login.razor.cs b/src/NetCorePal.D3Shop.Web/Blazor/Components/Account/Login.razor.cs new file mode 100644 index 0000000..c35fb88 --- /dev/null +++ b/src/NetCorePal.D3Shop.Web/Blazor/Components/Account/Login.razor.cs @@ -0,0 +1,69 @@ +using System.Security.Claims; +using AntDesign; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Options; +using NetCorePal.D3Shop.Admin.Shared.Requests; +using NetCorePal.D3Shop.Web.Application.Queries.Identity; +using NetCorePal.D3Shop.Web.Application.Queries.Identity.QueryResult; +using NetCorePal.D3Shop.Web.Helper; + +namespace NetCorePal.D3Shop.Web.Blazor.Components.Account; + +public partial class Login +{ + [SupplyParameterFromForm(FormName = "loginForm")] + // ReSharper disable once AutoPropertyCanBeMadeGetOnly.Local + private AdminUserLoginRequest LoginModel { get; set; } = new(); + + [CascadingParameter] private HttpContext HttpContext { get; set; } = default!; + [Inject] private NavigationManager NavigationManager { get; set; } = default!; + [Inject] private AdminUserQuery AdminUserQuery { get; set; } = default!; + [Inject] private IOptions AppConfiguration { get; set; } = default!; + [Inject] private MessageService Message { get; set; } = default!; + + public async Task HandleSubmit() + { + var user = await AdminUserQuery.GetUserInfoForLoginAsync(LoginModel.Name, CancellationToken.None); + if (user is null) + { + _ = Message.Error("Invalid Credentials."); + return; + } + + if (!PasswordHasher.VerifyHashedPassword(LoginModel.Password, user.Password)) + { + _ = Message.Error("Invalid Credentials."); + return; + } + + var claims = GetClaimsAsync(user); + var claimsIdentity = new ClaimsIdentity( + claims, CookieAuthenticationDefaults.AuthenticationScheme); + var authProperties = new AuthenticationProperties + { + AllowRefresh = true, + ExpiresUtc = DateTime.UtcNow.AddMinutes(AppConfiguration.Value.TokenExpiryInMinutes), + IsPersistent = LoginModel.IsPersistent + }; + await HttpContext.SignInAsync( + CookieAuthenticationDefaults.AuthenticationScheme, + new ClaimsPrincipal(claimsIdentity), + authProperties); + + NavigationManager.NavigateTo("/admin", forceLoad: true); + } + + private static List GetClaimsAsync(AuthenticationUserInfo user) + { + var claims = new List + { + new(ClaimTypes.NameIdentifier, user.Id.ToString()), + new(ClaimTypes.Name, user.Name), + new(ClaimTypes.MobilePhone, user.Phone) + }; + + return claims; + } +} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Account/Login.razor.css b/src/NetCorePal.D3Shop.Web/Blazor/Components/Account/Login.razor.css similarity index 100% rename from src/NetCorePal.D3Shop.Web.Admin.Client/Pages/Account/Login.razor.css rename to src/NetCorePal.D3Shop.Web/Blazor/Components/Account/Login.razor.css diff --git a/src/NetCorePal.D3Shop.Web/Blazor/Components/App.razor b/src/NetCorePal.D3Shop.Web/Blazor/Components/App.razor index 92db2c7..15afe59 100644 --- a/src/NetCorePal.D3Shop.Web/Blazor/Components/App.razor +++ b/src/NetCorePal.D3Shop.Web/Blazor/Components/App.razor @@ -29,6 +29,6 @@ private HttpContext HttpContext { get; set; } = default!; private IComponentRenderMode? RenderModeForPage => HttpContext.Request.Path.StartsWithSegments("/admin/login") - ? new InteractiveWebAssemblyRenderMode(prerender:false) + ? null : InteractiveAuto; } \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/Blazor/KnownExceptionHandlerAttribute.cs b/src/NetCorePal.D3Shop.Web/Blazor/KnownExceptionHandlerAttribute.cs new file mode 100644 index 0000000..5c3dea9 --- /dev/null +++ b/src/NetCorePal.D3Shop.Web/Blazor/KnownExceptionHandlerAttribute.cs @@ -0,0 +1,66 @@ +using Microsoft.AspNetCore.Mvc; +using NetCorePal.Extensions.Dto; +using NetCorePal.Extensions.Primitives; +using Rougamo; +using Rougamo.Context; + +namespace NetCorePal.D3Shop.Web.Blazor; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] +public class KnownExceptionHandlerAttribute : MoAttribute +{ + public override void OnException(MethodContext context) + { + // 通过Http调用时不处理 + if (context.Target is not ControllerBase { HttpContext: null }) return; + + // 检查异常是否是 IKnownException 类型 + if (context.Exception is not IKnownException ex) return; + + // 获取方法的返回类型 + var returnType = context.ReturnType; + if (returnType is null) return; + + // 处理非泛型 ResponseData 和 Task + if (returnType == typeof(ResponseData) || returnType == typeof(Task)) + { + context.HandledException(this, new ResponseData( + success: false, + message: ex.Message, + code: ex.ErrorCode, + errorData: ex.ErrorData + )); + return; + } + + switch (returnType.IsGenericType) + { + // 处理泛型 ResponseData + case true when returnType.GetGenericTypeDefinition() == typeof(ResponseData<>): + { + var genericArgument = returnType.GetGenericArguments()[0]; + var responseInstance = Activator.CreateInstance(returnType, + Activator.CreateInstance(genericArgument), + false, ex.Message, ex.ErrorCode, ex.ErrorData); + + context.HandledException(this, responseInstance!); + return; + } + // 处理泛型 Task> + case true when returnType.GetGenericTypeDefinition() == typeof(Task<>): + { + var taskArgument = returnType.GetGenericArguments()[0]; + + if (taskArgument.IsGenericType && taskArgument.GetGenericTypeDefinition() == typeof(ResponseData<>)) + { + var responseInstance = Activator.CreateInstance(taskArgument, + default, false, ex.Message, ex.ErrorCode, ex.ErrorData); + + context.HandledException(this, responseInstance!); + } + + break; + } + } + } +} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/Blazor/ServiceExceptionHandlerAttribute.cs b/src/NetCorePal.D3Shop.Web/Blazor/ServiceExceptionHandlerAttribute.cs deleted file mode 100644 index 83972fb..0000000 --- a/src/NetCorePal.D3Shop.Web/Blazor/ServiceExceptionHandlerAttribute.cs +++ /dev/null @@ -1,29 +0,0 @@ -using AntDesign; -using NetCorePal.Extensions.Dto; -using NetCorePal.Extensions.Primitives; -using Rougamo; -using Rougamo.Context; - -namespace NetCorePal.D3Shop.Web.Blazor; - -[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] -public class ServiceExceptionHandlerAttribute : MoAttribute -{ - private readonly KnownExceptionHandleMiddlewareOptions _options = new(); - - public override void OnException(MethodContext context) - { - if (context.Exception is IKnownException ex) - { - context.HandledException(this, new ResponseData(success: false, message: ex.Message, code: ex.ErrorCode, - errorData: ex.ErrorData)); - } - else - { - var logger = context.GetRequiredService>(); - logger.LogError(context.Exception, message: "{Message}", _options.UnknownExceptionMessage); - var messageService = context.GetRequiredService(); - _ = messageService.Error("服务器内部异常!"); - } - } -} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/Blazor/Services/AdminUserService.cs b/src/NetCorePal.D3Shop.Web/Blazor/Services/AdminUserService.cs deleted file mode 100644 index 9a7c584..0000000 --- a/src/NetCorePal.D3Shop.Web/Blazor/Services/AdminUserService.cs +++ /dev/null @@ -1,53 +0,0 @@ -using NetCorePal.D3Shop.Admin.Shared.Requests; -using NetCorePal.D3Shop.Admin.Shared.Responses; -using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate; -using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.RoleAggregate; -using NetCorePal.D3Shop.Web.Admin.Client.Services; -using NetCorePal.D3Shop.Web.Controllers.Identity; -using NetCorePal.Extensions.Dto; - -namespace NetCorePal.D3Shop.Web.Blazor.Services; - -[ServiceExceptionHandler] -public class AdminUserService(AdminUserController adminUserController) : IAdminUserService -{ - public Task> CreateAdminUser(CreateAdminUserRequest request) - { - return adminUserController.CreateAdminUser(request); - } - - public Task>> GetAllAdminUsers(AdminUserQueryRequest request) - { - return adminUserController.GetAllAdminUsers(request); - } - - public Task>> GetAdminUserRoles(AdminUserId id) - { - return adminUserController.GetAdminUserRoles(id); - } - - public Task UpdateAdminUserRoles(AdminUserId id, IEnumerable roleIds) - { - return adminUserController.UpdateAdminUserRoles(id, roleIds); - } - - public Task DeleteAdminUser(AdminUserId id) - { - return adminUserController.DeleteAdminUser(id); - } - - public Task>> GetAllRolesForCreateUser() - { - return adminUserController.GetAllRolesForCreateUser(); - } - - public Task>> GetAdminUserPermissions(AdminUserId id) - { - return adminUserController.GetAdminUserPermissions(id); - } - - public Task SetAdminUserSpecificPermissions(AdminUserId id, IEnumerable permissionCodes) - { - return adminUserController.SetAdminUserSpecificPermissions(id, permissionCodes); - } -} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/Blazor/Services/RolesService.cs b/src/NetCorePal.D3Shop.Web/Blazor/Services/RolesService.cs deleted file mode 100644 index bfe8547..0000000 --- a/src/NetCorePal.D3Shop.Web/Blazor/Services/RolesService.cs +++ /dev/null @@ -1,47 +0,0 @@ -using NetCorePal.D3Shop.Admin.Shared.Requests; -using NetCorePal.D3Shop.Admin.Shared.Responses; -using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.RoleAggregate; -using NetCorePal.D3Shop.Web.Admin.Client.Services; -using NetCorePal.D3Shop.Web.Controllers.Identity; -using NetCorePal.Extensions.Dto; - -namespace NetCorePal.D3Shop.Web.Blazor.Services; - -[ServiceExceptionHandler] -public class RolesService(RoleController roleController) : IRolesService -{ - public Task> CreateRole(CreateRoleRequest request) - { - return roleController.CreateRole(request); - } - - public Task>> GetAllRoles(RoleQueryRequest request) - { - return roleController.GetAllRoles(request); - } - - public Task UpdateRoleInfo(RoleId id, UpdateRoleInfoRequest request) - { - return roleController.UpdateRoleInfo(id, request); - } - - public Task UpdateRolePermissions(RoleId id, List permissionCodes) - { - return roleController.UpdateRolePermissions(id, permissionCodes); - } - - public Task DeleteRole(RoleId id) - { - return roleController.DeleteRole(id); - } - - public Task>> GetRolePermissions(RoleId id) - { - return roleController.GetRolePermissions(id); - } - - public Task>> GetAllPermissionsForCreateRole() - { - return roleController.GetAllPermissionsForCreateRole(); - } -} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/Controllers/Identity/AdminUserController.cs b/src/NetCorePal.D3Shop.Web/Controllers/Identity/AdminUserController.cs index 33e2918..0a96b31 100644 --- a/src/NetCorePal.D3Shop.Web/Controllers/Identity/AdminUserController.cs +++ b/src/NetCorePal.D3Shop.Web/Controllers/Identity/AdminUserController.cs @@ -5,9 +5,12 @@ using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate; using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.Permission; using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.RoleAggregate; +using NetCorePal.D3Shop.Web.Admin.Client.Services; using NetCorePal.D3Shop.Web.Application.Commands.Identity; +using NetCorePal.D3Shop.Web.Application.Commands.Identity.Dto; using NetCorePal.D3Shop.Web.Application.Queries.Identity; using NetCorePal.D3Shop.Web.Auth; +using NetCorePal.D3Shop.Web.Blazor; using NetCorePal.D3Shop.Web.Helper; using NetCorePal.Extensions.Dto; using NetCorePal.Extensions.Primitives; @@ -16,12 +19,13 @@ namespace NetCorePal.D3Shop.Web.Controllers.Identity; [Route("api/[controller]/[action]")] [ApiController] +[KnownExceptionHandler] [AdminPermission(PermissionDefinitions.AdminUserView)] public class AdminUserController( IMediator mediator, AdminUserQuery adminUserQuery, RoleQuery roleQuery) - : ControllerBase + : ControllerBase, IAdminUserService { private CancellationToken CancellationToken => HttpContext?.RequestAborted ?? default; @@ -84,7 +88,7 @@ public async Task SetAdminUserSpecificPermissions(AdminUserId id, { var allPermissions = Permissions.AllPermissions; var permissionsToBeAssigned = allPermissions.Where(x => permissionCodes.Contains(x.Code)) - .Select(p => new AdminUserPermission(p.Code, p.Remark)); + .Select(p => new AdminUserPermissionDto(p.Code, p.Remark)); await mediator.Send(new SetAdminUserSpecificPermissions(id, permissionsToBeAssigned), CancellationToken); return new ResponseData(); } diff --git a/src/NetCorePal.D3Shop.Web/Controllers/Identity/RoleController.cs b/src/NetCorePal.D3Shop.Web/Controllers/Identity/RoleController.cs index a84ccd3..4187008 100644 --- a/src/NetCorePal.D3Shop.Web/Controllers/Identity/RoleController.cs +++ b/src/NetCorePal.D3Shop.Web/Controllers/Identity/RoleController.cs @@ -4,16 +4,19 @@ using NetCorePal.D3Shop.Admin.Shared.Responses; using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.Permission; using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.RoleAggregate; +using NetCorePal.D3Shop.Web.Admin.Client.Services; using NetCorePal.D3Shop.Web.Application.Commands.Identity; using NetCorePal.D3Shop.Web.Application.Queries.Identity; using NetCorePal.D3Shop.Web.Auth; +using NetCorePal.D3Shop.Web.Blazor; using NetCorePal.Extensions.Dto; namespace NetCorePal.D3Shop.Web.Controllers.Identity; [Route("api/[controller]/[action]")] [ApiController] -public class RoleController(IMediator mediator, RoleQuery roleQuery) : ControllerBase +[KnownExceptionHandler] +public class RoleController(IMediator mediator, RoleQuery roleQuery) : ControllerBase, IRolesService { private CancellationToken CancellationToken => HttpContext?.RequestAborted ?? CancellationToken.None; diff --git a/src/NetCorePal.D3Shop.Web/Extensions/SeedDatabaseExtension.cs b/src/NetCorePal.D3Shop.Web/Extensions/SeedDatabaseExtension.cs index 223521f..2e2a140 100644 --- a/src/NetCorePal.D3Shop.Web/Extensions/SeedDatabaseExtension.cs +++ b/src/NetCorePal.D3Shop.Web/Extensions/SeedDatabaseExtension.cs @@ -13,10 +13,11 @@ internal static IApplicationBuilder SeedDatabase(this IApplicationBuilder app) if (dbContext.AdminUsers.Any(u => u.Name == AppDefaultCredentials.Name)) return app; - var adminUser = new AdminUser(AppDefaultCredentials.Name, "", PasswordHasher.HashPassword(AppDefaultCredentials.Password), []); + var adminUser = new AdminUser(AppDefaultCredentials.Name, "", + PasswordHasher.HashPassword(AppDefaultCredentials.Password), [], []); dbContext.AdminUsers.Add(adminUser); dbContext.SaveChanges(); return app; } } -} +} \ No newline at end of file diff --git a/src/NetCorePal.D3Shop.Web/NetCorePal.D3Shop.Web.csproj b/src/NetCorePal.D3Shop.Web/NetCorePal.D3Shop.Web.csproj index c80a73b..60b30c3 100644 --- a/src/NetCorePal.D3Shop.Web/NetCorePal.D3Shop.Web.csproj +++ b/src/NetCorePal.D3Shop.Web/NetCorePal.D3Shop.Web.csproj @@ -12,7 +12,6 @@ - @@ -42,7 +41,6 @@ - @@ -64,6 +62,7 @@ + diff --git a/src/NetCorePal.D3Shop.Web/Program.cs b/src/NetCorePal.D3Shop.Web/Program.cs index b05e9e3..82ac26b 100644 --- a/src/NetCorePal.D3Shop.Web/Program.cs +++ b/src/NetCorePal.D3Shop.Web/Program.cs @@ -75,7 +75,7 @@ #region Controller - builder.Services.AddControllers().AddControllersAsServices().AddJsonOptions(options => + builder.Services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new EntityIdJsonConverterFactory()); }); diff --git a/test/NetCorePal.D3Shop.Domain.Tests/Identity/AdminUserTests.cs b/test/NetCorePal.D3Shop.Domain.Tests/Identity/AdminUserTests.cs index ab71655..f4149fd 100644 --- a/test/NetCorePal.D3Shop.Domain.Tests/Identity/AdminUserTests.cs +++ b/test/NetCorePal.D3Shop.Domain.Tests/Identity/AdminUserTests.cs @@ -1,29 +1,27 @@ using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate; -using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.AdminUserAggregate.Dto; using NetCorePal.D3Shop.Domain.AggregatesModel.Identity.RoleAggregate; namespace NetCorePal.D3Shop.Domain.Tests.Identity { public class AdminUserTests { - private readonly AdminUser _testUser = new("test", "1", "", []); + private readonly AdminUser _testUser = new("test", "1", "", [], []); [Fact] public void EditRole_Test() { const string roleName = "testRole"; const string rolePermission = "testPermission"; - _testUser.UpdateRoles([ - new AssignAdminUserRoleDto( - new RoleId(1),roleName,[new AdminUserPermission(rolePermission,"test")] - ) - ]); + _testUser.UpdateRoles( + [new AdminUserRole(new RoleId(1), roleName)], + [new AdminUserPermission(rolePermission, "test", new RoleId(1))] + ); Assert.Contains(_testUser.Roles, r => r.RoleName == roleName); Assert.True(_testUser.IsInRole(roleName)); Assert.Contains(_testUser.Permissions, p => p.PermissionCode == rolePermission); - _testUser.UpdateRoles([]); + _testUser.UpdateRoles([], []); Assert.Empty(_testUser.Roles); Assert.Empty(_testUser.Permissions); } } -} +} \ No newline at end of file diff --git a/test/NetCorePal.D3Shop.Web.Tests/Identity/AuthTests.cs b/test/NetCorePal.D3Shop.Web.Tests/Identity/AuthTests.cs index 121bf98..12f0f6d 100644 --- a/test/NetCorePal.D3Shop.Web.Tests/Identity/AuthTests.cs +++ b/test/NetCorePal.D3Shop.Web.Tests/Identity/AuthTests.cs @@ -10,7 +10,7 @@ namespace NetCorePal.D3Shop.Web.Tests.Identity; public class AuthTests { private readonly HttpClient _client; - private readonly AdminUser _testUser = new("Test", "", "", []); + private readonly AdminUser _testUser = new("Test", "", "", [], []); public AuthTests(MyWebApplicationFactory factory) {