import { Observable } from 'rxjs'; import { LeadSearchCollection } from './lead-search.collection'; import { ISearchClient } from '../search/search-client.interface'; import { IErrorHandler } from '../error/error-handler.interface'; import { LeadSearchCollectionConverter } from './lead-search.collection.converter'; import { ILeadSearchConfig } from './lead-search-config.interface'; import { LeadSearchParamsBuilder } from './lead-search-params.builder'; export class LeadSearchService { private searchableFields: string[] = [ 'client_name', 'client_phone', 'client_email', 'details', 'stage', 'source', 'assignee_name' ]; public constructor( private searchClient: ISearchClient, private converter: LeadSearchCollectionConverter, private paramsBuilder: LeadSearchParamsBuilder, private errorHandler: IErrorHandler ) { } public search( query: string, config: ILeadSearchConfig ): Observable { if (!config.searchableFields) { config.searchableFields = this.searchableFields; } const searchParams: { [key: string]: any } = this.paramsBuilder.build(query, config); return this.searchClient.search(searchParams) .catch((error?: any) => this.errorHandler.handle(error)) .map((json: any) => this.converter.toCollection(json)); } }