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:
parent
4bacd3e055
commit
fa85e10eac
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
|
||||||
});
|
|
||||||
|
@ -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 =
|
||||||
|
@ -23,7 +23,6 @@ beforeAll(async () => {
|
|||||||
flags: {
|
flags: {
|
||||||
strictSchemaValidation: true,
|
strictSchemaValidation: true,
|
||||||
dependentFeatures: true,
|
dependentFeatures: true,
|
||||||
separateAdminClientApi: true,
|
|
||||||
useLastSeenRefactor: true,
|
useLastSeenRefactor: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -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);
|
|
||||||
});
|
|
||||||
|
@ -27,7 +27,6 @@ beforeAll(async () => {
|
|||||||
dependentFeatures: true,
|
dependentFeatures: true,
|
||||||
playgroundImprovements: true,
|
playgroundImprovements: true,
|
||||||
useLastSeenRefactor: true,
|
useLastSeenRefactor: true,
|
||||||
separateAdminClientApi: true,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user