1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-03-27 00:19:39 +01:00

fix: add project filter to feature-toggle-list-builder ()

Adds `forProject` filter to FeatureToggleQueryBuilder
Filters playground results for an array of projects

Closes #
[1-1525](https://linear.app/unleash/issue/1-1525/getting-results-for-all-projects-when-defining-a-single-project-in-the)

Signed-off-by: andreas-unleash <andreas@getunleash.ai>
This commit is contained in:
andreas-unleash 2023-10-19 15:05:56 +03:00 committed by GitHub
parent de237d844d
commit 6760fc0723
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 4 deletions

View File

@ -198,6 +198,10 @@ export default class FeatureToggleStore implements IFeatureToggleStore {
builder.addSelectColumn('df.enabled as parent_enabled');
}
if (featureQuery?.project) {
builder.forProject(featureQuery.project);
}
const rows = await builder.internalQuery.select(
builder.getSelectColumns(),
);

View File

@ -129,7 +129,11 @@ export class FeatureToggleListBuilder {
userId,
);
});
return this;
}
}
forProject = (project: string[]) => {
this.internalQuery.whereIn('features.project', project);
}
}

View File

@ -1,16 +1,22 @@
import dbInit from '../../../../test/e2e/helpers/database-init';
import getLogger from '../../../../test/fixtures/no-logger';
import { FeatureToggleDTO, IFeatureToggleStore } from '../../../types';
import {
FeatureToggleDTO,
IFeatureToggleStore,
IProjectStore,
} from '../../../types';
let stores;
let db;
let featureToggleStore: IFeatureToggleStore;
let projectStore: IProjectStore;
beforeAll(async () => {
getLogger.setMuteError(true);
db = await dbInit('feature_toggle_store_serial', getLogger);
stores = db.stores;
featureToggleStore = stores.featureToggleStore;
projectStore = stores.projectStore;
});
afterAll(async () => {
@ -301,5 +307,24 @@ describe('potentially_stale marking', () => {
expect(potentiallyStale).toBeFalsy();
});
test('it should filter projects for playground', async () => {
await projectStore.create({
id: 'MyProject',
name: 'MyProject',
description: 'MyProject',
});
await featureToggleStore.create('default', { name: 'featureA' });
await featureToggleStore.create('MyProject', { name: 'featureB' });
const playgroundFeatures =
await featureToggleStore.getPlaygroundFeatures({
project: ['MyProject'],
});
expect(playgroundFeatures).toHaveLength(1);
expect(playgroundFeatures[0].project).toBe('MyProject');
});
});
});

View File

@ -101,7 +101,7 @@ export class PlaygroundService {
): Promise<AdvancedPlaygroundFeatureEvaluationResult[]> {
const segments = await this.segmentService.getActive();
let filteredProjects: typeof projects;
let filteredProjects: typeof projects = projects;
if (this.flagResolver.isEnabled('privateProjects')) {
const projectAccess =
await this.privateProjectChecker.getUserAccessibleProjects(