All files / src/platform/search/services search-index-registry.service.ts

0% Statements 0/19
0% Branches 0/4
0% Functions 0/6
0% Lines 0/15

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);
  }
}