Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | import { Injectable, Logger } from '@nestjs/common'; import { SearchableEntityProvider, SearchDocument, SearchPermissionContext, SearchQuery, SearchResult, } from '../interfaces/searchable-entity.interface'; @Injectable() export class SearchIndexRegistry { private readonly logger = new Logger(SearchIndexRegistry.name); private readonly providers = new Map<string, SearchableEntityProvider>(); /** * Register a domain entity provider for global search indexing. */ register(provider: SearchableEntityProvider): void { this.providers.set(provider.entityType, provider); this.logger.log( `Search entity registered: ${provider.entityType} (collection: ${provider.collection})`, ); } getProvider(entityType: string): SearchableEntityProvider | undefined { return this.providers.get(entityType); } getAllProviders(): SearchableEntityProvider[] { return Array.from(this.providers.values()); } getRegisteredEntityTypes(): string[] { return Array.from(this.providers.keys()); } /** * Build a search document from a raw database record using the registered provider. */ mapDocument(entityType: string, rawDoc: any): SearchDocument | null { const provider = this.providers.get(entityType); if (!provider) return null; return provider.mapToSearchDocument(rawDoc); } /** * Filter search results for the requesting user's permissions. */ sanitize( entityType: string, doc: SearchDocument, context: SearchPermissionContext, ): SearchDocument { const provider = this.providers.get(entityType); if (!provider) return doc; return provider.sanitizeResult(doc, context); } } |