From 67fa28f05a673114e9d85683aa558ff3fa40b6e5 Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Mon, 12 Aug 2024 13:29:24 +0200 Subject: [PATCH] feat: prevent revive flag/flags in archived project (#7826) --- .../feature-toggle/feature-toggle-service.ts | 18 +++++++++ .../tests/feature-toggle-service.e2e.test.ts | 37 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/lib/features/feature-toggle/feature-toggle-service.ts b/src/lib/features/feature-toggle/feature-toggle-service.ts index 59491143db..af76a4dac7 100644 --- a/src/lib/features/feature-toggle/feature-toggle-service.ts +++ b/src/lib/features/feature-toggle/feature-toggle-service.ts @@ -1235,6 +1235,18 @@ class FeatureToggleService { } } + private async validateActiveProject(projectId: string) { + if (this.flagResolver.isEnabled('archiveProjects')) { + const hasActiveProject = + await this.projectStore.hasActiveProject(projectId); + if (!hasActiveProject) { + throw new NotFoundError( + `Active project with id ${projectId} does not exist`, + ); + } + } + } + async createFeatureToggle( projectId: string, value: FeatureToggleDTO, @@ -2058,6 +2070,7 @@ class FeatureToggleService { projectId: string, auditUser: IAuditUser, ): Promise { + await this.validateActiveProject(projectId); await this.validateFeaturesContext(featureNames, projectId); const features = @@ -2091,6 +2104,11 @@ class FeatureToggleService { featureName: string, auditUser: IAuditUser, ): Promise { + const feature = await this.featureToggleStore.get(featureName); + if (!feature) { + throw new NotFoundError(`Feature ${featureName} does not exist`); + } + await this.validateActiveProject(feature.project); const toggle = await this.featureToggleStore.revive(featureName); await this.featureToggleStore.disableAllEnvironmentsForFeatures([ featureName, diff --git a/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts b/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts index 7744afdf49..f71ed10e27 100644 --- a/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts +++ b/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts @@ -773,3 +773,40 @@ test('Should not allow to add flags to archived projects', async () => { ), ); }); + +test('Should not allow to revive flags to archived projects', async () => { + const project = await stores.projectStore.create({ + id: 'archivedProjectWithFlag', + name: 'archivedProjectWithFlag', + }); + const flag = await service.createFeatureToggle( + project.id, + { + name: 'archiveFlag', + }, + TEST_AUDIT_USER, + ); + + await service.archiveToggle( + flag.name, + { email: 'test@example.com' } as User, + TEST_AUDIT_USER, + ); + await stores.projectStore.archive(project.id); + + await expect( + service.reviveFeature(flag.name, TEST_AUDIT_USER), + ).rejects.toEqual( + new NotFoundError( + `Active project with id archivedProjectWithFlag does not exist`, + ), + ); + + await expect( + service.reviveFeatures([flag.name], project.id, TEST_AUDIT_USER), + ).rejects.toEqual( + new NotFoundError( + `Active project with id archivedProjectWithFlag does not exist`, + ), + ); +});