1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-07-26 13:48:33 +02:00

chore: remove link flags (#10076)

This commit is contained in:
Mateusz Kwasniewski 2025-06-03 13:47:24 +02:00 committed by GitHub
parent 68660e1e1f
commit 0819b2cf32
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 18 additions and 92 deletions

View File

@ -27,7 +27,6 @@ import type {
IFeatureToggle, IFeatureToggle,
} from '../../../../../interfaces/featureToggle.ts'; } from '../../../../../interfaces/featureToggle.ts';
import AddIcon from '@mui/icons-material/Add'; import AddIcon from '@mui/icons-material/Add';
import { useUiFlag } from 'hooks/useUiFlag';
import { Badge } from 'component/common/Badge/Badge'; import { Badge } from 'component/common/Badge/Badge';
import LinkIcon from '@mui/icons-material/Link'; import LinkIcon from '@mui/icons-material/Link';
import { UPDATE_FEATURE } from '../../../../providers/AccessProvider/permissions.ts'; import { UPDATE_FEATURE } from '../../../../providers/AccessProvider/permissions.ts';
@ -246,17 +245,13 @@ const FeatureOverviewMetaData: FC<FeatureOverviewMetaDataProps> = ({
const showDependentFeatures = useShowDependentFeatures(project); const showDependentFeatures = useShowDependentFeatures(project);
const featureLinksEnabled = useUiFlag('featureLinks');
return ( return (
<> <>
{featureLinksEnabled ? ( <FeatureLinks
<FeatureLinks links={feature.links || []}
links={feature.links || []} project={feature.project}
project={feature.project} feature={feature.name}
feature={feature.name} />
/>
) : null}
<StyledMetaDataContainer> <StyledMetaDataContainer>
<div> <div>
<StyledTitle>Flag details</StyledTitle> <StyledTitle>Flag details</StyledTitle>

View File

@ -12,7 +12,6 @@ import Input from 'component/common/Input/Input';
import { FeatureFlagNamingTooltip } from './FeatureFlagNamingTooltip.tsx'; import { FeatureFlagNamingTooltip } from './FeatureFlagNamingTooltip.tsx';
import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; import { usePlausibleTracker } from 'hooks/usePlausibleTracker';
import type { ProjectLinkTemplateSchema } from 'openapi'; import type { ProjectLinkTemplateSchema } from 'openapi';
import { useUiFlag } from 'hooks/useUiFlag';
import ProjectLinkTemplates from './ProjectLinkTemplates/ProjectLinkTemplates.tsx'; import ProjectLinkTemplates from './ProjectLinkTemplates/ProjectLinkTemplates.tsx';
interface IProjectEnterpriseSettingsForm { interface IProjectEnterpriseSettingsForm {
@ -155,8 +154,6 @@ const ProjectEnterpriseSettingsForm: React.FC<
{ key: 'private', label: 'private' }, { key: 'private', label: 'private' },
]; ];
const projectLinkTemplatesEnabled = useUiFlag('projectLinkTemplates');
useEffect(() => { useEffect(() => {
setPreviousPattern(featureNamingPattern || ''); setPreviousPattern(featureNamingPattern || '');
}, [projectId]); }, [projectId]);
@ -354,12 +351,10 @@ The flag name should contain the project name, the feature name, and the ticket
/> />
</StyledFlagNamingContainer> </StyledFlagNamingContainer>
{projectLinkTemplatesEnabled && ( <ProjectLinkTemplates
<ProjectLinkTemplates linkTemplates={linkTemplates || []}
linkTemplates={linkTemplates || []} setLinkTemplates={setLinkTemplates}
setLinkTemplates={setLinkTemplates} />
/>
)}
</StyledFieldset> </StyledFieldset>
<StyledButtonContainer>{children}</StyledButtonContainer> <StyledButtonContainer>{children}</StyledButtonContainer>
</StyledForm> </StyledForm>

View File

@ -88,8 +88,6 @@ export type UiFlags = {
edgeObservability?: boolean; edgeObservability?: boolean;
addEditStrategy?: boolean; addEditStrategy?: boolean;
registerFrontendClient?: boolean; registerFrontendClient?: boolean;
featureLinks?: boolean;
projectLinkTemplates?: boolean;
customMetrics?: boolean; customMetrics?: boolean;
lifecycleMetrics?: boolean; lifecycleMetrics?: boolean;
sideMenuCleanup?: boolean; sideMenuCleanup?: boolean;

View File

@ -303,9 +303,7 @@ export default class ExportImportService
await this.importTagTypes(dto, auditUser); await this.importTagTypes(dto, auditUser);
await this.importTags(dto, auditUser); await this.importTags(dto, auditUser);
await this.importContextFields(dto, auditUser); await this.importContextFields(dto, auditUser);
if (this.flagResolver.isEnabled('featureLinks')) { await this.importLinks(dto, auditUser);
await this.importLinks(dto, auditUser);
}
} }
async import( async import(
@ -924,9 +922,7 @@ export default class ExportImportService
this.segmentReadModel.getAll(), this.segmentReadModel.getAll(),
this.tagTypeStore.getAll(), this.tagTypeStore.getAll(),
this.dependentFeaturesReadModel.getDependencies(featureNames), this.dependentFeaturesReadModel.getDependencies(featureNames),
this.flagResolver.isEnabled('featureLinks') this.featureLinksReadModel.getLinks(...featureNames),
? this.featureLinksReadModel.getLinks(...featureNames)
: Promise.resolve([]),
]); ]);
this.addSegmentsToStrategies(featureStrategies, strategySegments); this.addSegmentsToStrategies(featureStrategies, strategySegments);
const filteredContextFields = contextFields const filteredContextFields = contextFields

View File

@ -108,9 +108,6 @@ export default class FeatureLinkController extends Controller {
>, >,
res: Response, res: Response,
): Promise<void> { ): Promise<void> {
if (!this.flagResolver.isEnabled('featureLinks')) {
res.status(404).end();
}
const { projectId, featureName } = req.params; const { projectId, featureName } = req.params;
await this.transactionalFeatureLinkService.transactional((service) => await this.transactionalFeatureLinkService.transactional((service) =>
@ -132,9 +129,6 @@ export default class FeatureLinkController extends Controller {
>, >,
res: Response, res: Response,
): Promise<void> { ): Promise<void> {
if (!this.flagResolver.isEnabled('featureLinks')) {
res.status(404).end();
}
const { projectId, linkId, featureName } = req.params; const { projectId, linkId, featureName } = req.params;
await this.transactionalFeatureLinkService.transactional((service) => await this.transactionalFeatureLinkService.transactional((service) =>
@ -156,9 +150,6 @@ export default class FeatureLinkController extends Controller {
>, >,
res: Response, res: Response,
): Promise<void> { ): Promise<void> {
if (!this.flagResolver.isEnabled('featureLinks')) {
res.status(404).end();
}
const { projectId, linkId } = req.params; const { projectId, linkId } = req.params;
await this.transactionalFeatureLinkService.transactional((service) => await this.transactionalFeatureLinkService.transactional((service) =>

View File

@ -1114,9 +1114,7 @@ export class FeatureToggleService {
this.featureCollaboratorsReadModel.getFeatureCollaborators( this.featureCollaboratorsReadModel.getFeatureCollaborators(
featureName, featureName,
), ),
this.flagResolver.isEnabled('featureLinks') this.featureLinksReadModel.getLinks(featureName),
? this.featureLinksReadModel.getLinks(featureName)
: Promise.resolve([]),
]); ]);
if (environmentVariants) { if (environmentVariants) {
@ -2559,10 +2557,6 @@ export class FeatureToggleService {
featureName: string, featureName: string,
auditUser: IAuditUser, auditUser: IAuditUser,
) { ) {
if (!this.flagResolver.isEnabled('projectLinkTemplates')) {
return;
}
const featureLinksFromTemplates = ( const featureLinksFromTemplates = (
await this.projectStore.getProjectLinkTemplates(projectId) await this.projectStore.getProjectLinkTemplates(projectId)
).map((template) => ({ ).map((template) => ({

View File

@ -59,18 +59,13 @@ const mockConstraints = (): IConstraint[] => {
const irrelevantDate = new Date(); const irrelevantDate = new Date();
beforeAll(async () => { beforeAll(async () => {
const flags = { const config = createTestConfig();
featureLinks: true,
projectLinkTemplates: true,
};
const config = createTestConfig({ experimental: { flags } });
db = await dbInit( db = await dbInit(
'feature_toggle_service_v2_service_serial', 'feature_toggle_service_v2_service_serial',
config.getLogger, config.getLogger,
{ {
dbInitMethod: 'legacy' as const, dbInitMethod: 'legacy' as const,
experimental: { flags },
}, },
); );
unleashConfig = config; unleashConfig = config;

View File

@ -13,13 +13,7 @@ let projectStore: IProjectStore;
let environmentStore: IEnvironmentStore; let environmentStore: IEnvironmentStore;
beforeAll(async () => { beforeAll(async () => {
db = await dbInit('project_store_serial', getLogger, { db = await dbInit('project_store_serial', getLogger);
experimental: {
flags: {
projectLinkTemplates: true,
},
},
});
stores = db.stores; stores = db.stores;
projectStore = stores.projectStore; projectStore = stores.projectStore;
environmentStore = stores.environmentStore; environmentStore = stores.environmentStore;

View File

@ -260,9 +260,6 @@ class ProjectStore implements IProjectStore {
data: IProjectEnterpriseSettingsUpdate, data: IProjectEnterpriseSettingsUpdate,
): Promise<void> { ): Promise<void> {
try { try {
const projectLinkTemplatesEnabled = this.flagResolver.isEnabled(
'projectLinkTemplates',
);
const link_templates = JSON.stringify( const link_templates = JSON.stringify(
data.linkTemplates ? data.linkTemplates : [], data.linkTemplates ? data.linkTemplates : [],
); );
@ -276,11 +273,7 @@ class ProjectStore implements IProjectStore {
feature_naming_example: data.featureNaming?.example, feature_naming_example: data.featureNaming?.example,
feature_naming_description: feature_naming_description:
data.featureNaming?.description, data.featureNaming?.description,
...(projectLinkTemplatesEnabled link_templates,
? {
link_templates,
}
: {}),
}); });
} else { } else {
await this.db(SETTINGS_TABLE).insert({ await this.db(SETTINGS_TABLE).insert({
@ -289,11 +282,7 @@ class ProjectStore implements IProjectStore {
feature_naming_pattern: data.featureNaming?.pattern, feature_naming_pattern: data.featureNaming?.pattern,
feature_naming_example: data.featureNaming?.example, feature_naming_example: data.featureNaming?.example,
feature_naming_description: data.featureNaming?.description, feature_naming_description: data.featureNaming?.description,
...(projectLinkTemplatesEnabled link_templates,
? {
link_templates,
}
: {}),
}); });
} }
} catch (err) { } catch (err) {
@ -653,10 +642,6 @@ class ProjectStore implements IProjectStore {
throw new NotFoundError('No project found'); throw new NotFoundError('No project found');
} }
const projectLinkTemplatesEnabled = this.flagResolver.isEnabled(
'projectLinkTemplates',
);
return { return {
id: row.id, id: row.id,
name: row.name, name: row.name,
@ -673,9 +658,7 @@ class ProjectStore implements IProjectStore {
example: row.feature_naming_example, example: row.feature_naming_example,
description: row.feature_naming_description, description: row.feature_naming_description,
}, },
...(projectLinkTemplatesEnabled linkTemplates: row.link_templates || [],
? { linkTemplates: row.link_templates || [] }
: {}),
}; };
} }

View File

@ -664,10 +664,7 @@ export function registerPrometheusMetrics(
help: 'Count most popular domains used in feature links', help: 'Count most popular domains used in feature links',
labelNames: ['domain'], labelNames: ['domain'],
query: () => { query: () => {
if (flagResolver.isEnabled('featureLinks')) { return stores.featureLinkReadModel.getTopDomains();
return stores.featureLinkReadModel.getTopDomains();
}
return Promise.resolve([]);
}, },
map: (result) => map: (result) =>
result.map(({ domain, count }) => ({ result.map(({ domain, count }) => ({

View File

@ -58,8 +58,6 @@ export type IFlagKey =
| 'edgeObservability' | 'edgeObservability'
| 'addEditStrategy' | 'addEditStrategy'
| 'registerFrontendClient' | 'registerFrontendClient'
| 'featureLinks'
| 'projectLinkTemplates'
| 'reportUnknownFlags' | 'reportUnknownFlags'
| 'lastSeenBulkQuery' | 'lastSeenBulkQuery'
| 'newGettingStartedEmail' | 'newGettingStartedEmail'
@ -278,14 +276,6 @@ const flags: IFlags = {
process.env.UNLEASH_EXPERIMENTAL_REGISTER_FRONTEND_CLIENT, process.env.UNLEASH_EXPERIMENTAL_REGISTER_FRONTEND_CLIENT,
false, false,
), ),
featureLinks: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_FEATURE_LINKS,
false,
),
projectLinkTemplates: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_PROJECT_LINK_TEMPLATES,
false,
),
reportUnknownFlags: parseEnvVarBoolean( reportUnknownFlags: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_REPORT_UNKNOWN_FLAGS, process.env.UNLEASH_EXPERIMENTAL_REPORT_UNKNOWN_FLAGS,
false, false,

View File

@ -53,8 +53,6 @@ process.nextTick(async () => {
addEditStrategy: true, addEditStrategy: true,
strictSchemaValidation: true, strictSchemaValidation: true,
registerFrontendClient: true, registerFrontendClient: true,
featureLinks: true,
projectLinkTemplates: true,
reportUnknownFlags: true, reportUnknownFlags: true,
customMetrics: true, customMetrics: true,
lifecycleMetrics: true, lifecycleMetrics: true,