Handler.cs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using Microsoft.Extensions.Logging;
  5. using SharedKernel.Results;
  6. namespace Application.Features.Api.Auth.Logout;
  7. internal sealed class Handler(IAppDbContext db, ILogger<Handler> logger) : ICommandHandler<Command, Result>
  8. {
  9. public async Task<Result> Handle(Command request, CancellationToken ct)
  10. {
  11. if (string.IsNullOrWhiteSpace(request.RefreshToken))
  12. {
  13. return Result.Failure(Error.Problem("Auth.TokenRequired", "리프레시 토큰은 필수입니다."));
  14. }
  15. var refreshToken = await db.RefreshToken.FirstOrDefaultAsync(t => t.Token == request.RefreshToken && t.MemberID == request.MemberID, ct);
  16. if (refreshToken is null)
  17. {
  18. return Result.Failure(Error.NotFound("Auth.TokenNotFound", "유효하지 않은 리프레시 토큰입니다."));
  19. }
  20. if (refreshToken.IsRevoked)
  21. {
  22. return Result.Success();
  23. }
  24. refreshToken.Revoke();
  25. await db.SaveChangesAsync(ct);
  26. logger.LogInformation("로그아웃 완료");
  27. return Result.Success();
  28. }
  29. }