This repository has no description
2.9 kB
112 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 async delete(
81 followerId: string,
82 targetId: string,
83 targetType: FollowTargetType,
84 ): Promise<Result<void>> {
85 try {
86 const key = `${followerId}:${targetId}:${targetType.value}`;
87 this.follows.delete(key);
88 return ok(undefined);
89 } catch (error: any) {
90 return err(error);
91 }
92 }
93
94 async findByFollowerAndTarget(
95 followerId: string,
96 targetId: string,
97 targetType: FollowTargetType,
98 ): Promise<Result<Follow | null>> {
99 try {
100 const key = `${followerId}:${targetId}:${targetType.value}`;
101 const follow = this.follows.get(key);
102 return ok(follow || null);
103 } catch (error: any) {
104 return err(error);
105 }
106 }
107
108 // Helper method for testing
109 clear(): void {
110 this.follows.clear();
111 }
112}