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("No account found with this email. Please register first."); if (!BCrypt.Net.BCrypt.Verify(request.Password, user.Password)) throw new UnauthorizedAccessException("Incorrect password. Please try again."); var token = _jwtTokenService.GenerateToken(user); var role = user.Admin != null ? "admin" : user.Writer != null ? "writer" : "regular"; return new LoginResponse(token, user.Id, user.Username, user.Email, user.Name, user.Surname, role); } } }