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 LogoutCommand : CredentialsCommand, IRequest> { } public class LogoutCommandHandlers : IRequestHandler> { private readonly ILogger logger; private readonly IJwtManager jwtManager; private readonly IRefreshTokenManager refreshTokenManager; private readonly UserManager userManager; public LogoutCommandHandlers(ILogger logger, IJwtManager jwtManager, IRefreshTokenManager refreshTokenManager, UserManager userManager) { this.logger = logger; this.jwtManager = jwtManager; this.refreshTokenManager = refreshTokenManager; this.userManager = userManager; } public async Task> Handle(LogoutCommand command, CancellationToken cancellationToken) { if (command is null) throw new ArgumentException($"Parameter {nameof(command)} must not be null"); try { // this checks is jwt token correct var userName = jwtManager.GetUserName(command.JwtToken); var user = await userManager.FindByNameAsync(userName); if (!(await refreshTokenManager.ValidateRefreshToken(user, command.RefreshToken))) return new Result { IsSuccess = false, Error = "Invalid token" }; await refreshTokenManager.RemoveRefreshToken(user); return new Result { Data = true }; } catch (Exception ex) { logger.LogError(ex, "Invalid token"); return new Result { IsSuccess = false, Error = "Invalid token" }; } } } }