A social knowledge tool for researchers built on ATProto
1import { DatabaseFactory } from '../../database/DatabaseFactory';
2import { EnvironmentConfigService } from '../../config/EnvironmentConfigService';
3import { DrizzleUserRepository } from '../../../../modules/user/infrastructure/repositories/DrizzleUserRepository';
4import { DrizzleTokenRepository } from '../../../../modules/user/infrastructure/repositories/DrizzleTokenRepository';
5import { DrizzleCardRepository } from '../../../../modules/cards/infrastructure/repositories/DrizzleCardRepository';
6import { DrizzleCardQueryRepository } from '../../../../modules/cards/infrastructure/repositories/DrizzleCardQueryRepository';
7import { DrizzleCollectionRepository } from '../../../../modules/cards/infrastructure/repositories/DrizzleCollectionRepository';
8import { DrizzleCollectionQueryRepository } from '../../../../modules/cards/infrastructure/repositories/DrizzleCollectionQueryRepository';
9import { DrizzleAppPasswordSessionRepository } from 'src/modules/atproto/infrastructure/repositories/DrizzleAppPasswordSessionRepository';
10import { InMemoryCardRepository } from '../../../../modules/cards/tests/utils/InMemoryCardRepository';
11import { InMemoryCardQueryRepository } from '../../../../modules/cards/tests/utils/InMemoryCardQueryRepository';
12import { InMemoryCollectionRepository } from '../../../../modules/cards/tests/utils/InMemoryCollectionRepository';
13import { InMemoryCollectionQueryRepository } from '../../../../modules/cards/tests/utils/InMemoryCollectionQueryRepository';
14import { InMemoryUserRepository } from '../../../../modules/user/tests/infrastructure/InMemoryUserRepository';
15import { InMemoryTokenRepository } from '../../../../modules/user/tests/infrastructure/InMemoryTokenRepository';
16import { InMemoryAppPasswordSessionRepository } from '../../../../modules/atproto/tests/infrastructure/InMemoryAppPasswordSessionRepository';
17import { ICardRepository } from 'src/modules/cards/domain/ICardRepository';
18import { ICardQueryRepository } from 'src/modules/cards/domain/ICardQueryRepository';
19import { ICollectionRepository } from 'src/modules/cards/domain/ICollectionRepository';
20import { ICollectionQueryRepository } from 'src/modules/cards/domain/ICollectionQueryRepository';
21import { IUserRepository } from 'src/modules/user/domain/repositories/IUserRepository';
22import { ITokenRepository } from 'src/modules/user/domain/repositories/ITokenRepository';
23import { IAppPasswordSessionRepository } from 'src/modules/atproto/infrastructure/repositories/IAppPasswordSessionRepository';
24import { DrizzleStateStore } from '../../../../modules/user/infrastructure/services/DrizzleStateStore';
25import { DrizzleSessionStore } from '../../../../modules/user/infrastructure/services/DrizzleSessionStore';
26import { InMemoryStateStore } from '../../../../modules/user/tests/infrastructure/InMemoryStateStore';
27import { InMemorySessionStore } from '../../../../modules/user/tests/infrastructure/InMemorySessionStore';
28import {
29 NodeSavedStateStore,
30 NodeSavedSessionStore,
31} from '@atproto/oauth-client-node';
32import { DrizzleFeedRepository } from '../../../../modules/feeds/infrastructure/repositories/DrizzleFeedRepository';
33import { InMemoryFeedRepository } from '../../../../modules/feeds/tests/infrastructure/InMemoryFeedRepository';
34import { IFeedRepository } from '../../../../modules/feeds/domain/IFeedRepository';
35import { IAtUriResolutionService } from '../../../../modules/cards/domain/services/IAtUriResolutionService';
36import { DrizzleAtUriResolutionService } from '../../../../modules/cards/infrastructure/services/DrizzleAtUriResolutionService';
37import { InMemoryAtUriResolutionService } from '../../../../modules/cards/tests/utils/InMemoryAtUriResolutionService';
38
39export interface Repositories {
40 userRepository: IUserRepository;
41 tokenRepository: ITokenRepository;
42 cardRepository: ICardRepository;
43 cardQueryRepository: ICardQueryRepository;
44 collectionRepository: ICollectionRepository;
45 collectionQueryRepository: ICollectionQueryRepository;
46 appPasswordSessionRepository: IAppPasswordSessionRepository;
47 feedRepository: IFeedRepository;
48 atUriResolutionService: IAtUriResolutionService;
49 oauthStateStore: NodeSavedStateStore;
50 oauthSessionStore: NodeSavedSessionStore;
51}
52
53export class RepositoryFactory {
54 static create(configService: EnvironmentConfigService): Repositories {
55 const useMockRepos = process.env.USE_MOCK_REPOS === 'true';
56
57 if (useMockRepos) {
58 // Create in-memory repositories
59 const userRepository = new InMemoryUserRepository();
60 const tokenRepository = new InMemoryTokenRepository();
61 const cardRepository = new InMemoryCardRepository();
62 const collectionRepository = new InMemoryCollectionRepository();
63 const cardQueryRepository = new InMemoryCardQueryRepository(
64 cardRepository,
65 collectionRepository,
66 );
67 const collectionQueryRepository = new InMemoryCollectionQueryRepository(
68 collectionRepository,
69 cardRepository,
70 );
71 const appPasswordSessionRepository =
72 new InMemoryAppPasswordSessionRepository();
73 const feedRepository = InMemoryFeedRepository.getInstance();
74 const atUriResolutionService = new InMemoryAtUriResolutionService(
75 collectionRepository,
76 );
77 const oauthStateStore = new InMemoryStateStore();
78 const oauthSessionStore = new InMemorySessionStore();
79
80 return {
81 userRepository,
82 tokenRepository,
83 cardRepository,
84 cardQueryRepository,
85 collectionRepository,
86 collectionQueryRepository,
87 appPasswordSessionRepository,
88 feedRepository,
89 atUriResolutionService,
90 oauthStateStore,
91 oauthSessionStore,
92 };
93 }
94
95 const db = DatabaseFactory.createConnection(
96 configService.getDatabaseConfig(),
97 );
98
99 const oauthStateStore = new DrizzleStateStore(db);
100 const oauthSessionStore = new DrizzleSessionStore(db);
101
102 return {
103 userRepository: new DrizzleUserRepository(db),
104 tokenRepository: new DrizzleTokenRepository(db),
105 cardRepository: new DrizzleCardRepository(db),
106 cardQueryRepository: new DrizzleCardQueryRepository(db),
107 collectionRepository: new DrizzleCollectionRepository(db),
108 collectionQueryRepository: new DrizzleCollectionQueryRepository(db),
109 appPasswordSessionRepository: new DrizzleAppPasswordSessionRepository(db),
110 feedRepository: new DrizzleFeedRepository(db),
111 atUriResolutionService: new DrizzleAtUriResolutionService(db),
112 oauthStateStore,
113 oauthSessionStore,
114 };
115 }
116}