This repository has no description
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 Buffer.from(tokenResult.value.accessToken.split('.')[1], 'base64').toString(),
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}