From 6c11b57c53913f3b4882184e851cd609934e39fe Mon Sep 17 00:00:00 2001 From: Jaanus Date: Tue, 2 Sep 2025 13:55:18 +0300 Subject: [PATCH] fix: remove lifecycle backfill on every startup --- .../EnvironmentChangeRequest.tsx | 1 - .../fake-feature-lifecycle-store.ts | 2 - .../feature-lifecycle-service.ts | 1 - .../feature-lifecycle-store-type.ts | 1 - .../feature-lifecycle-store.ts | 20 ------- .../feature-lifecycle.e2e.test.ts | 52 ------------------- 6 files changed, 77 deletions(-) diff --git a/frontend/src/component/changeRequest/ChangeRequestSidebar/EnvironmentChangeRequest/EnvironmentChangeRequest.tsx b/frontend/src/component/changeRequest/ChangeRequestSidebar/EnvironmentChangeRequest/EnvironmentChangeRequest.tsx index a664468645..bd0d6d29f4 100644 --- a/frontend/src/component/changeRequest/ChangeRequestSidebar/EnvironmentChangeRequest/EnvironmentChangeRequest.tsx +++ b/frontend/src/component/changeRequest/ChangeRequestSidebar/EnvironmentChangeRequest/EnvironmentChangeRequest.tsx @@ -12,7 +12,6 @@ import type { ChangeRequestType } from '../../changeRequest.types'; import { Link } from 'react-router-dom'; import { ChangeRequestStatusBadge } from '../../ChangeRequestStatusBadge/ChangeRequestStatusBadge.tsx'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; -import { changesCount } from '../../changesCount.js'; import { Separator, StyledFlexAlignCenterBox, diff --git a/src/lib/features/feature-lifecycle/fake-feature-lifecycle-store.ts b/src/lib/features/feature-lifecycle/fake-feature-lifecycle-store.ts index 5b5ea414f0..48f352589e 100644 --- a/src/lib/features/feature-lifecycle/fake-feature-lifecycle-store.ts +++ b/src/lib/features/feature-lifecycle/fake-feature-lifecycle-store.ts @@ -26,8 +26,6 @@ export class FakeFeatureLifecycleStore implements IFeatureLifecycleStore { return results.filter((result) => result !== null) as NewStage[]; } - async backfill() {} - private async insertOne( featureLifecycleStage: FeatureLifecycleStage, ): Promise { diff --git a/src/lib/features/feature-lifecycle/feature-lifecycle-service.ts b/src/lib/features/feature-lifecycle/feature-lifecycle-service.ts index d048c7b25c..ad8969603e 100644 --- a/src/lib/features/feature-lifecycle/feature-lifecycle-service.ts +++ b/src/lib/features/feature-lifecycle/feature-lifecycle-service.ts @@ -82,7 +82,6 @@ export class FeatureLifecycleService { } listen() { - this.featureLifecycleStore.backfill(); this.eventStore.on(FEATURE_CREATED, async (event) => { await this.featureInitialized(event.featureName); }); diff --git a/src/lib/features/feature-lifecycle/feature-lifecycle-store-type.ts b/src/lib/features/feature-lifecycle/feature-lifecycle-store-type.ts index 78bfdbcce7..b66abea99b 100644 --- a/src/lib/features/feature-lifecycle/feature-lifecycle-store-type.ts +++ b/src/lib/features/feature-lifecycle/feature-lifecycle-store-type.ts @@ -25,5 +25,4 @@ export interface IFeatureLifecycleStore { delete(feature: string): Promise; deleteAll(): Promise; deleteStage(stage: FeatureLifecycleStage): Promise; - backfill(): Promise; } diff --git a/src/lib/features/feature-lifecycle/feature-lifecycle-store.ts b/src/lib/features/feature-lifecycle/feature-lifecycle-store.ts index b5e0b2382c..f113824b08 100644 --- a/src/lib/features/feature-lifecycle/feature-lifecycle-store.ts +++ b/src/lib/features/feature-lifecycle/feature-lifecycle-store.ts @@ -37,26 +37,6 @@ export class FeatureLifecycleStore implements IFeatureLifecycleStore { }); } - async backfill(): Promise { - const stopTimer = this.timer('backfill'); - await this.db.raw(` - INSERT INTO feature_lifecycles (feature, stage, created_at) - SELECT features.name, 'initial', features.created_at - FROM features - LEFT JOIN feature_lifecycles ON features.name = feature_lifecycles.feature - WHERE feature_lifecycles.feature IS NULL - `); - await this.db.raw(` - INSERT INTO feature_lifecycles (feature, stage, created_at) - SELECT features.name, 'archived', features.archived_at - FROM features - LEFT JOIN feature_lifecycles ON features.name = feature_lifecycles.feature AND feature_lifecycles.stage = 'archived' - WHERE features.archived_at IS NOT NULL - AND feature_lifecycles.feature IS NULL - `); - stopTimer(); - } - async insert( featureLifecycleStages: FeatureLifecycleStage[], ): Promise { diff --git a/src/lib/features/feature-lifecycle/feature-lifecycle.e2e.test.ts b/src/lib/features/feature-lifecycle/feature-lifecycle.e2e.test.ts index 9fad7ac948..ef19c39edd 100644 --- a/src/lib/features/feature-lifecycle/feature-lifecycle.e2e.test.ts +++ b/src/lib/features/feature-lifecycle/feature-lifecycle.e2e.test.ts @@ -211,55 +211,3 @@ test('should be able to toggle between completed/uncompleted', async () => { expect(body).toEqual([]); }); - -test('should backfill intialized feature', async () => { - await app.createFeature('my_feature_c'); - await featureLifecycleStore.delete('my_feature_c'); - - await featureLifecycleStore.backfill(); - - const { body } = await getFeatureLifecycle('my_feature_c'); - expect(body).toEqual([ - { stage: 'initial', enteredStageAt: expect.any(String) }, - ]); -}); - -test('should backfill archived feature', async () => { - await app.createFeature('my_feature_d'); - await app.archiveFeature('my_feature_d'); - await featureLifecycleStore.delete('my_feature_d'); - - await featureLifecycleStore.backfill(); - - const { body } = await getFeatureLifecycle('my_feature_d'); - expect(body).toEqual([ - { stage: 'initial', enteredStageAt: expect.any(String) }, - { stage: 'archived', enteredStageAt: expect.any(String) }, - ]); -}); - -test('should not backfill for existing lifecycle', async () => { - const environment = 'production'; // prod environment moves lifecycle to live stage - await app.createFeature('my_feature_e'); - await app.enableFeature('my_feature_e', environment); - eventStore.emit(FEATURE_CREATED, { featureName: 'my_feature_e' }); - eventBus.emit(CLIENT_METRICS_ADDED, [ - { - featureName: 'my_feature_e', - environment: environment, - }, - ]); - await reachedStage('my_feature_e', 'live'); - - await featureLifecycleStore.backfill(); - - const { body } = await getFeatureLifecycle('my_feature_e'); - expect(body).toEqual( - expect.arrayContaining([ - { stage: 'initial', enteredStageAt: expect.any(String) }, - { stage: 'pre-live', enteredStageAt: expect.any(String) }, - { stage: 'live', enteredStageAt: expect.any(String) }, - ]), - ); - expect(body).toHaveLength(3); -});