A social knowledge tool for researchers built on ATProto
1import { err, Result } from '../../../shared/core/Result';
2import { ICardRepository } from './ICardRepository';
3import { ICollectionRepository } from './ICollectionRepository';
4import { Card } from './Card';
5import { CardId } from './value-objects/CardId';
6import { CollectionId } from './value-objects/CollectionId';
7import { CuratorId } from './value-objects/CuratorId';
8
9export class LibraryService {
10 constructor(
11 private cardRepository: ICardRepository,
12 private collectionRepository: ICollectionRepository,
13 ) {}
14
15 async addCardToLibrary(card: Card): Promise<Result<void>> {
16 return await this.cardRepository.save(card);
17 }
18
19 async addCardToCollection(
20 cardId: CardId,
21 collectionId: CollectionId,
22 authorId: CuratorId,
23 ): Promise<Result<void>> {
24 const collectionResult =
25 await this.collectionRepository.findById(collectionId);
26
27 if (collectionResult.isErr()) {
28 return err(collectionResult.error);
29 }
30
31 const collection = collectionResult.value;
32
33 if (!collection) {
34 return err(new Error('Collection not found'));
35 }
36
37 const addResult = collection.addCard(cardId, authorId);
38
39 if (addResult.isErr()) {
40 return err(addResult.error);
41 }
42
43 return await this.collectionRepository.save(collection);
44 }
45}