From 0819b2cf3270b2ca30347ec58f5493336b281c5d Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Tue, 3 Jun 2025 13:47:24 +0200 Subject: [PATCH] chore: remove link flags (#10076) --- .../FeatureOverviewMetaData.tsx | 15 ++++-------- .../ProjectEnterpriseSettingsForm.tsx | 13 ++++------- frontend/src/interfaces/uiConfig.ts | 2 -- .../export-import-service.ts | 8 ++----- .../feature-links/feature-link-controller.ts | 9 -------- .../feature-toggle/feature-toggle-service.ts | 8 +------ .../tests/feature-toggle-service.e2e.test.ts | 7 +----- .../project/project-store.e2e.test.ts | 8 +------ src/lib/features/project/project-store.ts | 23 +++---------------- src/lib/metrics.ts | 5 +--- src/lib/types/experimental.ts | 10 -------- src/server-dev.ts | 2 -- 12 files changed, 18 insertions(+), 92 deletions(-) diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx index 1e6299de78..85a5f27509 100644 --- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx @@ -27,7 +27,6 @@ import type { IFeatureToggle, } from '../../../../../interfaces/featureToggle.ts'; import AddIcon from '@mui/icons-material/Add'; -import { useUiFlag } from 'hooks/useUiFlag'; import { Badge } from 'component/common/Badge/Badge'; import LinkIcon from '@mui/icons-material/Link'; import { UPDATE_FEATURE } from '../../../../providers/AccessProvider/permissions.ts'; @@ -246,17 +245,13 @@ const FeatureOverviewMetaData: FC = ({ const showDependentFeatures = useShowDependentFeatures(project); - const featureLinksEnabled = useUiFlag('featureLinks'); - return ( <> - {featureLinksEnabled ? ( - - ) : null} +
Flag details diff --git a/frontend/src/component/project/Project/ProjectEnterpriseSettingsForm/ProjectEnterpriseSettingsForm.tsx b/frontend/src/component/project/Project/ProjectEnterpriseSettingsForm/ProjectEnterpriseSettingsForm.tsx index 2e2a26eb9d..a0b2b4c7a0 100644 --- a/frontend/src/component/project/Project/ProjectEnterpriseSettingsForm/ProjectEnterpriseSettingsForm.tsx +++ b/frontend/src/component/project/Project/ProjectEnterpriseSettingsForm/ProjectEnterpriseSettingsForm.tsx @@ -12,7 +12,6 @@ import Input from 'component/common/Input/Input'; import { FeatureFlagNamingTooltip } from './FeatureFlagNamingTooltip.tsx'; import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; import type { ProjectLinkTemplateSchema } from 'openapi'; -import { useUiFlag } from 'hooks/useUiFlag'; import ProjectLinkTemplates from './ProjectLinkTemplates/ProjectLinkTemplates.tsx'; interface IProjectEnterpriseSettingsForm { @@ -155,8 +154,6 @@ const ProjectEnterpriseSettingsForm: React.FC< { key: 'private', label: 'private' }, ]; - const projectLinkTemplatesEnabled = useUiFlag('projectLinkTemplates'); - useEffect(() => { setPreviousPattern(featureNamingPattern || ''); }, [projectId]); @@ -354,12 +351,10 @@ The flag name should contain the project name, the feature name, and the ticket /> - {projectLinkTemplatesEnabled && ( - - )} + {children} diff --git a/frontend/src/interfaces/uiConfig.ts b/frontend/src/interfaces/uiConfig.ts index 3a6273a936..0482c226c8 100644 --- a/frontend/src/interfaces/uiConfig.ts +++ b/frontend/src/interfaces/uiConfig.ts @@ -88,8 +88,6 @@ export type UiFlags = { edgeObservability?: boolean; addEditStrategy?: boolean; registerFrontendClient?: boolean; - featureLinks?: boolean; - projectLinkTemplates?: boolean; customMetrics?: boolean; lifecycleMetrics?: boolean; sideMenuCleanup?: boolean; diff --git a/src/lib/features/export-import-toggles/export-import-service.ts b/src/lib/features/export-import-toggles/export-import-service.ts index ae91ad79fd..fead2ae9e7 100644 --- a/src/lib/features/export-import-toggles/export-import-service.ts +++ b/src/lib/features/export-import-toggles/export-import-service.ts @@ -303,9 +303,7 @@ export default class ExportImportService await this.importTagTypes(dto, auditUser); await this.importTags(dto, auditUser); await this.importContextFields(dto, auditUser); - if (this.flagResolver.isEnabled('featureLinks')) { - await this.importLinks(dto, auditUser); - } + await this.importLinks(dto, auditUser); } async import( @@ -924,9 +922,7 @@ export default class ExportImportService this.segmentReadModel.getAll(), this.tagTypeStore.getAll(), this.dependentFeaturesReadModel.getDependencies(featureNames), - this.flagResolver.isEnabled('featureLinks') - ? this.featureLinksReadModel.getLinks(...featureNames) - : Promise.resolve([]), + this.featureLinksReadModel.getLinks(...featureNames), ]); this.addSegmentsToStrategies(featureStrategies, strategySegments); const filteredContextFields = contextFields diff --git a/src/lib/features/feature-links/feature-link-controller.ts b/src/lib/features/feature-links/feature-link-controller.ts index 03f978dba7..1b26afbd6b 100644 --- a/src/lib/features/feature-links/feature-link-controller.ts +++ b/src/lib/features/feature-links/feature-link-controller.ts @@ -108,9 +108,6 @@ export default class FeatureLinkController extends Controller { >, res: Response, ): Promise { - if (!this.flagResolver.isEnabled('featureLinks')) { - res.status(404).end(); - } const { projectId, featureName } = req.params; await this.transactionalFeatureLinkService.transactional((service) => @@ -132,9 +129,6 @@ export default class FeatureLinkController extends Controller { >, res: Response, ): Promise { - if (!this.flagResolver.isEnabled('featureLinks')) { - res.status(404).end(); - } const { projectId, linkId, featureName } = req.params; await this.transactionalFeatureLinkService.transactional((service) => @@ -156,9 +150,6 @@ export default class FeatureLinkController extends Controller { >, res: Response, ): Promise { - if (!this.flagResolver.isEnabled('featureLinks')) { - res.status(404).end(); - } const { projectId, linkId } = req.params; await this.transactionalFeatureLinkService.transactional((service) => diff --git a/src/lib/features/feature-toggle/feature-toggle-service.ts b/src/lib/features/feature-toggle/feature-toggle-service.ts index 7d4c483c66..91a10e207f 100644 --- a/src/lib/features/feature-toggle/feature-toggle-service.ts +++ b/src/lib/features/feature-toggle/feature-toggle-service.ts @@ -1114,9 +1114,7 @@ export class FeatureToggleService { this.featureCollaboratorsReadModel.getFeatureCollaborators( featureName, ), - this.flagResolver.isEnabled('featureLinks') - ? this.featureLinksReadModel.getLinks(featureName) - : Promise.resolve([]), + this.featureLinksReadModel.getLinks(featureName), ]); if (environmentVariants) { @@ -2559,10 +2557,6 @@ export class FeatureToggleService { featureName: string, auditUser: IAuditUser, ) { - if (!this.flagResolver.isEnabled('projectLinkTemplates')) { - return; - } - const featureLinksFromTemplates = ( await this.projectStore.getProjectLinkTemplates(projectId) ).map((template) => ({ 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 d230bab586..985f8174f0 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 @@ -59,18 +59,13 @@ const mockConstraints = (): IConstraint[] => { const irrelevantDate = new Date(); beforeAll(async () => { - const flags = { - featureLinks: true, - projectLinkTemplates: true, - }; - const config = createTestConfig({ experimental: { flags } }); + const config = createTestConfig(); db = await dbInit( 'feature_toggle_service_v2_service_serial', config.getLogger, { dbInitMethod: 'legacy' as const, - experimental: { flags }, }, ); unleashConfig = config; diff --git a/src/lib/features/project/project-store.e2e.test.ts b/src/lib/features/project/project-store.e2e.test.ts index b34c7c4dac..67d521335c 100644 --- a/src/lib/features/project/project-store.e2e.test.ts +++ b/src/lib/features/project/project-store.e2e.test.ts @@ -13,13 +13,7 @@ let projectStore: IProjectStore; let environmentStore: IEnvironmentStore; beforeAll(async () => { - db = await dbInit('project_store_serial', getLogger, { - experimental: { - flags: { - projectLinkTemplates: true, - }, - }, - }); + db = await dbInit('project_store_serial', getLogger); stores = db.stores; projectStore = stores.projectStore; environmentStore = stores.environmentStore; diff --git a/src/lib/features/project/project-store.ts b/src/lib/features/project/project-store.ts index 4209d86e24..7cf575e9be 100644 --- a/src/lib/features/project/project-store.ts +++ b/src/lib/features/project/project-store.ts @@ -260,9 +260,6 @@ class ProjectStore implements IProjectStore { data: IProjectEnterpriseSettingsUpdate, ): Promise { try { - const projectLinkTemplatesEnabled = this.flagResolver.isEnabled( - 'projectLinkTemplates', - ); const link_templates = JSON.stringify( data.linkTemplates ? data.linkTemplates : [], ); @@ -276,11 +273,7 @@ class ProjectStore implements IProjectStore { feature_naming_example: data.featureNaming?.example, feature_naming_description: data.featureNaming?.description, - ...(projectLinkTemplatesEnabled - ? { - link_templates, - } - : {}), + link_templates, }); } else { await this.db(SETTINGS_TABLE).insert({ @@ -289,11 +282,7 @@ class ProjectStore implements IProjectStore { feature_naming_pattern: data.featureNaming?.pattern, feature_naming_example: data.featureNaming?.example, feature_naming_description: data.featureNaming?.description, - ...(projectLinkTemplatesEnabled - ? { - link_templates, - } - : {}), + link_templates, }); } } catch (err) { @@ -653,10 +642,6 @@ class ProjectStore implements IProjectStore { throw new NotFoundError('No project found'); } - const projectLinkTemplatesEnabled = this.flagResolver.isEnabled( - 'projectLinkTemplates', - ); - return { id: row.id, name: row.name, @@ -673,9 +658,7 @@ class ProjectStore implements IProjectStore { example: row.feature_naming_example, description: row.feature_naming_description, }, - ...(projectLinkTemplatesEnabled - ? { linkTemplates: row.link_templates || [] } - : {}), + linkTemplates: row.link_templates || [], }; } diff --git a/src/lib/metrics.ts b/src/lib/metrics.ts index 42567c668d..e92fec5836 100644 --- a/src/lib/metrics.ts +++ b/src/lib/metrics.ts @@ -664,10 +664,7 @@ export function registerPrometheusMetrics( help: 'Count most popular domains used in feature links', labelNames: ['domain'], query: () => { - if (flagResolver.isEnabled('featureLinks')) { - return stores.featureLinkReadModel.getTopDomains(); - } - return Promise.resolve([]); + return stores.featureLinkReadModel.getTopDomains(); }, map: (result) => result.map(({ domain, count }) => ({ diff --git a/src/lib/types/experimental.ts b/src/lib/types/experimental.ts index 7a9e43f30c..939bb7c1e5 100644 --- a/src/lib/types/experimental.ts +++ b/src/lib/types/experimental.ts @@ -58,8 +58,6 @@ export type IFlagKey = | 'edgeObservability' | 'addEditStrategy' | 'registerFrontendClient' - | 'featureLinks' - | 'projectLinkTemplates' | 'reportUnknownFlags' | 'lastSeenBulkQuery' | 'newGettingStartedEmail' @@ -278,14 +276,6 @@ const flags: IFlags = { process.env.UNLEASH_EXPERIMENTAL_REGISTER_FRONTEND_CLIENT, false, ), - featureLinks: parseEnvVarBoolean( - process.env.UNLEASH_EXPERIMENTAL_FEATURE_LINKS, - false, - ), - projectLinkTemplates: parseEnvVarBoolean( - process.env.UNLEASH_EXPERIMENTAL_PROJECT_LINK_TEMPLATES, - false, - ), reportUnknownFlags: parseEnvVarBoolean( process.env.UNLEASH_EXPERIMENTAL_REPORT_UNKNOWN_FLAGS, false, diff --git a/src/server-dev.ts b/src/server-dev.ts index 420ca9f990..1ab2b704ab 100644 --- a/src/server-dev.ts +++ b/src/server-dev.ts @@ -53,8 +53,6 @@ process.nextTick(async () => { addEditStrategy: true, strictSchemaValidation: true, registerFrontendClient: true, - featureLinks: true, - projectLinkTemplates: true, reportUnknownFlags: true, customMetrics: true, lifecycleMetrics: true,