Skip to content

Commit

Permalink
refactor: remove separate admin api feature flag (#5228)
Browse files Browse the repository at this point in the history
This PR will remove the feature flag to separate the admin and client
api
  • Loading branch information
FredrikOseberg committed Nov 8, 2023
1 parent 4bacd3e commit fa85e10
Show file tree
Hide file tree
Showing 9 changed files with 15 additions and 174 deletions.
1 change: 0 additions & 1 deletion src/lib/__snapshots__/create-config.test.ts.snap
Expand Up @@ -108,7 +108,6 @@ exports[`should create default config 1`] = `
"proPlanAutoCharge": false,
"responseTimeWithAppNameKillSwitch": false,
"scheduledConfigurationChanges": false,
"separateAdminClientApi": false,
"strictSchemaValidation": false,
"useLastSeenRefactor": false,
"variantTypeNumber": false,
Expand Down
Expand Up @@ -161,15 +161,8 @@ export default class FeatureController extends Controller {
private async resolveFeaturesAndSegments(
query?: IFeatureToggleQuery,
): Promise<[FeatureConfigurationClient[], IClientSegment[]]> {
if (this.flagResolver.isEnabled('separateAdminClientApi')) {
return Promise.all([
this.clientFeatureToggleService.getClientFeatures(query),
this.segmentService.getActiveForClient(),
]);
}

return Promise.all([
this.featureToggleService.getClientFeatures(query),
this.clientFeatureToggleService.getClientFeatures(query),
this.segmentService.getActiveForClient(),
]);
}
Expand Down Expand Up @@ -310,13 +303,9 @@ export default class FeatureController extends Controller {
const featureQuery = await this.resolveQuery(req);
const q = { ...featureQuery, namePrefix: name };

let toggles = await this.featureToggleService.getClientFeatures(q);

if (this.flagResolver.isEnabled('separateAdminClientApi')) {
toggles = await this.clientFeatureToggleService.getClientFeatures(
q,
);
}
const toggles = await this.clientFeatureToggleService.getClientFeatures(
q,
);

const toggle = toggles.find((t) => t.name === name);
if (!toggle) {
Expand Down
Expand Up @@ -187,53 +187,3 @@ test('should return correct data structure from /api/client/features', async ()

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);
});
35 changes: 8 additions & 27 deletions src/lib/features/feature-toggle/feature-toggle-service.ts
Expand Up @@ -1048,16 +1048,9 @@ class FeatureToggleService {
async getPlaygroundFeatures(
query?: IFeatureToggleQuery,
): Promise<FeatureConfigurationClient[]> {
// Remove with with feature flag
const [featuresFromClientStore, featuresFromFeatureToggleStore] =
await Promise.all([
await this.clientFeatureToggleStore.getPlayground(query || {}),
await this.featureToggleStore.getPlaygroundFeatures(query),
]);

const features = this.flagResolver.isEnabled('separateAdminClientApi')
? featuresFromFeatureToggleStore
: featuresFromClientStore;
const features = await this.featureToggleStore.getPlaygroundFeatures(
query,
);

return features as FeatureConfigurationClient[];
}
Expand All @@ -1076,23 +1069,11 @@ class FeatureToggleService {
archived: boolean = false,
): Promise<FeatureToggle[]> {
// Remove with with feature flag
const [featuresFromClientStore, featuresFromFeatureToggleStore] =
await Promise.all([
(await this.clientFeatureToggleStore.getAdmin({
featureQuery: query,
userId: userId,
archived: false,
})) as FeatureToggle[],
await this.featureToggleStore.getFeatureToggleList(
query,
userId,
archived,
),
]);

const features = this.flagResolver.isEnabled('separateAdminClientApi')
? featuresFromFeatureToggleStore
: featuresFromClientStore;
const features = await this.featureToggleStore.getFeatureToggleList(
query,
userId,
archived,
);

if (this.flagResolver.isEnabled('privateProjects') && userId) {
const projectAccess =
Expand Down
Expand Up @@ -23,7 +23,6 @@ beforeAll(async () => {
flags: {
strictSchemaValidation: true,
dependentFeatures: true,
separateAdminClientApi: true,
useLastSeenRefactor: true,
},
},
Expand Down
Expand Up @@ -38,7 +38,9 @@ const irrelevantDate = new Date();

beforeAll(async () => {
const config = createTestConfig({
experimental: { flags: { featureNamingPattern: true } },
experimental: {
flags: { featureNamingPattern: true, playgroundImprovements: true },
},
});
db = await dbInit(
'feature_toggle_service_v2_service_serial',
Expand Down Expand Up @@ -690,75 +692,3 @@ test('Should return last seen at per environment', async () => {
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);
});
1 change: 0 additions & 1 deletion src/lib/features/playground/advanced-playground.test.ts
Expand Up @@ -27,7 +27,6 @@ beforeAll(async () => {
dependentFeatures: true,
playgroundImprovements: true,
useLastSeenRefactor: true,
separateAdminClientApi: true,
},
},
},
Expand Down
5 changes: 0 additions & 5 deletions src/lib/types/experimental.ts
Expand Up @@ -31,7 +31,6 @@ export type IFlagKey =
| 'disableMetrics'
| 'useLastSeenRefactor'
| 'banners'
| 'separateAdminClientApi'
| 'disableEnvsOnRevive'
| 'playgroundImprovements'
| 'featureSwitchRefactor'
Expand Down Expand Up @@ -149,10 +148,6 @@ const flags: IFlags = {
process.env.UNLEASH_EXPERIMENTAL_BANNERS,
false,
),
separateAdminClientApi: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_SEPARATE_ADMIN_CLIENT_API,
false,
),
disableEnvsOnRevive: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_DISABLE_ENVS_ON_REVIVE,
false,
Expand Down
1 change: 0 additions & 1 deletion src/server-dev.ts
Expand Up @@ -45,7 +45,6 @@ process.nextTick(async () => {
dependentFeatures: true,
useLastSeenRefactor: true,
disableEnvsOnRevive: true,
separateAdminClientApi: true,
playgroundImprovements: true,
featureSwitchRefactor: true,
featureSearchAPI: true,
Expand Down

0 comments on commit fa85e10

Please sign in to comment.