From c41f23ae54f18ef401477888d06b48b09e4ab6e5 Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Mon, 16 Oct 2023 08:59:34 +0200 Subject: [PATCH] feat: remove dependency on archive (#5040) --- .../dependent-features-controller.ts | 4 +-- .../dependent-features-service.ts | 28 ++++++++++--------- .../feature-toggle-controller.ts | 10 ++++--- .../feature-toggle/feature-toggle-service.ts | 12 ++++++++ .../admin-api/project/project-archive.ts | 9 +++++- 5 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/lib/features/dependent-features/dependent-features-controller.ts b/src/lib/features/dependent-features/dependent-features-controller.ts index 7b0de412ff..3ee99c9496 100644 --- a/src/lib/features/dependent-features/dependent-features-controller.ts +++ b/src/lib/features/dependent-features/dependent-features-controller.ts @@ -226,8 +226,8 @@ export default class DependentFeaturesController extends Controller { const { child, projectId } = req.params; if (this.config.flagResolver.isEnabled('dependentFeatures')) { - await this.dependentFeaturesService.deleteFeatureDependencies( - child, + await this.dependentFeaturesService.deleteFeaturesDependencies( + [child], projectId, req.user, ); diff --git a/src/lib/features/dependent-features/dependent-features-service.ts b/src/lib/features/dependent-features/dependent-features-service.ts index 3920524d41..9c0f94c64f 100644 --- a/src/lib/features/dependent-features/dependent-features-service.ts +++ b/src/lib/features/dependent-features/dependent-features-service.ts @@ -163,32 +163,34 @@ export class DependentFeaturesService { }); } - async deleteFeatureDependencies( - feature: string, + async deleteFeaturesDependencies( + features: string[], projectId: string, user: User, ): Promise { await this.stopWhenChangeRequestsEnabled(projectId, user); - return this.unprotectedDeleteFeatureDependencies( - feature, + return this.unprotectedDeleteFeaturesDependencies( + features, projectId, extractUsernameFromUser(user), ); } - async unprotectedDeleteFeatureDependencies( - feature: string, + async unprotectedDeleteFeaturesDependencies( + features: string[], projectId: string, user: string, ): Promise { - await this.dependentFeaturesStore.deleteAll([feature]); - await this.eventService.storeEvent({ - type: 'feature-dependencies-removed', - project: projectId, - featureName: feature, - createdBy: user, - }); + await this.dependentFeaturesStore.deleteAll(features); + await this.eventService.storeEvents( + features.map((feature) => ({ + type: 'feature-dependencies-removed', + project: projectId, + featureName: feature, + createdBy: user, + })), + ); } async getParentOptions(feature: string): Promise { diff --git a/src/lib/features/feature-toggle/feature-toggle-controller.ts b/src/lib/features/feature-toggle/feature-toggle-controller.ts index fd62f4044a..04fd67fd8f 100644 --- a/src/lib/features/feature-toggle/feature-toggle-controller.ts +++ b/src/lib/features/feature-toggle/feature-toggle-controller.ts @@ -777,10 +777,12 @@ export default class ProjectFeaturesController extends Controller { res: Response, ): Promise { const { featureName, projectId } = req.params; - await this.featureService.archiveToggle( - featureName, - req.user, - projectId, + await this.startTransaction(async (tx) => + this.transactionalFeatureToggleService(tx).archiveToggle( + featureName, + req.user, + projectId, + ), ); res.status(202).send(); } diff --git a/src/lib/features/feature-toggle/feature-toggle-service.ts b/src/lib/features/feature-toggle/feature-toggle-service.ts index c75b6178ad..dc8796e733 100644 --- a/src/lib/features/feature-toggle/feature-toggle-service.ts +++ b/src/lib/features/feature-toggle/feature-toggle-service.ts @@ -1510,6 +1510,13 @@ class FeatureToggleService { await this.validateNoChildren(featureName); await this.featureToggleStore.archive(featureName); + if (projectId) { + await this.dependentFeaturesService.unprotectedDeleteFeaturesDependencies( + [featureName], + projectId, + createdBy, + ); + } await this.eventService.storeEvent( new FeatureArchivedEvent({ @@ -1551,6 +1558,11 @@ class FeatureToggleService { featureNames, ); await this.featureToggleStore.batchArchive(featureNames); + await this.dependentFeaturesService.unprotectedDeleteFeaturesDependencies( + featureNames, + projectId, + createdBy, + ); await this.eventService.storeEvents( features.map( diff --git a/src/lib/routes/admin-api/project/project-archive.ts b/src/lib/routes/admin-api/project/project-archive.ts index 44c9369e6b..1bcd2a0e44 100644 --- a/src/lib/routes/admin-api/project/project-archive.ts +++ b/src/lib/routes/admin-api/project/project-archive.ts @@ -192,7 +192,14 @@ export default class ProjectArchiveController extends Controller { const { features } = req.body; const { projectId } = req.params; - await this.featureService.archiveToggles(features, req.user, projectId); + await this.startTransaction(async (tx) => + this.transactionalFeatureToggleService(tx).archiveToggles( + features, + req.user, + projectId, + ), + ); + res.status(202).end(); }