This repository has no description
2.7 kB
87 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(
62 tokenResult.value.accessToken.split('.')[1]!,
63 'base64',
64 ).toString(),
65 );
66 const userId = payload.sub || payload.did || 'unknown';
67 console.log(
68 `[RefreshAccessTokenUseCase] Token refresh successful for user: ${userId}`,
69 );
70 } catch {
71 console.log(
72 `[RefreshAccessTokenUseCase] Token refresh successful (could not extract user ID)`,
73 );
74 }
75 }
76
77 return ok(tokenResult.value);
78 } catch (error: any) {
79 if (ENABLE_AUTH_LOGGING) {
80 console.log(
81 `[RefreshAccessTokenUseCase] Token refresh error: ${error.message}`,
82 );
83 }
84 return err(new AppError.UnexpectedError(error));
85 }
86 }
87}