1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-09 00:18:00 +01:00
unleash.unleash/src/lib/features/feature-search/feature-search-service.ts
Jaanus Sellin bcb7a803d0
feat: new event search (#7708)
This introduces the new event search API, with paging.
2024-08-02 10:56:42 +03:00

89 lines
2.6 KiB
TypeScript

import type { Logger } from '../../logger';
import type {
IFeatureSearchStore,
IUnleashConfig,
IUnleashStores,
} from '../../types';
import type {
IFeatureSearchParams,
IQueryParam,
} from '../feature-toggle/types/feature-toggle-strategies-store-type';
import { parseSearchOperatorValue } from './search-utils';
export class FeatureSearchService {
private featureSearchStore: IFeatureSearchStore;
private logger: Logger;
constructor(
{ featureSearchStore }: Pick<IUnleashStores, 'featureSearchStore'>,
{ getLogger }: Pick<IUnleashConfig, 'getLogger'>,
) {
this.featureSearchStore = featureSearchStore;
this.logger = getLogger('services/feature-search-service.ts');
}
async search(params: IFeatureSearchParams) {
const queryParams = this.convertToQueryParams(params);
const { features, total } =
await this.featureSearchStore.searchFeatures(
{
...params,
limit: params.limit,
sortBy: params.sortBy || 'createdAt',
},
queryParams,
);
return {
features,
total,
};
}
convertToQueryParams = (params: IFeatureSearchParams): IQueryParam[] => {
const queryParams: IQueryParam[] = [];
if (params.state) {
const parsedState = parseSearchOperatorValue('stale', params.state);
if (parsedState) {
parsedState.values = parsedState.values.map((value) =>
value === 'active' ? 'false' : 'true',
);
queryParams.push(parsedState);
}
}
if (params.createdAt) {
const parsed = parseSearchOperatorValue(
'features.created_at',
params.createdAt,
);
if (parsed) queryParams.push(parsed);
}
if (params.createdBy) {
const parsed = parseSearchOperatorValue(
'users.id',
params.createdBy,
);
if (parsed) queryParams.push(parsed);
}
if (params.type) {
const parsed = parseSearchOperatorValue(
'features.type',
params.type,
);
if (parsed) queryParams.push(parsed);
}
['tag', 'segment', 'project'].forEach((field) => {
if (params[field]) {
const parsed = parseSearchOperatorValue(field, params[field]);
if (parsed) queryParams.push(parsed);
}
});
return queryParams;
};
}