A social knowledge tool for researchers built on ATProto
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 '../dtos/TokenDTO';
6import { RefreshAccessTokenErrors } from './errors/RefreshAccessTokenErrors';
7
8export interface RefreshAccessTokenDTO {
9 refreshToken: string;
10}
11
12export type RefreshAccessTokenResponse = Result<
13 TokenPair,
14 RefreshAccessTokenErrors.InvalidRefreshTokenError | AppError.UnexpectedError
15>;
16
17export class RefreshAccessTokenUseCase
18 implements UseCase<RefreshAccessTokenDTO, Promise<RefreshAccessTokenResponse>>
19{
20 constructor(private tokenService: ITokenService) {}
21
22 async execute(
23 request: RefreshAccessTokenDTO,
24 ): Promise<RefreshAccessTokenResponse> {
25 try {
26 const tokenResult = await this.tokenService.refreshToken(
27 request.refreshToken,
28 );
29
30 if (tokenResult.isErr()) {
31 return err(new AppError.UnexpectedError(tokenResult.error));
32 }
33
34 if (!tokenResult.value) {
35 return err(new RefreshAccessTokenErrors.InvalidRefreshTokenError());
36 }
37
38 return ok(tokenResult.value);
39 } catch (error: any) {
40 return err(new AppError.UnexpectedError(error));
41 }
42 }
43}