1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-07-31 13:47:02 +02:00

refactor: remove separate admin api feature flag (#5228)

This PR will remove the feature flag to separate the admin and client
api
This commit is contained in:
Fredrik Strand Oseberg 2023-11-08 12:24:11 +01:00 committed by GitHub
parent 4bacd3e055
commit fa85e10eac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 15 additions and 174 deletions

View File

@ -108,7 +108,6 @@ exports[`should create default config 1`] = `
"proPlanAutoCharge": false, "proPlanAutoCharge": false,
"responseTimeWithAppNameKillSwitch": false, "responseTimeWithAppNameKillSwitch": false,
"scheduledConfigurationChanges": false, "scheduledConfigurationChanges": false,
"separateAdminClientApi": false,
"strictSchemaValidation": false, "strictSchemaValidation": false,
"useLastSeenRefactor": false, "useLastSeenRefactor": false,
"variantTypeNumber": false, "variantTypeNumber": false,

View File

@ -161,15 +161,8 @@ export default class FeatureController extends Controller {
private async resolveFeaturesAndSegments( private async resolveFeaturesAndSegments(
query?: IFeatureToggleQuery, query?: IFeatureToggleQuery,
): Promise<[FeatureConfigurationClient[], IClientSegment[]]> { ): Promise<[FeatureConfigurationClient[], IClientSegment[]]> {
if (this.flagResolver.isEnabled('separateAdminClientApi')) {
return Promise.all([
this.clientFeatureToggleService.getClientFeatures(query),
this.segmentService.getActiveForClient(),
]);
}
return Promise.all([ return Promise.all([
this.featureToggleService.getClientFeatures(query), this.clientFeatureToggleService.getClientFeatures(query),
this.segmentService.getActiveForClient(), this.segmentService.getActiveForClient(),
]); ]);
} }
@ -310,13 +303,9 @@ export default class FeatureController extends Controller {
const featureQuery = await this.resolveQuery(req); const featureQuery = await this.resolveQuery(req);
const q = { ...featureQuery, namePrefix: name }; const q = { ...featureQuery, namePrefix: name };
let toggles = await this.featureToggleService.getClientFeatures(q); const toggles = await this.clientFeatureToggleService.getClientFeatures(
q,
if (this.flagResolver.isEnabled('separateAdminClientApi')) { );
toggles = await this.clientFeatureToggleService.getClientFeatures(
q,
);
}
const toggle = toggles.find((t) => t.name === name); const toggle = toggles.find((t) => t.name === name);
if (!toggle) { if (!toggle) {

View File

@ -187,53 +187,3 @@ test('should return correct data structure from /api/client/features', async ()
expect(result.body.features).toEqual(apiClientResponse); expect(result.body.features).toEqual(apiClientResponse);
}); });
test('should return correct data structure from /api/client/features | separateAdminClientApi', async () => {
const appWithFeatureFlag = await setupAppWithCustomConfig(
db.stores,
{
experimental: {
flags: {
strictSchemaValidation: true,
dependentFeatures: true,
separateAdminClientApi: true,
},
},
},
db.rawDatabase,
);
await db.rawDatabase.raw('DELETE FROM features');
await appWithFeatureFlag.createFeature('test1', 'default');
await appWithFeatureFlag.createFeature('test2', 'default');
await appWithFeatureFlag.addStrategyToFeatureEnv(
{
name: 'flexibleRollout',
constraints: [],
parameters: { rollout: '100' },
},
DEFAULT_ENV,
'test1',
);
await appWithFeatureFlag.addStrategyToFeatureEnv(
{
name: 'default',
constraints: [
{ contextName: 'userId', operator: 'IN', values: ['123'] },
],
parameters: {},
},
DEFAULT_ENV,
'test2',
);
const result = await appWithFeatureFlag.request
.get('/api/client/features')
.expect('Content-Type', /json/)
.expect(200);
expect(result.body.features).toEqual(apiClientResponse);
});

View File

@ -1048,16 +1048,9 @@ class FeatureToggleService {
async getPlaygroundFeatures( async getPlaygroundFeatures(
query?: IFeatureToggleQuery, query?: IFeatureToggleQuery,
): Promise<FeatureConfigurationClient[]> { ): Promise<FeatureConfigurationClient[]> {
// Remove with with feature flag const features = await this.featureToggleStore.getPlaygroundFeatures(
const [featuresFromClientStore, featuresFromFeatureToggleStore] = query,
await Promise.all([ );
await this.clientFeatureToggleStore.getPlayground(query || {}),
await this.featureToggleStore.getPlaygroundFeatures(query),
]);
const features = this.flagResolver.isEnabled('separateAdminClientApi')
? featuresFromFeatureToggleStore
: featuresFromClientStore;
return features as FeatureConfigurationClient[]; return features as FeatureConfigurationClient[];
} }
@ -1076,23 +1069,11 @@ class FeatureToggleService {
archived: boolean = false, archived: boolean = false,
): Promise<FeatureToggle[]> { ): Promise<FeatureToggle[]> {
// Remove with with feature flag // Remove with with feature flag
const [featuresFromClientStore, featuresFromFeatureToggleStore] = const features = await this.featureToggleStore.getFeatureToggleList(
await Promise.all([ query,
(await this.clientFeatureToggleStore.getAdmin({ userId,
featureQuery: query, archived,
userId: userId, );
archived: false,
})) as FeatureToggle[],
await this.featureToggleStore.getFeatureToggleList(
query,
userId,
archived,
),
]);
const features = this.flagResolver.isEnabled('separateAdminClientApi')
? featuresFromFeatureToggleStore
: featuresFromClientStore;
if (this.flagResolver.isEnabled('privateProjects') && userId) { if (this.flagResolver.isEnabled('privateProjects') && userId) {
const projectAccess = const projectAccess =

View File

@ -23,7 +23,6 @@ beforeAll(async () => {
flags: { flags: {
strictSchemaValidation: true, strictSchemaValidation: true,
dependentFeatures: true, dependentFeatures: true,
separateAdminClientApi: true,
useLastSeenRefactor: true, useLastSeenRefactor: true,
}, },
}, },

View File

@ -38,7 +38,9 @@ const irrelevantDate = new Date();
beforeAll(async () => { beforeAll(async () => {
const config = createTestConfig({ const config = createTestConfig({
experimental: { flags: { featureNamingPattern: true } }, experimental: {
flags: { featureNamingPattern: true, playgroundImprovements: true },
},
}); });
db = await dbInit( db = await dbInit(
'feature_toggle_service_v2_service_serial', 'feature_toggle_service_v2_service_serial',
@ -690,75 +692,3 @@ test('Should return last seen at per environment', async () => {
new Date(lastSeenAtStoreDate), new Date(lastSeenAtStoreDate),
); );
}); });
test('Should return same object for /api/admin/features | separateAdminClientApi', async () => {
const featureName = 'same-object-for-features';
const projectId = 'default';
const userName = 'same-object-user';
await service.createFeatureToggle(
projectId,
{
name: featureName,
},
userName,
);
const data = await service.getFeatureToggles();
// Test with feature flag on
const config = createTestConfig({
experimental: { flags: { useLastSeenRefactor: true } },
});
const featureService = await createFeatureToggleService(
db.rawDatabase,
config,
);
const toggledData = await featureService.getFeatureToggles();
const foundToggleOne = data.find((feature) => feature.name === featureName);
const foundToggleTwo = toggledData.find(
(feature) => feature.name === featureName,
);
expect(foundToggleOne).toEqual(foundToggleTwo);
});
test('Should return same object for playground | separateAdminClientApi', async () => {
const featureName = 'same-object-for-playground';
const projectId = 'default';
const userName = 'same-object-user-playground';
await service.createFeatureToggle(
projectId,
{
name: featureName,
},
userName,
);
const data = await service.getPlaygroundFeatures();
// Test with feature flag on
const config = createTestConfig({
experimental: { flags: { useLastSeenRefactor: true } },
});
const featureService = await createFeatureToggleService(
db.rawDatabase,
config,
);
const toggledData = await featureService.getPlaygroundFeatures();
const foundToggleOne = data.find((feature) => feature.name === featureName);
const foundToggleTwo = toggledData.find(
(feature) => feature.name === featureName,
);
expect(foundToggleOne).toEqual(foundToggleTwo);
});

View File

@ -27,7 +27,6 @@ beforeAll(async () => {
dependentFeatures: true, dependentFeatures: true,
playgroundImprovements: true, playgroundImprovements: true,
useLastSeenRefactor: true, useLastSeenRefactor: true,
separateAdminClientApi: true,
}, },
}, },
}, },

View File

@ -31,7 +31,6 @@ export type IFlagKey =
| 'disableMetrics' | 'disableMetrics'
| 'useLastSeenRefactor' | 'useLastSeenRefactor'
| 'banners' | 'banners'
| 'separateAdminClientApi'
| 'disableEnvsOnRevive' | 'disableEnvsOnRevive'
| 'playgroundImprovements' | 'playgroundImprovements'
| 'featureSwitchRefactor' | 'featureSwitchRefactor'
@ -149,10 +148,6 @@ const flags: IFlags = {
process.env.UNLEASH_EXPERIMENTAL_BANNERS, process.env.UNLEASH_EXPERIMENTAL_BANNERS,
false, false,
), ),
separateAdminClientApi: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_SEPARATE_ADMIN_CLIENT_API,
false,
),
disableEnvsOnRevive: parseEnvVarBoolean( disableEnvsOnRevive: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_DISABLE_ENVS_ON_REVIVE, process.env.UNLEASH_EXPERIMENTAL_DISABLE_ENVS_ON_REVIVE,
false, false,

View File

@ -45,7 +45,6 @@ process.nextTick(async () => {
dependentFeatures: true, dependentFeatures: true,
useLastSeenRefactor: true, useLastSeenRefactor: true,
disableEnvsOnRevive: true, disableEnvsOnRevive: true,
separateAdminClientApi: true,
playgroundImprovements: true, playgroundImprovements: true,
featureSwitchRefactor: true, featureSwitchRefactor: true,
featureSearchAPI: true, featureSearchAPI: true,