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 RefreshCommand : CredentialsCommand, IRequest> { } public class RefreshCommandHandlers : IRequestHandler> { private readonly ILogger logger; private readonly IJwtManager jwtManager; private readonly IRefreshTokenManager refreshTokenManager; private readonly UserManager userManager; public RefreshCommandHandlers(ILogger logger, IJwtManager jwtManager, IRefreshTokenManager refreshTokenManager, UserManager userManager) { this.logger = logger; this.jwtManager = jwtManager; this.refreshTokenManager = refreshTokenManager; this.userManager = userManager; } public async Task> Handle(RefreshCommand command, CancellationToken cancellationToken) { if (command is null) throw new ArgumentException($"Parameter {nameof(command)} must not be null"); try { var userName = jwtManager.GetUserName(command.JwtToken); var user = await userManager.FindByNameAsync(userName); if (!(await refreshTokenManager.ValidateRefreshToken(user, command.RefreshToken))) throw new UnauthorizedAccessException("Invalid token"); var token = jwtManager.GenerateToken(userName); if (token == null) throw new UnauthorizedAccessException("Token is not valid"); return new Result { Data = new CredentialsCommand { JwtToken = token, RefreshToken = command.RefreshToken } }; } catch (Exception ex) { logger.LogError(ex, "Faild to add data to DB."); return new Result { IsSuccess = false, Error = "Faild to add data to DB." }; } } } }