using BlackRock.Reporting.API.Authentication; using BlackRock.Reporting.API.Core.Models; using BlackRock.Reporting.API.Mediator.AuthenticationMediator.Models; using BlackRock.Reporting.API.Mediator.UserMediator.Model; using MediatR; using Microsoft.AspNetCore.Identity; namespace BlackRock.Reporting.API.Mediator.AuthenticationMediator.Commands { public class LoginCommand : IRequest> { public string Username { get; set; } public string Password { get; set; } } public class LoginCommandHandlers : IRequestHandler> { private readonly ILogger logger; private readonly IJwtManager jwtManager; private readonly IRefreshTokenManager refreshTokenManager; private readonly UserManager userManager; public LoginCommandHandlers(ILogger logger, IJwtManager jwtManager, IRefreshTokenManager refreshTokenManager, UserManager userManager) { this.logger = logger; this.jwtManager = jwtManager; this.refreshTokenManager = refreshTokenManager; this.userManager = userManager; } public async Task> Handle(LoginCommand command, CancellationToken cancellationToken) { if (command is null) throw new ArgumentException($"Parameter {nameof(command)} must not be null"); try { var user = await userManager.FindByNameAsync(command.Username); if (user != null && await userManager.CheckPasswordAsync(user, command.Password)) { var token = jwtManager.GenerateToken(command.Username); await refreshTokenManager.RemoveRefreshToken(user); var refreshToken = await refreshTokenManager.GenerateRefreshToken(user); return new Result { Data = new CredentialsCommand { RefreshToken = refreshToken, JwtToken = token } }; } return new Result { IsSuccess = false, Error = "Invalid username and password" }; } catch (Exception ex) { logger.LogError(ex, "Faild login"); return new Result { IsSuccess = false, Error = "Faild login." }; } } } }