This repository has no description
1import { InitiateOAuthSignInUseCase } from '../../../../modules/user/application/use-cases/InitiateOAuthSignInUseCase';
2import { CompleteOAuthSignInUseCase } from '../../../../modules/user/application/use-cases/CompleteOAuthSignInUseCase';
3import { RefreshAccessTokenUseCase } from '../../../../modules/user/application/use-cases/RefreshAccessTokenUseCase';
4import { AddUrlToLibraryUseCase } from '../../../../modules/cards/application/useCases/commands/AddUrlToLibraryUseCase';
5import { AddCardToLibraryUseCase } from '../../../../modules/cards/application/useCases/commands/AddCardToLibraryUseCase';
6import { AddCardToCollectionUseCase } from '../../../../modules/cards/application/useCases/commands/AddCardToCollectionUseCase';
7import { UpdateNoteCardUseCase } from '../../../../modules/cards/application/useCases/commands/UpdateNoteCardUseCase';
8import { UpdateUrlCardAssociationsUseCase } from '../../../../modules/cards/application/useCases/commands/UpdateUrlCardAssociationsUseCase';
9import { RemoveCardFromLibraryUseCase } from '../../../../modules/cards/application/useCases/commands/RemoveCardFromLibraryUseCase';
10import { RemoveCardFromCollectionUseCase } from '../../../../modules/cards/application/useCases/commands/RemoveCardFromCollectionUseCase';
11import { GetUrlMetadataUseCase } from '../../../../modules/cards/application/useCases/queries/GetUrlMetadataUseCase';
12import { GetUrlCardViewUseCase } from '../../../../modules/cards/application/useCases/queries/GetUrlCardViewUseCase';
13import { GetLibrariesForCardUseCase } from '../../../../modules/cards/application/useCases/queries/GetLibrariesForCardUseCase';
14import { GetUrlCardsUseCase } from '../../../../modules/cards/application/useCases/queries/GetUrlCardsUseCase';
15import { CreateCollectionUseCase } from '../../../../modules/cards/application/useCases/commands/CreateCollectionUseCase';
16import { UpdateCollectionUseCase } from '../../../../modules/cards/application/useCases/commands/UpdateCollectionUseCase';
17import { DeleteCollectionUseCase } from '../../../../modules/cards/application/useCases/commands/DeleteCollectionUseCase';
18import { GetCollectionPageUseCase } from '../../../../modules/cards/application/useCases/queries/GetCollectionPageUseCase';
19import { Repositories } from './RepositoryFactory';
20import { Services, SharedServices } from './ServiceFactory';
21import { GetProfileUseCase } from 'src/modules/cards/application/useCases/queries/GetProfileUseCase';
22import { LoginWithAppPasswordUseCase } from 'src/modules/user/application/use-cases/LoginWithAppPasswordUseCase';
23import { LogoutUseCase } from 'src/modules/user/application/use-cases/LogoutUseCase';
24import { GenerateExtensionTokensUseCase } from 'src/modules/user/application/use-cases/GenerateExtensionTokensUseCase';
25import { GetGlobalFeedUseCase } from '../../../../modules/feeds/application/useCases/queries/GetGlobalFeedUseCase';
26import { GetGemActivityFeedUseCase } from '../../../../modules/feeds/application/useCases/queries/GetGemActivityFeedUseCase';
27import { AddActivityToFeedUseCase } from '../../../../modules/feeds/application/useCases/commands/AddActivityToFeedUseCase';
28import { GetCollectionsUseCase } from 'src/modules/cards/application/useCases/queries/GetCollectionsUseCase';
29import { SearchCollectionsUseCase } from 'src/modules/cards/application/useCases/queries/SearchCollectionsUseCase';
30import { GetOpenCollectionsWithContributorUseCase } from 'src/modules/cards/application/useCases/queries/GetOpenCollectionsWithContributorUseCase';
31import { GetCollectionPageByAtUriUseCase } from 'src/modules/cards/application/useCases/queries/GetCollectionPageByAtUriUseCase';
32import { GetUrlStatusForMyLibraryUseCase } from '../../../../modules/cards/application/useCases/queries/GetUrlStatusForMyLibraryUseCase';
33import { GetLibrariesForUrlUseCase } from '../../../../modules/cards/application/useCases/queries/GetLibrariesForUrlUseCase';
34import { GetCollectionsForUrlUseCase } from '../../../../modules/cards/application/useCases/queries/GetCollectionsForUrlUseCase';
35import { GetNoteCardsForUrlUseCase } from '../../../../modules/cards/application/useCases/queries/GetNoteCardsForUrlUseCase';
36import { IndexUrlForSearchUseCase } from '../../../../modules/search/application/useCases/commands/IndexUrlForSearchUseCase';
37import { GetSimilarUrlsForUrlUseCase } from '../../../../modules/search/application/useCases/queries/GetSimilarUrlsForUrlUseCase';
38import { SemanticSearchUrlsUseCase } from '../../../../modules/search/application/useCases/queries/SemanticSearchUrlsUseCase';
39import { SearchBskyPostsForUrlUseCase } from '../../../../modules/search/application/use-cases/SearchBskyPostsForUrlUseCase';
40import { SearchAtProtoAccountsUseCase } from '../../../../modules/search/application/use-cases/SearchAtProtoAccountsUseCase';
41import { SearchLeafletDocsForUrlUseCase } from '../../../../modules/search/application/use-cases/SearchLeafletDocsForUrlUseCase';
42import { ProcessCardFirehoseEventUseCase } from '../../../../modules/atproto/application/useCases/ProcessCardFirehoseEventUseCase';
43import { ProcessCollectionFirehoseEventUseCase } from '../../../../modules/atproto/application/useCases/ProcessCollectionFirehoseEventUseCase';
44import { ProcessCollectionLinkFirehoseEventUseCase } from '../../../../modules/atproto/application/useCases/ProcessCollectionLinkFirehoseEventUseCase';
45import { ProcessMarginBookmarkFirehoseEventUseCase } from '../../../../modules/atproto/application/useCases/ProcessMarginBookmarkFirehoseEventUseCase';
46import { ProcessMarginCollectionFirehoseEventUseCase } from '../../../../modules/atproto/application/useCases/ProcessMarginCollectionFirehoseEventUseCase';
47import { ProcessMarginCollectionItemFirehoseEventUseCase } from '../../../../modules/atproto/application/useCases/ProcessMarginCollectionItemFirehoseEventUseCase';
48import { ProcessCollectionLinkRemovalFirehoseEventUseCase } from '../../../../modules/atproto/application/useCases/ProcessCollectionLinkRemovalFirehoseEventUseCase';
49import { GetMyNotificationsUseCase } from '../../../../modules/notifications/application/useCases/queries/GetMyNotificationsUseCase';
50import { GetUnreadNotificationCountUseCase } from '../../../../modules/notifications/application/useCases/queries/GetUnreadNotificationCountUseCase';
51import { MarkNotificationsAsReadUseCase } from '../../../../modules/notifications/application/useCases/commands/MarkNotificationsAsReadUseCase';
52import { MarkAllNotificationsAsReadUseCase } from '../../../../modules/notifications/application/useCases/commands/MarkAllNotificationsAsReadUseCase';
53import { CreateNotificationUseCase } from '../../../../modules/notifications/application/useCases/commands/CreateNotificationUseCase';
54import { SyncAccountDataUseCase } from '../../../../modules/sync/application/useCases/SyncAccountDataUseCase';
55
56export interface WorkerUseCases {
57 addActivityToFeedUseCase: AddActivityToFeedUseCase;
58 indexUrlForSearchUseCase: IndexUrlForSearchUseCase;
59 createNotificationUseCase: CreateNotificationUseCase;
60 syncAccountDataUseCase: SyncAccountDataUseCase;
61 // Firehose-specific use cases
62 addUrlToLibraryUseCase: AddUrlToLibraryUseCase;
63 updateUrlCardAssociationsUseCase: UpdateUrlCardAssociationsUseCase;
64 removeCardFromLibraryUseCase: RemoveCardFromLibraryUseCase;
65 createCollectionUseCase: CreateCollectionUseCase;
66 updateCollectionUseCase: UpdateCollectionUseCase;
67 deleteCollectionUseCase: DeleteCollectionUseCase;
68 processCardFirehoseEventUseCase: ProcessCardFirehoseEventUseCase;
69 processCollectionFirehoseEventUseCase: ProcessCollectionFirehoseEventUseCase;
70 processCollectionLinkFirehoseEventUseCase: ProcessCollectionLinkFirehoseEventUseCase;
71 processMarginBookmarkFirehoseEventUseCase: ProcessMarginBookmarkFirehoseEventUseCase;
72 processMarginCollectionFirehoseEventUseCase: ProcessMarginCollectionFirehoseEventUseCase;
73 processMarginCollectionItemFirehoseEventUseCase: ProcessMarginCollectionItemFirehoseEventUseCase;
74 processCollectionLinkRemovalFirehoseEventUseCase: ProcessCollectionLinkRemovalFirehoseEventUseCase;
75}
76
77export interface UseCases {
78 // User use cases
79 loginWithAppPasswordUseCase: LoginWithAppPasswordUseCase;
80 logoutUseCase: LogoutUseCase;
81 initiateOAuthSignInUseCase: InitiateOAuthSignInUseCase;
82 completeOAuthSignInUseCase: CompleteOAuthSignInUseCase;
83 getProfileUseCase: GetProfileUseCase;
84 refreshAccessTokenUseCase: RefreshAccessTokenUseCase;
85 generateExtensionTokensUseCase: GenerateExtensionTokensUseCase;
86 // Card use cases
87 addUrlToLibraryUseCase: AddUrlToLibraryUseCase;
88 addCardToLibraryUseCase: AddCardToLibraryUseCase;
89 addCardToCollectionUseCase: AddCardToCollectionUseCase;
90 updateNoteCardUseCase: UpdateNoteCardUseCase;
91 updateUrlCardAssociationsUseCase: UpdateUrlCardAssociationsUseCase;
92 removeCardFromLibraryUseCase: RemoveCardFromLibraryUseCase;
93 removeCardFromCollectionUseCase: RemoveCardFromCollectionUseCase;
94 getUrlMetadataUseCase: GetUrlMetadataUseCase;
95 getUrlCardViewUseCase: GetUrlCardViewUseCase;
96 getLibrariesForCardUseCase: GetLibrariesForCardUseCase;
97 getMyUrlCardsUseCase: GetUrlCardsUseCase;
98 createCollectionUseCase: CreateCollectionUseCase;
99 updateCollectionUseCase: UpdateCollectionUseCase;
100 deleteCollectionUseCase: DeleteCollectionUseCase;
101 getCollectionPageUseCase: GetCollectionPageUseCase;
102 getCollectionPageByAtUriUseCase: GetCollectionPageByAtUriUseCase;
103 getCollectionsUseCase: GetCollectionsUseCase;
104 searchCollectionsUseCase: SearchCollectionsUseCase;
105 getOpenCollectionsWithContributorUseCase: GetOpenCollectionsWithContributorUseCase;
106 getUrlStatusForMyLibraryUseCase: GetUrlStatusForMyLibraryUseCase;
107 getLibrariesForUrlUseCase: GetLibrariesForUrlUseCase;
108 getCollectionsForUrlUseCase: GetCollectionsForUrlUseCase;
109 getNoteCardsForUrlUseCase: GetNoteCardsForUrlUseCase;
110 // Feed use cases
111 getGlobalFeedUseCase: GetGlobalFeedUseCase;
112 getGemActivityFeedUseCase: GetGemActivityFeedUseCase;
113 addActivityToFeedUseCase: AddActivityToFeedUseCase;
114 // Search use cases
115 getSimilarUrlsForUrlUseCase: GetSimilarUrlsForUrlUseCase;
116 semanticSearchUrlsUseCase: SemanticSearchUrlsUseCase;
117 searchBskyPostsForUrlUseCase: SearchBskyPostsForUrlUseCase;
118 searchAtProtoAccountsUseCase: SearchAtProtoAccountsUseCase;
119 searchLeafletDocsForUrlUseCase: SearchLeafletDocsForUrlUseCase;
120 // Notification use cases
121 getMyNotificationsUseCase: GetMyNotificationsUseCase;
122 getUnreadNotificationCountUseCase: GetUnreadNotificationCountUseCase;
123 markNotificationsAsReadUseCase: MarkNotificationsAsReadUseCase;
124 markAllNotificationsAsReadUseCase: MarkAllNotificationsAsReadUseCase;
125}
126
127export class UseCaseFactory {
128 static create(repositories: Repositories, services: Services): UseCases {
129 return this.createForWebApp(repositories, services);
130 }
131
132 static createForWebApp(
133 repositories: Repositories,
134 services: Services,
135 ): UseCases {
136 const getCollectionPageUseCase = new GetCollectionPageUseCase(
137 repositories.collectionRepository,
138 repositories.cardQueryRepository,
139 services.profileService,
140 );
141
142 return {
143 // User use cases
144 loginWithAppPasswordUseCase: new LoginWithAppPasswordUseCase(
145 services.appPasswordProcessor,
146 services.tokenService,
147 repositories.userRepository,
148 services.userAuthService,
149 ),
150 logoutUseCase: new LogoutUseCase(services.tokenService),
151 initiateOAuthSignInUseCase: new InitiateOAuthSignInUseCase(
152 services.oauthProcessor,
153 ),
154 completeOAuthSignInUseCase: new CompleteOAuthSignInUseCase(
155 services.oauthProcessor,
156 services.tokenService,
157 repositories.userRepository,
158 services.userAuthService,
159 ),
160 getProfileUseCase: new GetProfileUseCase(
161 services.profileService,
162 services.identityResolutionService,
163 ),
164 refreshAccessTokenUseCase: new RefreshAccessTokenUseCase(
165 services.tokenService,
166 ),
167 generateExtensionTokensUseCase: new GenerateExtensionTokensUseCase(
168 services.tokenService,
169 ),
170
171 // Card use cases
172 addUrlToLibraryUseCase: new AddUrlToLibraryUseCase(
173 repositories.cardRepository,
174 services.metadataService,
175 services.cardLibraryService,
176 services.cardCollectionService,
177 services.eventPublisher,
178 ),
179 addCardToLibraryUseCase: new AddCardToLibraryUseCase(
180 repositories.cardRepository,
181 services.cardLibraryService,
182 services.cardCollectionService,
183 ),
184 addCardToCollectionUseCase: new AddCardToCollectionUseCase(
185 repositories.cardRepository,
186 services.cardCollectionService,
187 services.eventPublisher,
188 ),
189 updateNoteCardUseCase: new UpdateNoteCardUseCase(
190 repositories.cardRepository,
191 services.cardPublisher,
192 ),
193 updateUrlCardAssociationsUseCase: new UpdateUrlCardAssociationsUseCase(
194 repositories.cardRepository,
195 services.cardLibraryService,
196 services.cardCollectionService,
197 services.eventPublisher,
198 ),
199 removeCardFromLibraryUseCase: new RemoveCardFromLibraryUseCase(
200 repositories.cardRepository,
201 services.cardLibraryService,
202 services.eventPublisher,
203 ),
204 removeCardFromCollectionUseCase: new RemoveCardFromCollectionUseCase(
205 repositories.cardRepository,
206 services.cardCollectionService,
207 services.eventPublisher,
208 ),
209 getUrlMetadataUseCase: new GetUrlMetadataUseCase(
210 services.metadataService,
211 repositories.cardRepository,
212 ),
213 getUrlCardViewUseCase: new GetUrlCardViewUseCase(
214 repositories.cardQueryRepository,
215 services.profileService,
216 repositories.collectionRepository,
217 ),
218 getLibrariesForCardUseCase: new GetLibrariesForCardUseCase(
219 repositories.cardQueryRepository,
220 services.profileService,
221 ),
222 getMyUrlCardsUseCase: new GetUrlCardsUseCase(
223 repositories.cardQueryRepository,
224 services.identityResolutionService,
225 services.profileService,
226 ),
227 createCollectionUseCase: new CreateCollectionUseCase(
228 repositories.collectionRepository,
229 services.collectionPublisher,
230 ),
231 updateCollectionUseCase: new UpdateCollectionUseCase(
232 repositories.collectionRepository,
233 services.collectionPublisher,
234 ),
235 deleteCollectionUseCase: new DeleteCollectionUseCase(
236 repositories.collectionRepository,
237 services.collectionPublisher,
238 ),
239 getCollectionPageUseCase,
240 getCollectionPageByAtUriUseCase: new GetCollectionPageByAtUriUseCase(
241 services.identityResolutionService,
242 repositories.atUriResolutionService,
243 getCollectionPageUseCase,
244 services.configService.getAtProtoCollections().collection,
245 services.configService.getAtProtoCollections().marginCollection,
246 ),
247 getCollectionsUseCase: new GetCollectionsUseCase(
248 repositories.collectionQueryRepository,
249 services.profileService,
250 services.identityResolutionService,
251 ),
252 searchCollectionsUseCase: new SearchCollectionsUseCase(
253 repositories.collectionQueryRepository,
254 services.profileService,
255 services.identityResolutionService,
256 ),
257 getOpenCollectionsWithContributorUseCase:
258 new GetOpenCollectionsWithContributorUseCase(
259 repositories.collectionQueryRepository,
260 services.profileService,
261 services.identityResolutionService,
262 ),
263 getUrlStatusForMyLibraryUseCase: new GetUrlStatusForMyLibraryUseCase(
264 repositories.cardRepository,
265 repositories.cardQueryRepository,
266 repositories.collectionQueryRepository,
267 repositories.collectionRepository,
268 services.profileService,
269 services.eventPublisher,
270 ),
271 getLibrariesForUrlUseCase: new GetLibrariesForUrlUseCase(
272 repositories.cardQueryRepository,
273 services.profileService,
274 ),
275 getCollectionsForUrlUseCase: new GetCollectionsForUrlUseCase(
276 repositories.collectionQueryRepository,
277 services.profileService,
278 repositories.collectionRepository,
279 ),
280 getNoteCardsForUrlUseCase: new GetNoteCardsForUrlUseCase(
281 repositories.cardQueryRepository,
282 services.profileService,
283 ),
284
285 // Feed use cases
286 getGlobalFeedUseCase: new GetGlobalFeedUseCase(
287 repositories.feedRepository,
288 services.profileService,
289 repositories.cardQueryRepository,
290 repositories.collectionRepository,
291 ),
292 getGemActivityFeedUseCase: new GetGemActivityFeedUseCase(
293 repositories.feedRepository,
294 services.profileService,
295 repositories.cardQueryRepository,
296 repositories.collectionRepository,
297 repositories.collectionQueryRepository,
298 ),
299 addActivityToFeedUseCase: new AddActivityToFeedUseCase(
300 services.feedService,
301 repositories.cardRepository,
302 ),
303 // Search use cases
304 getSimilarUrlsForUrlUseCase: new GetSimilarUrlsForUrlUseCase(
305 services.searchService,
306 ),
307 semanticSearchUrlsUseCase: new SemanticSearchUrlsUseCase(
308 services.searchService,
309 services.identityResolutionService,
310 ),
311 searchBskyPostsForUrlUseCase: new SearchBskyPostsForUrlUseCase(
312 services.atProtoAgentService,
313 ),
314 searchAtProtoAccountsUseCase: new SearchAtProtoAccountsUseCase(
315 services.atProtoAgentService,
316 ),
317 searchLeafletDocsForUrlUseCase: new SearchLeafletDocsForUrlUseCase(
318 services.leafletSearchService,
319 repositories.cardQueryRepository,
320 ),
321 // Notification use cases
322 getMyNotificationsUseCase: new GetMyNotificationsUseCase(
323 repositories.notificationRepository,
324 services.profileService,
325 repositories.cardQueryRepository,
326 repositories.collectionRepository,
327 ),
328 getUnreadNotificationCountUseCase: new GetUnreadNotificationCountUseCase(
329 repositories.notificationRepository,
330 ),
331 markNotificationsAsReadUseCase: new MarkNotificationsAsReadUseCase(
332 repositories.notificationRepository,
333 ),
334 markAllNotificationsAsReadUseCase: new MarkAllNotificationsAsReadUseCase(
335 repositories.notificationRepository,
336 ),
337 };
338 }
339
340 static createForWorker(
341 repositories: Repositories,
342 services: SharedServices,
343 ): WorkerUseCases {
344 // ========================================
345 // LEVEL 1: Leaf use cases (no use case dependencies)
346 // ========================================
347
348 // Feed use cases
349 const addActivityToFeedUseCase = new AddActivityToFeedUseCase(
350 services.feedService,
351 repositories.cardRepository,
352 );
353
354 // Search use cases
355 const indexUrlForSearchUseCase = new IndexUrlForSearchUseCase(
356 services.searchService,
357 );
358
359 // Notification use cases
360 const createNotificationUseCase = new CreateNotificationUseCase(
361 services.notificationService,
362 );
363
364 // Card library use cases
365 const addUrlToLibraryUseCase = new AddUrlToLibraryUseCase(
366 repositories.cardRepository,
367 services.metadataService,
368 services.cardLibraryService,
369 services.cardCollectionService,
370 services.eventPublisher,
371 );
372
373 const updateUrlCardAssociationsUseCase =
374 new UpdateUrlCardAssociationsUseCase(
375 repositories.cardRepository,
376 services.cardLibraryService,
377 services.cardCollectionService,
378 services.eventPublisher,
379 );
380
381 const removeCardFromLibraryUseCase = new RemoveCardFromLibraryUseCase(
382 repositories.cardRepository,
383 services.cardLibraryService,
384 services.eventPublisher,
385 );
386
387 // Collection use cases
388 const createCollectionUseCase = new CreateCollectionUseCase(
389 repositories.collectionRepository,
390 services.collectionPublisher,
391 );
392
393 const updateCollectionUseCase = new UpdateCollectionUseCase(
394 repositories.collectionRepository,
395 services.collectionPublisher,
396 );
397
398 const deleteCollectionUseCase = new DeleteCollectionUseCase(
399 repositories.collectionRepository,
400 services.collectionPublisher,
401 );
402
403 // ========================================
404 // LEVEL 2: Process use cases (depend on Level 1)
405 // ========================================
406
407 const processCardFirehoseEventUseCase = new ProcessCardFirehoseEventUseCase(
408 repositories.atUriResolutionService,
409 addUrlToLibraryUseCase,
410 updateUrlCardAssociationsUseCase,
411 removeCardFromLibraryUseCase,
412 repositories.cardRepository,
413 );
414
415 const processCollectionFirehoseEventUseCase =
416 new ProcessCollectionFirehoseEventUseCase(
417 repositories.atUriResolutionService,
418 createCollectionUseCase,
419 updateCollectionUseCase,
420 deleteCollectionUseCase,
421 );
422
423 const processCollectionLinkFirehoseEventUseCase =
424 new ProcessCollectionLinkFirehoseEventUseCase(
425 repositories.atUriResolutionService,
426 updateUrlCardAssociationsUseCase,
427 );
428
429 const processCollectionLinkRemovalFirehoseEventUseCase =
430 new ProcessCollectionLinkRemovalFirehoseEventUseCase(
431 repositories.atUriResolutionService,
432 updateUrlCardAssociationsUseCase,
433 );
434
435 const processMarginBookmarkFirehoseEventUseCase =
436 new ProcessMarginBookmarkFirehoseEventUseCase(
437 repositories.atUriResolutionService,
438 addUrlToLibraryUseCase,
439 removeCardFromLibraryUseCase,
440 );
441
442 const processMarginCollectionFirehoseEventUseCase =
443 new ProcessMarginCollectionFirehoseEventUseCase(
444 repositories.atUriResolutionService,
445 createCollectionUseCase,
446 updateCollectionUseCase,
447 deleteCollectionUseCase,
448 );
449
450 const processMarginCollectionItemFirehoseEventUseCase =
451 new ProcessMarginCollectionItemFirehoseEventUseCase(
452 repositories.atUriResolutionService,
453 updateUrlCardAssociationsUseCase,
454 );
455
456 // ========================================
457 // LEVEL 3: Sync use cases (depend on Level 2)
458 // ========================================
459
460 const syncAccountDataUseCase = new SyncAccountDataUseCase(
461 repositories.syncStatusRepository,
462 services.atProtoRepoService,
463 repositories.atUriResolutionService,
464 processMarginBookmarkFirehoseEventUseCase,
465 processMarginCollectionFirehoseEventUseCase,
466 processMarginCollectionItemFirehoseEventUseCase,
467 );
468
469 // ========================================
470 // Return all use cases
471 // ========================================
472
473 return {
474 // Level 1
475 addActivityToFeedUseCase,
476 indexUrlForSearchUseCase,
477 createNotificationUseCase,
478 addUrlToLibraryUseCase,
479 updateUrlCardAssociationsUseCase,
480 removeCardFromLibraryUseCase,
481 createCollectionUseCase,
482 updateCollectionUseCase,
483 deleteCollectionUseCase,
484 // Level 2
485 processCardFirehoseEventUseCase,
486 processCollectionFirehoseEventUseCase,
487 processCollectionLinkFirehoseEventUseCase,
488 processCollectionLinkRemovalFirehoseEventUseCase,
489 processMarginBookmarkFirehoseEventUseCase,
490 processMarginCollectionFirehoseEventUseCase,
491 processMarginCollectionItemFirehoseEventUseCase,
492 // Level 3
493 syncAccountDataUseCase,
494 };
495 }
496}