using ChapterX.Domain.Repositories; using MediatR; namespace ChapterX.Application.Auth { public class LoginHandler : IRequestHandler { private readonly IUserRepository _userRepository; private readonly IJwtTokenService _jwtTokenService; public LoginHandler(IUserRepository userRepository, IJwtTokenService jwtTokenService) { _userRepository = userRepository; _jwtTokenService = jwtTokenService; } public async Task Handle(LoginRequest request, CancellationToken cancellationToken) { var user = await _userRepository.GetByEmailAsync(request.Email, cancellationToken) ?? throw new UnauthorizedAccessException("Invalid email or password."); if (!BCrypt.Net.BCrypt.Verify(request.Password, user.Password)) throw new UnauthorizedAccessException("Invalid email or password."); var token = _jwtTokenService.GenerateToken(user); return new LoginResponse(token, user.Id, user.Username, user.Email); } } }