This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

semble / src / modules / user / tests / infrastructure / InMemoryFollowsRepository.ts
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}