This repository has no description
0

Configure Feed

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

semble / src / shared / infrastructure / http / factories / UseCaseFactory.ts
23 kB 496 lines
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}