feat: 角色模板改为数据库管理支持前端自定义

This commit is contained in:
2025-12-03 20:38:26 +08:00
parent 19137f3cf7
commit 6a84141799
28 changed files with 901 additions and 652 deletions

View File

@@ -2,7 +2,6 @@ using System;
using System.Collections.Generic;
using System.Linq;
using MediatR;
using TakeoutSaaS.Application.Identity.Abstractions;
using TakeoutSaaS.Application.Identity.Commands;
using TakeoutSaaS.Application.Identity.Contracts;
using TakeoutSaaS.Domain.Identity.Entities;
@@ -17,7 +16,7 @@ namespace TakeoutSaaS.Application.Identity.Handlers;
/// 角色模板复制处理器。
/// </summary>
public sealed class CopyRoleTemplateCommandHandler(
IRoleTemplateProvider roleTemplateProvider,
IRoleTemplateRepository roleTemplateRepository,
IRoleRepository roleRepository,
IPermissionRepository permissionRepository,
IRolePermissionRepository rolePermissionRepository,
@@ -27,9 +26,16 @@ public sealed class CopyRoleTemplateCommandHandler(
/// <inheritdoc />
public async Task<RoleDto> Handle(CopyRoleTemplateCommand request, CancellationToken cancellationToken)
{
var template = roleTemplateProvider.FindByCode(request.TemplateCode)
var template = await roleTemplateRepository.FindByCodeAsync(request.TemplateCode, cancellationToken)
?? throw new BusinessException(ErrorCodes.NotFound, $"角色模板 {request.TemplateCode} 不存在");
var templatePermissions = await roleTemplateRepository.GetPermissionsAsync(template.Id, cancellationToken);
var permissionCodes = templatePermissions
.Select(x => x.PermissionCode)
.Where(code => !string.IsNullOrWhiteSpace(code))
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToArray();
var tenantId = tenantProvider.GetCurrentTenantId();
var roleCode = string.IsNullOrWhiteSpace(request.RoleCode) ? template.TemplateCode : request.RoleCode.Trim();
var roleName = string.IsNullOrWhiteSpace(request.RoleName) ? template.Name : request.RoleName.Trim();
@@ -64,18 +70,12 @@ public sealed class CopyRoleTemplateCommandHandler(
}
// 2. 确保模板权限全部存在,不存在则按模板定义创建。
var targetPermissionCodes = template.Permissions
.Select(permission => permission.Code)
.Where(code => !string.IsNullOrWhiteSpace(code))
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToArray();
var existingPermissions = await permissionRepository.GetByCodesAsync(tenantId, targetPermissionCodes, cancellationToken);
var existingPermissions = await permissionRepository.GetByCodesAsync(tenantId, permissionCodes, cancellationToken);
var permissionMap = existingPermissions.ToDictionary(x => x.Code, StringComparer.OrdinalIgnoreCase);
foreach (var permissionDefinition in template.Permissions)
foreach (var code in permissionCodes)
{
if (permissionMap.ContainsKey(permissionDefinition.Code))
if (permissionMap.ContainsKey(code))
{
continue;
}
@@ -83,13 +83,13 @@ public sealed class CopyRoleTemplateCommandHandler(
var permission = new Permission
{
TenantId = tenantId,
Name = permissionDefinition.Name,
Code = permissionDefinition.Code,
Description = permissionDefinition.Description
Name = code,
Code = code,
Description = code
};
await permissionRepository.AddAsync(permission, cancellationToken);
permissionMap[permissionDefinition.Code] = permission;
permissionMap[code] = permission;
}
await roleRepository.SaveChangesAsync(cancellationToken);
@@ -100,7 +100,7 @@ public sealed class CopyRoleTemplateCommandHandler(
.Select(x => x.PermissionId)
.ToHashSet();
var targetPermissionIds = targetPermissionCodes
var targetPermissionIds = permissionCodes
.Select(code => permissionMap[code].Id)
.ToHashSet();