diff --git a/src/lib/services/project-service.ts b/src/lib/services/project-service.ts index 02ddceda73..81a5441732 100644 --- a/src/lib/services/project-service.ts +++ b/src/lib/services/project-service.ts @@ -390,6 +390,17 @@ export default class ProjectService { ); } + const archivedToggles = await this.featureToggleStore.getAll({ + project: id, + archived: true, + }); + + this.featureToggleService.deleteFeatures( + archivedToggles.map((toggle) => toggle.name), + id, + user.name, + ); + await this.projectStore.delete(id); await this.eventService.storeEvent({ diff --git a/src/test/e2e/services/project-service.e2e.test.ts b/src/test/e2e/services/project-service.e2e.test.ts index 821b1f7bbd..281a350244 100644 --- a/src/test/e2e/services/project-service.e2e.test.ts +++ b/src/test/e2e/services/project-service.e2e.test.ts @@ -1814,3 +1814,44 @@ describe('feature flag naming patterns', () => { expect(updatedProject.featureNaming!.description).toBeFalsy(); }); }); + +test('deleting a project with archived toggles should result in any remaining archived toggles being deleted', async () => { + const project = { + id: 'project-with-archived-toggles', + name: 'project-with-archived-toggles', + }; + const toggleName = 'archived-and-deleted'; + + await projectService.createProject(project, user.id); + + await stores.featureToggleStore.create(project.id, { + name: toggleName, + project: project.id, + enabled: false, + defaultStickiness: 'default', + }); + + await stores.featureToggleStore.archive(toggleName); + await projectService.deleteProject(project.id, user); + + // bring the project back again, previously this would allow those archived toggles to be resurrected + // we now expect them to be deleted correctly + await projectService.createProject(project, user.id); + + const toggles = await stores.featureToggleStore.getAll({ + project: project.id, + archived: true, + }); + + expect(toggles.find((t) => t.name === toggleName)).toBeUndefined(); +}); + +test('deleting a project with no archived toggles should not result in an error', async () => { + const project = { + id: 'project-with-nothing', + name: 'project-with-nothing', + }; + + await projectService.createProject(project, user.id); + await projectService.deleteProject(project.id, user); +});