mirror of
https://github.com/Unleash/unleash.git
synced 2025-02-09 00:18:00 +01:00
89 lines
2.6 KiB
TypeScript
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;
|
|
};
|
|
}
|