2023-10-25 15:18:52 +02:00
|
|
|
import { Logger } from '../../logger';
|
|
|
|
import {
|
|
|
|
IFeatureStrategiesStore,
|
|
|
|
IUnleashConfig,
|
|
|
|
IUnleashStores,
|
2023-10-31 14:10:31 +01:00
|
|
|
serializeDates,
|
2023-10-25 15:18:52 +02:00
|
|
|
} from '../../types';
|
2023-11-24 09:45:44 +01:00
|
|
|
import {
|
|
|
|
IFeatureSearchParams,
|
|
|
|
IQueryOperator,
|
|
|
|
IQueryParam,
|
|
|
|
} from '../feature-toggle/types/feature-toggle-strategies-store-type';
|
2023-10-25 15:18:52 +02:00
|
|
|
|
|
|
|
export class FeatureSearchService {
|
|
|
|
private featureStrategiesStore: IFeatureStrategiesStore;
|
|
|
|
private logger: Logger;
|
|
|
|
constructor(
|
|
|
|
{
|
|
|
|
featureStrategiesStore,
|
|
|
|
}: Pick<IUnleashStores, 'featureStrategiesStore'>,
|
|
|
|
{ getLogger }: Pick<IUnleashConfig, 'getLogger'>,
|
|
|
|
) {
|
|
|
|
this.featureStrategiesStore = featureStrategiesStore;
|
|
|
|
this.logger = getLogger('services/feature-search-service.ts');
|
|
|
|
}
|
|
|
|
|
2023-10-26 15:29:30 +02:00
|
|
|
async search(params: IFeatureSearchParams) {
|
2023-11-24 09:45:44 +01:00
|
|
|
const queryParams = this.convertToQueryParams(params);
|
2023-11-01 09:19:42 +01:00
|
|
|
const { features, total } =
|
2023-11-24 09:45:44 +01:00
|
|
|
await this.featureStrategiesStore.searchFeatures(
|
|
|
|
{
|
|
|
|
...params,
|
|
|
|
limit: params.limit,
|
|
|
|
},
|
|
|
|
queryParams,
|
|
|
|
);
|
2023-10-25 15:18:52 +02:00
|
|
|
|
2023-10-31 14:10:31 +01:00
|
|
|
return {
|
2023-11-08 10:12:42 +01:00
|
|
|
features,
|
2023-11-01 09:19:42 +01:00
|
|
|
total,
|
2023-10-31 14:10:31 +01:00
|
|
|
};
|
2023-10-25 15:18:52 +02:00
|
|
|
}
|
2023-11-24 09:45:44 +01:00
|
|
|
|
|
|
|
parseOperatorValue = (field: string, value: string): IQueryParam | null => {
|
2023-11-27 14:48:41 +01:00
|
|
|
const pattern =
|
2023-12-06 11:53:51 +01:00
|
|
|
/^(IS|IS_NOT|IS_ANY_OF|IS_NONE_OF|INCLUDE|DO_NOT_INCLUDE|INCLUDE_ALL_OF|INCLUDE_ANY_OF|EXCLUDE_IF_ANY_OF|EXCLUDE_ALL|IS_BEFORE|IS_ON_OR_AFTER):(.+)$/;
|
2023-11-24 09:45:44 +01:00
|
|
|
const match = value.match(pattern);
|
|
|
|
|
|
|
|
if (match) {
|
|
|
|
return {
|
|
|
|
field,
|
|
|
|
operator: match[1] as IQueryOperator,
|
2023-11-27 14:48:41 +01:00
|
|
|
values: match[2].split(','),
|
2023-11-24 09:45:44 +01:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
};
|
|
|
|
|
|
|
|
convertToQueryParams = (params: IFeatureSearchParams): IQueryParam[] => {
|
|
|
|
const queryParams: IQueryParam[] = [];
|
|
|
|
|
2023-11-29 14:22:42 +01:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-30 11:00:39 +01:00
|
|
|
if (params.createdAt) {
|
|
|
|
const parsed = this.parseOperatorValue(
|
|
|
|
'features.created_at',
|
|
|
|
params.createdAt,
|
|
|
|
);
|
|
|
|
if (parsed) queryParams.push(parsed);
|
|
|
|
}
|
|
|
|
|
2023-11-29 09:40:25 +01:00
|
|
|
['tag', 'segment', 'project'].forEach((field) => {
|
2023-11-27 14:48:41 +01:00
|
|
|
if (params[field]) {
|
2023-11-29 09:40:25 +01:00
|
|
|
const parsed = this.parseOperatorValue(field, params[field]);
|
|
|
|
if (parsed) queryParams.push(parsed);
|
2023-11-27 14:48:41 +01:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2023-11-24 09:45:44 +01:00
|
|
|
return queryParams;
|
|
|
|
};
|
2023-10-25 15:18:52 +02:00
|
|
|
}
|