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 { IUserRepository } from '../../domain/repositories/IUserRepository';
5import { UserDTO } from '../dtos/UserDTO';
6import { DID } from '../../domain/value-objects/DID';
7import { GetCurrentUserErrors } from './errors/GetCurrentUserErrors';
8import { UserMap } from '../mappers/UserMap';
9
10export interface GetCurrentUserDTO {
11 did: string;
12}
13
14export type GetCurrentUserResponse = Result<
15 UserDTO,
16 GetCurrentUserErrors.UserNotFoundError | AppError.UnexpectedError
17>;
18
19export class GetCurrentUserUseCase
20 implements UseCase<GetCurrentUserDTO, Promise<GetCurrentUserResponse>>
21{
22 constructor(private userRepository: IUserRepository) {}
23
24 async execute(request: GetCurrentUserDTO): Promise<GetCurrentUserResponse> {
25 try {
26 const didOrError = DID.create(request.did);
27
28 if (didOrError.isErr()) {
29 return err(new GetCurrentUserErrors.UserNotFoundError());
30 }
31
32 const userResult = await this.userRepository.findByDID(didOrError.value);
33
34 if (userResult.isErr()) {
35 return err(new AppError.UnexpectedError(userResult.error));
36 }
37
38 const user = userResult.value;
39
40 if (!user) {
41 return err(new GetCurrentUserErrors.UserNotFoundError());
42 }
43
44 // Map domain entity to DTO
45 const userDTO = UserMap.toDTO(user);
46
47 return ok(userDTO);
48 } catch (error: any) {
49 return err(new AppError.UnexpectedError(error));
50 }
51 }
52}