using Dpz.Core.Service.Mediator.Features.Account.Internal;
using Dpz.Core.Service.Mediator.Features.Account.Queries;

namespace Dpz.Core.Service.Mediator.Features.Security.Queries;

/// <summary>
/// 处理账号密码验证请求
/// </summary>
public class VerifyAccountPasswordHandler(IRepository<User> userRepository, IMediator mediator)
    : IRequestHandler<VerifyAccountPasswordRequest, ResponseResult<VmUserInfo?>>
{
    /// <summary>
    /// 验证账号和 BCrypt 密码,成功时返回用户信息
    /// </summary>
    public async ValueTask<ResponseResult<VmUserInfo?>> Handle(
        VerifyAccountPasswordRequest request,
        CancellationToken cancellationToken
    )
    {
        var user = await AccountRepositoryHelper.GetUserAsync(
            userRepository,
            request.Account,
            cancellationToken
        );
        if (user == null)
        {
            return ResponseResult<VmUserInfo?>.Fail("用户名或密码错误");
        }

        if (!AccountSecurityHelper.VerifyPassword(request.Password, user.Password))
        {
            return ResponseResult<VmUserInfo?>.Fail("用户名或密码错误");
        }

        var userInfo = await mediator.Send(
            new GetUserInfoRequest { Account = request.Account },
            cancellationToken
        );
        return ResponseResult<VmUserInfo?>.Ok(userInfo);
    }
}
评论加载中...