import { Logger } from '../../logger'; import { IFeatureStrategiesStore, IUnleashConfig, IUnleashStores, serializeDates, } from '../../types'; import { IFeatureSearchParams, IQueryOperator, IQueryParam, } from '../feature-toggle/types/feature-toggle-strategies-store-type'; export class FeatureSearchService { private featureStrategiesStore: IFeatureStrategiesStore; private logger: Logger; constructor( { featureStrategiesStore, }: Pick, { getLogger }: Pick, ) { this.featureStrategiesStore = featureStrategiesStore; this.logger = getLogger('services/feature-search-service.ts'); } async search(params: IFeatureSearchParams) { const queryParams = this.convertToQueryParams(params); const { features, total } = await this.featureStrategiesStore.searchFeatures( { ...params, limit: params.limit, }, queryParams, ); return { features, total, }; } parseOperatorValue = (field: string, value: string): IQueryParam | null => { const pattern = /^(IS|IS_NOT|IS_ANY_OF|IS_NOT_ANY_OF|INCLUDE|DO_NOT_INCLUDE|INCLUDE_ALL_OF|INCLUDE_ANY_OF|EXCLUDE_IF_ANY_OF|EXCLUDE_ALL):(.+)$/; const match = value.match(pattern); if (match) { return { field, operator: match[1] as IQueryOperator, values: match[2].split(','), }; } return null; }; convertToQueryParams = (params: IFeatureSearchParams): IQueryParam[] => { const queryParams: IQueryParam[] = []; if (params.state) { const parsedState = this.parseOperatorValue('stale', params.state); if (parsedState) { parsedState.values = parsedState.values.map((value) => value === 'active' ? 'false' : 'true', ); queryParams.push(parsedState); } } ['tag', 'segment', 'project'].forEach((field) => { if (params[field]) { const parsed = this.parseOperatorValue(field, params[field]); if (parsed) queryParams.push(parsed); } }); return queryParams; }; }