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 repositories.followsRepository,
303 repositories.feedRepository,
304 ),
305 // Search use cases
306 getSimilarUrlsForUrlUseCase: new GetSimilarUrlsForUrlUseCase(
307 services.searchService,
308 ),
309 semanticSearchUrlsUseCase: new SemanticSearchUrlsUseCase(
310 services.searchService,
311 services.identityResolutionService,
312 ),
313 searchBskyPostsForUrlUseCase: new SearchBskyPostsForUrlUseCase(
314 services.atProtoAgentService,
315 ),
316 searchAtProtoAccountsUseCase: new SearchAtProtoAccountsUseCase(
317 services.atProtoAgentService,
318 ),
319 searchLeafletDocsForUrlUseCase: new SearchLeafletDocsForUrlUseCase(
320 services.leafletSearchService,
321 repositories.cardQueryRepository,
322 ),
323 // Notification use cases
324 getMyNotificationsUseCase: new GetMyNotificationsUseCase(
325 repositories.notificationRepository,
326 services.profileService,
327 repositories.cardQueryRepository,
328 repositories.collectionRepository,
329 ),
330 getUnreadNotificationCountUseCase: new GetUnreadNotificationCountUseCase(
331 repositories.notificationRepository,
332 ),
333 markNotificationsAsReadUseCase: new MarkNotificationsAsReadUseCase(
334 repositories.notificationRepository,
335 ),
336 markAllNotificationsAsReadUseCase: new MarkAllNotificationsAsReadUseCase(
337 repositories.notificationRepository,
338 ),
339 };
340 }
341
342 static createForWorker(
343 repositories: Repositories,
344 services: SharedServices,
345 ): WorkerUseCases {
346 // ========================================
347 // LEVEL 1: Leaf use cases (no use case dependencies)
348 // ========================================
349
350 // Feed use cases
351 const addActivityToFeedUseCase = new AddActivityToFeedUseCase(
352 services.feedService,
353 repositories.cardRepository,
354 repositories.followsRepository,
355 repositories.feedRepository,
356 );
357
358 // Search use cases
359 const indexUrlForSearchUseCase = new IndexUrlForSearchUseCase(
360 services.searchService,
361 );
362
363 // Notification use cases
364 const createNotificationUseCase = new CreateNotificationUseCase(
365 services.notificationService,
366 );
367
368 // Card library use cases
369 const addUrlToLibraryUseCase = new AddUrlToLibraryUseCase(
370 repositories.cardRepository,
371 services.metadataService,
372 services.cardLibraryService,
373 services.cardCollectionService,
374 services.eventPublisher,
375 );
376
377 const updateUrlCardAssociationsUseCase =
378 new UpdateUrlCardAssociationsUseCase(
379 repositories.cardRepository,
380 services.cardLibraryService,
381 services.cardCollectionService,
382 services.eventPublisher,
383 );
384
385 const removeCardFromLibraryUseCase = new RemoveCardFromLibraryUseCase(
386 repositories.cardRepository,
387 services.cardLibraryService,
388 services.eventPublisher,
389 );
390
391 // Collection use cases
392 const createCollectionUseCase = new CreateCollectionUseCase(
393 repositories.collectionRepository,
394 services.collectionPublisher,
395 );
396
397 const updateCollectionUseCase = new UpdateCollectionUseCase(
398 repositories.collectionRepository,
399 services.collectionPublisher,
400 );
401
402 const deleteCollectionUseCase = new DeleteCollectionUseCase(
403 repositories.collectionRepository,
404 services.collectionPublisher,
405 );
406
407 // ========================================
408 // LEVEL 2: Process use cases (depend on Level 1)
409 // ========================================
410
411 const processCardFirehoseEventUseCase = new ProcessCardFirehoseEventUseCase(
412 repositories.atUriResolutionService,
413 addUrlToLibraryUseCase,
414 updateUrlCardAssociationsUseCase,
415 removeCardFromLibraryUseCase,
416 repositories.cardRepository,
417 );
418
419 const processCollectionFirehoseEventUseCase =
420 new ProcessCollectionFirehoseEventUseCase(
421 repositories.atUriResolutionService,
422 createCollectionUseCase,
423 updateCollectionUseCase,
424 deleteCollectionUseCase,
425 );
426
427 const processCollectionLinkFirehoseEventUseCase =
428 new ProcessCollectionLinkFirehoseEventUseCase(
429 repositories.atUriResolutionService,
430 updateUrlCardAssociationsUseCase,
431 );
432
433 const processCollectionLinkRemovalFirehoseEventUseCase =
434 new ProcessCollectionLinkRemovalFirehoseEventUseCase(
435 repositories.atUriResolutionService,
436 updateUrlCardAssociationsUseCase,
437 );
438
439 const processMarginBookmarkFirehoseEventUseCase =
440 new ProcessMarginBookmarkFirehoseEventUseCase(
441 repositories.atUriResolutionService,
442 addUrlToLibraryUseCase,
443 removeCardFromLibraryUseCase,
444 );
445
446 const processMarginCollectionFirehoseEventUseCase =
447 new ProcessMarginCollectionFirehoseEventUseCase(
448 repositories.atUriResolutionService,
449 createCollectionUseCase,
450 updateCollectionUseCase,
451 deleteCollectionUseCase,
452 );
453
454 const processMarginCollectionItemFirehoseEventUseCase =
455 new ProcessMarginCollectionItemFirehoseEventUseCase(
456 repositories.atUriResolutionService,
457 updateUrlCardAssociationsUseCase,
458 );
459
460 // ========================================
461 // LEVEL 3: Sync use cases (depend on Level 2)
462 // ========================================
463
464 const syncAccountDataUseCase = new SyncAccountDataUseCase(
465 repositories.syncStatusRepository,
466 services.atProtoRepoService,
467 repositories.atUriResolutionService,
468 processMarginBookmarkFirehoseEventUseCase,
469 processMarginCollectionFirehoseEventUseCase,
470 processMarginCollectionItemFirehoseEventUseCase,
471 );
472
473 // ========================================
474 // Return all use cases
475 // ========================================
476
477 return {
478 // Level 1
479 addActivityToFeedUseCase,
480 indexUrlForSearchUseCase,
481 createNotificationUseCase,
482 addUrlToLibraryUseCase,
483 updateUrlCardAssociationsUseCase,
484 removeCardFromLibraryUseCase,
485 createCollectionUseCase,
486 updateCollectionUseCase,
487 deleteCollectionUseCase,
488 // Level 2
489 processCardFirehoseEventUseCase,
490 processCollectionFirehoseEventUseCase,
491 processCollectionLinkFirehoseEventUseCase,
492 processCollectionLinkRemovalFirehoseEventUseCase,
493 processMarginBookmarkFirehoseEventUseCase,
494 processMarginCollectionFirehoseEventUseCase,
495 processMarginCollectionItemFirehoseEventUseCase,
496 // Level 3
497 syncAccountDataUseCase,
498 };
499 }
500}