using BuildFlow.Shared.Domain.Errors; using BuildFlow.Shared.Domain.Exceptions; using MediatR; using BuildFlow.Platform.Domain.Entities.Role; using BuildFlow.Platform.Domain.Entities.User; using BuildFlow.Platform.Domain.Entities.UserRole; using BuildFlow.Platform.Infrastructure.Persistence; using BuildFlow.Platform.Application.Auth.Commands; namespace BuildFlow.Platform.Application.Auth.Handlers; /// /// 注册Command处理器。执行业务校验后持久化。 /// public class RegisterCommandHandler(PlatformDbContext db) : IRequestHandler { public async Task Handle(RegisterCommand request, CancellationToken ct) { // 用户名与邮箱任一重复即拒绝,保证唯一性约束在业务层先行拦截 if (await db.Users.AnyAsync(u => u.Username == request.Username || u.Email == request.Email, ct)) throw new BusinessException(ErrorCode.AlreadyExists, "用户名或邮箱已存在"); var user = new UserEntity { Username = request.Username, Email = request.Email, // 用 BCrypt 自带盐哈希密码,永不落地明文 PasswordHash = BCrypt.Net.BCrypt.HashPassword(request.Password) }; // 自助注册一律授予最低权限的 "User" 角色,避免越权 var userRole = await db.Roles.FirstAsync(r => r.Name == "User", ct); await db.Users.AddAsync(user, ct); await db.UserRoles.AddAsync(new UserRoleEntity { UserId = user.Id, RoleId = userRole.Id }, ct); await db.SaveChangesAsync(ct); return Unit.Value; } }