diff --git a/src/lib/features/feature-toggle/feature-toggle-service.ts b/src/lib/features/feature-toggle/feature-toggle-service.ts index a8c1429f48..b7a1edd6ab 100644 --- a/src/lib/features/feature-toggle/feature-toggle-service.ts +++ b/src/lib/features/feature-toggle/feature-toggle-service.ts @@ -790,12 +790,35 @@ class FeatureToggleService { auditUser: IAuditUser, user?: IUser, ): Promise { + if (this.flagResolver.isEnabled('simplifyDisableFeature')) { + const strategies = + await this.featureStrategiesStore.getStrategiesForFeatureEnv( + projectId, + featureName, + environment, + ); + const hasOnlyDisabledStrategies = strategies.every( + (strategy) => strategy.disabled, + ); + if (hasOnlyDisabledStrategies) { + await this.unprotectedUpdateEnabled( + projectId, + featureName, + environment, + false, + auditUser, + user, + ); + } + return; + } const feature = await this.getFeature({ featureName }); const env = feature.environments.find((e) => e.name === environment); const hasOnlyDisabledStrategies = env?.strategies.every( (strategy) => strategy.disabled, ); + if (hasOnlyDisabledStrategies) { await this.unprotectedUpdateEnabled( projectId, @@ -1090,6 +1113,7 @@ class FeatureToggleService { userId, archived, ); + return { ...result, dependencies, diff --git a/src/lib/features/feature-toggle/tests/feature-toggle-service.limit.test.ts b/src/lib/features/feature-toggle/tests/feature-toggle-service.limit.test.ts index 210a6fcc5d..38796819da 100644 --- a/src/lib/features/feature-toggle/tests/feature-toggle-service.limit.test.ts +++ b/src/lib/features/feature-toggle/tests/feature-toggle-service.limit.test.ts @@ -143,7 +143,11 @@ describe('Strategy limits', () => { { constraints: newConstraints, }, - { projectId: 'default', featureName: 'feature' } as any, + { + projectId: 'default', + featureName: 'feature', + environment: 'default', + }, {} as IAuditUser, ); @@ -246,7 +250,11 @@ describe('Strategy limits', () => { { constraints: constraints(valueCount), }, - { projectId: 'default', featureName: 'feature' } as any, + { + projectId: 'default', + featureName: 'feature', + environment: 'default', + }, {} as IAuditUser, ); diff --git a/src/lib/types/experimental.ts b/src/lib/types/experimental.ts index 2e97f6c50f..874daf5262 100644 --- a/src/lib/types/experimental.ts +++ b/src/lib/types/experimental.ts @@ -66,7 +66,8 @@ export type IFlagKey = | 'dataUsageMultiMonthView' | 'consumptionModel' | 'teamsIntegrationChangeRequests' - | 'edgeObservability'; + | 'edgeObservability' + | 'simplifyDisableFeature'; export type IFlags = Partial<{ [key in IFlagKey]: boolean | Variant }>; @@ -319,6 +320,10 @@ const flags: IFlags = { process.env.EXPERIMENTAL_EDGE_OBSERVABILITY, false, ), + simplifyDisableFeature: parseEnvVarBoolean( + process.env.EXPERIMENTAL_SIMPLIFY_DISABLE_FEATURE, + false, + ), }; export const defaultExperimentalOptions: IExperimentalOptions = { diff --git a/src/server-dev.ts b/src/server-dev.ts index 77a3e58f32..446f9ed61c 100644 --- a/src/server-dev.ts +++ b/src/server-dev.ts @@ -60,6 +60,7 @@ process.nextTick(async () => { dataUsageMultiMonthView: true, filterExistingFlagNames: true, teamsIntegrationChangeRequests: true, + simplifyDisableFeature: true, }, }, authentication: {