using BuildFlow.Platform.Infrastructure.Persistence;
using BuildFlow.Shared.Domain.Common;
namespace BuildFlow.Host.Endpoints.rag.Auth;
///
/// 修改当前用户密码。验证旧密码后更新为新密码。
/// POST /api/user/change-password
///
public class ChangePasswordEndpoint(PlatformDbContext db, ICurrentUserContext userContext)
: Endpoint
{
public override void Configure()
{
Post("/user/change-password");
}
public override async Task HandleAsync(ChangePasswordRequest req, CancellationToken ct)
{
var userId = userContext.GetRequiredUserId();
var user = await db.Users
.FirstOrDefaultAsync(u => u.Id.ToString() == userId, ct)
?? throw new UnauthorizedException("用户不存在");
// 验证旧密码
if (!BCrypt.Net.BCrypt.Verify(req.OldPassword, user.PasswordHash))
{
throw new BusinessException("旧密码不正确");
}
// 新密码不能与旧密码相同
if (req.OldPassword == req.NewPassword)
{
throw new BusinessException("新密码不能与旧密码相同");
}
// 更新密码
user.PasswordHash = BCrypt.Net.BCrypt.HashPassword(req.NewPassword);
await db.SaveChangesAsync(ct);
await Send.OkAsync(ct);
}
}