This repository has no description
2.2 kB
84 lines
1import { Result, ok, err } from 'src/shared/core/Result';
2import { Follow } from '../../domain/Follow';
3import { IFollowsRepository } from '../../domain/repositories/IFollowsRepository';
4import {
5 FollowTargetType,
6 FollowTargetTypeEnum,
7} from '../../domain/value-objects/FollowTargetType';
8
9export class InMemoryFollowsRepository implements IFollowsRepository {
10 private static instance: InMemoryFollowsRepository;
11 private follows: Map<string, Follow> = new Map();
12
13 private constructor() {}
14
15 public static getInstance(): InMemoryFollowsRepository {
16 if (!InMemoryFollowsRepository.instance) {
17 InMemoryFollowsRepository.instance = new InMemoryFollowsRepository();
18 }
19 return InMemoryFollowsRepository.instance;
20 }
21
22 async getFollowers(
23 targetId: string,
24 targetType: FollowTargetType,
25 ): Promise<Result<Follow[]>> {
26 try {
27 const followers: Follow[] = [];
28
29 for (const follow of this.follows.values()) {
30 if (
31 follow.targetId === targetId &&
32 follow.targetType.equals(targetType)
33 ) {
34 followers.push(follow);
35 }
36 }
37
38 return ok(followers);
39 } catch (error: any) {
40 return err(error);
41 }
42 }
43
44 async getFollowersOfCollections(
45 collectionIds: string[],
46 ): Promise<Result<Follow[]>> {
47 try {
48 if (collectionIds.length === 0) {
49 return ok([]);
50 }
51
52 const followers: Follow[] = [];
53
54 for (const follow of this.follows.values()) {
55 if (
56 collectionIds.includes(follow.targetId) &&
57 follow.targetType.value === FollowTargetTypeEnum.COLLECTION
58 ) {
59 followers.push(follow);
60 }
61 }
62
63 return ok(followers);
64 } catch (error: any) {
65 return err(error);
66 }
67 }
68
69 // Helper method for testing
70 async save(follow: Follow): Promise<Result<void>> {
71 try {
72 const key = `${follow.followerId.value}:${follow.targetId}:${follow.targetType.value}`;
73 this.follows.set(key, follow);
74 return ok(undefined);
75 } catch (error: any) {
76 return err(error);
77 }
78 }
79
80 // Helper method for testing
81 clear(): void {
82 this.follows.clear();
83 }
84}