using MediatR; using Nashel.Modules.Identity.Domain.Aggregates; using Nashel.Modules.Identity.Domain.Enums; using Nashel.Modules.Identity.Domain.Repositories; using Nashel.Modules.Identity.Domain.Services; namespace Nashel.Modules.Identity.Application.Commands; /// /// Команда входа пользователя. /// public record LoginCommand : IRequest { /// /// Номер телефона. /// public string Phone { get; init; } = default!; /// /// Пароль. /// public string Password { get; init; } = default!; public LoginCommand(string phone, string password) { Phone = phone; Password = password; } public LoginCommand() { } } // Возвращает JWT public class LoginCommandHandler : IRequestHandler { private readonly IAccountRepository _accountRepository; private readonly IJwtTokenGenerator _jwtTokenGenerator; private readonly IPasswordHasher _passwordHasher; public LoginCommandHandler( IAccountRepository accountRepository, IJwtTokenGenerator jwtTokenGenerator, IPasswordHasher passwordHasher) { _accountRepository = accountRepository; _jwtTokenGenerator = jwtTokenGenerator; _passwordHasher = passwordHasher; } public async Task Handle(LoginCommand request, CancellationToken cancellationToken) { var account = await _accountRepository.GetByPhoneAsync(request.Phone, cancellationToken); if (account == null || !_passwordHasher.VerifyPassword(request.Password, account.PasswordHash)) { throw new Exception("Неверные учетные данные"); } return _jwtTokenGenerator.GenerateToken(account.Id, account.Roles); } }