This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

semble / src / modules / user / application / use-cases / RefreshAccessTokenUseCase.ts
2.7 kB 84 lines
1import { UseCase } from 'src/shared/core/UseCase'; 2import { Result, err, ok } from 'src/shared/core/Result'; 3import { AppError } from 'src/shared/core/AppError'; 4import { ITokenService } from '../services/ITokenService'; 5import { TokenPair } from '@semble/types'; 6import { RefreshAccessTokenErrors } from './errors/RefreshAccessTokenErrors'; 7 8const ENABLE_AUTH_LOGGING = true; 9 10export interface RefreshAccessTokenDTO { 11 refreshToken: string; 12} 13 14export type RefreshAccessTokenResponse = Result< 15 TokenPair, 16 RefreshAccessTokenErrors.InvalidRefreshTokenError | AppError.UnexpectedError 17>; 18 19export class RefreshAccessTokenUseCase 20 implements UseCase<RefreshAccessTokenDTO, Promise<RefreshAccessTokenResponse>> 21{ 22 constructor(private tokenService: ITokenService) {} 23 24 async execute( 25 request: RefreshAccessTokenDTO, 26 ): Promise<RefreshAccessTokenResponse> { 27 try { 28 if (ENABLE_AUTH_LOGGING) { 29 const tokenPreview = '...' + request.refreshToken.slice(-8); 30 console.log( 31 `[RefreshAccessTokenUseCase] Attempting token refresh with token: ${tokenPreview}`, 32 ); 33 } 34 35 const tokenResult = await this.tokenService.refreshToken( 36 request.refreshToken, 37 ); 38 39 if (tokenResult.isErr()) { 40 if (ENABLE_AUTH_LOGGING) { 41 console.log( 42 `[RefreshAccessTokenUseCase] Token refresh failed: ${tokenResult.error.message}`, 43 ); 44 } 45 return err(new AppError.UnexpectedError(tokenResult.error)); 46 } 47 48 if (!tokenResult.value) { 49 if (ENABLE_AUTH_LOGGING) { 50 console.log( 51 `[RefreshAccessTokenUseCase] Token refresh returned null - invalid refresh token`, 52 ); 53 } 54 return err(new RefreshAccessTokenErrors.InvalidRefreshTokenError()); 55 } 56 57 if (ENABLE_AUTH_LOGGING) { 58 // Extract user ID from the new access token for logging 59 try { 60 const payload = JSON.parse( 61 atob(tokenResult.value.accessToken.split('.')[1]), 62 ); 63 const userId = payload.sub || payload.did || 'unknown'; 64 console.log( 65 `[RefreshAccessTokenUseCase] Token refresh successful for user: ${userId}`, 66 ); 67 } catch { 68 console.log( 69 `[RefreshAccessTokenUseCase] Token refresh successful (could not extract user ID)`, 70 ); 71 } 72 } 73 74 return ok(tokenResult.value); 75 } catch (error: any) { 76 if (ENABLE_AUTH_LOGGING) { 77 console.log( 78 `[RefreshAccessTokenUseCase] Token refresh error: ${error.message}`, 79 ); 80 } 81 return err(new AppError.UnexpectedError(error)); 82 } 83 } 84}