mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: more powerful feature search by type (#7267)
This commit is contained in:
		
							parent
							
								
									0db5bc193f
								
							
						
					
					
						commit
						2069af427a
					
				@ -75,6 +75,14 @@ export class FeatureSearchService {
 | 
			
		||||
            if (parsed) queryParams.push(parsed);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (params.type) {
 | 
			
		||||
            const parsed = this.parseOperatorValue(
 | 
			
		||||
                'features.type',
 | 
			
		||||
                params.type,
 | 
			
		||||
            );
 | 
			
		||||
            if (parsed) queryParams.push(parsed);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ['tag', 'segment', 'project'].forEach((field) => {
 | 
			
		||||
            if (params[field]) {
 | 
			
		||||
                const parsed = this.parseOperatorValue(field, params[field]);
 | 
			
		||||
 | 
			
		||||
@ -93,7 +93,6 @@ class FeatureSearchStore implements IFeatureSearchStore {
 | 
			
		||||
        {
 | 
			
		||||
            userId,
 | 
			
		||||
            searchParams,
 | 
			
		||||
            type,
 | 
			
		||||
            status,
 | 
			
		||||
            offset,
 | 
			
		||||
            limit,
 | 
			
		||||
@ -175,10 +174,6 @@ class FeatureSearchStore implements IFeatureSearchStore {
 | 
			
		||||
                    'features.description',
 | 
			
		||||
                ]);
 | 
			
		||||
 | 
			
		||||
                if (type) {
 | 
			
		||||
                    query.whereIn('features.type', type);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (status && status.length > 0) {
 | 
			
		||||
                    query.where((builder) => {
 | 
			
		||||
                        for (const [envName, envStatus] of status) {
 | 
			
		||||
 | 
			
		||||
@ -102,10 +102,9 @@ const searchFeaturesWithOffset = async (
 | 
			
		||||
        .expect(expectedCode);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const filterFeaturesByType = async (types: string[], expectedCode = 200) => {
 | 
			
		||||
    const typeParams = types.map((type) => `type[]=${type}`).join('&');
 | 
			
		||||
const filterFeaturesByType = async (typeParams: string, expectedCode = 200) => {
 | 
			
		||||
    return app.request
 | 
			
		||||
        .get(`/api/admin/search/features?${typeParams}`)
 | 
			
		||||
        .get(`/api/admin/search/features?type=${typeParams}`)
 | 
			
		||||
        .expect(expectedCode);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -219,10 +218,9 @@ test('should filter features by type', async () => {
 | 
			
		||||
        type: 'experimental',
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    const { body } = await filterFeaturesByType([
 | 
			
		||||
        'experimental',
 | 
			
		||||
        'kill-switch',
 | 
			
		||||
    ]);
 | 
			
		||||
    const { body } = await filterFeaturesByType(
 | 
			
		||||
        'IS_ANY_OF:experimental,kill-switch',
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    expect(body).toMatchObject({
 | 
			
		||||
        features: [{ name: 'my_feature_b' }],
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ export interface IFeatureSearchParams {
 | 
			
		||||
    segment?: string;
 | 
			
		||||
    createdAt?: string;
 | 
			
		||||
    state?: string;
 | 
			
		||||
    type?: string[];
 | 
			
		||||
    type?: string;
 | 
			
		||||
    tag?: string;
 | 
			
		||||
    status?: string[][];
 | 
			
		||||
    offset: number;
 | 
			
		||||
 | 
			
		||||
@ -37,13 +37,13 @@ export const featureSearchQueryParameters = [
 | 
			
		||||
    {
 | 
			
		||||
        name: 'type',
 | 
			
		||||
        schema: {
 | 
			
		||||
            type: 'array',
 | 
			
		||||
            items: {
 | 
			
		||||
                type: 'string',
 | 
			
		||||
                example: 'release',
 | 
			
		||||
            },
 | 
			
		||||
            type: 'string',
 | 
			
		||||
            example: 'IS:release',
 | 
			
		||||
            pattern:
 | 
			
		||||
                '^(IS|IS_NOT|IS_ANY_OF|IS_NONE_OF):(.*?)(,([a-zA-Z0-9_]+))*$',
 | 
			
		||||
        },
 | 
			
		||||
        description: 'The list of feature types to filter by',
 | 
			
		||||
        description:
 | 
			
		||||
            'The feature flag type to filter by. The type can be specified with an operator. The supported operators are IS, IS_NOT, IS_ANY_OF, IS_NONE_OF.',
 | 
			
		||||
        in: 'query',
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user