diff --git a/src/lib/features/feature-links/feature-link-controller.ts b/src/lib/features/feature-links/feature-link-controller.ts index a191272897..cc79460b86 100644 --- a/src/lib/features/feature-links/feature-link-controller.ts +++ b/src/lib/features/feature-links/feature-link-controller.ts @@ -12,6 +12,7 @@ import { } from '../../openapi/util/standard-responses'; import { createRequestSchema } from '../../openapi/util/create-request-schema'; import type { IFeatureLink } from './feature-link-store-type'; +import type { IFlagResolver } from '../../types'; interface FeatureLinkServices { transactionalFeatureLinkService: WithTransactional; @@ -24,6 +25,7 @@ const PATH_LINK = '/:projectId/features/:featureName/link/:linkId'; export default class FeatureLinkController extends Controller { private transactionalFeatureLinkService: WithTransactional; private openApiService: OpenApiService; + private flagResolver: IFlagResolver; constructor( config: IUnleashConfig, @@ -35,6 +37,7 @@ export default class FeatureLinkController extends Controller { super(config); this.transactionalFeatureLinkService = transactionalFeatureLinkService; this.openApiService = openApiService; + this.flagResolver = config.flagResolver; this.route({ method: 'post', @@ -105,6 +108,9 @@ 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) => @@ -126,6 +132,9 @@ 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) => @@ -147,6 +156,9 @@ 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-links/feature-link.e2e.test.ts b/src/lib/features/feature-links/feature-link.e2e.test.ts index 7e791b1cd8..08f457a3dd 100644 --- a/src/lib/features/feature-links/feature-link.e2e.test.ts +++ b/src/lib/features/feature-links/feature-link.e2e.test.ts @@ -20,7 +20,9 @@ beforeAll(async () => { db.stores, { experimental: { - flags: {}, + flags: { + featureLinks: true, + }, }, }, db.rawDatabase, diff --git a/src/lib/types/experimental.ts b/src/lib/types/experimental.ts index 8724c839eb..0ed6d44a39 100644 --- a/src/lib/types/experimental.ts +++ b/src/lib/types/experimental.ts @@ -69,7 +69,8 @@ export type IFlagKey = | 'flagsReleaseManagementUI' | 'cleanupReminder' | 'removeInactiveApplications' - | 'registerFrontendClient'; + | 'registerFrontendClient' + | 'featureLinks'; export type IFlags = Partial<{ [key in IFlagKey]: boolean | Variant }>; @@ -330,6 +331,10 @@ const flags: IFlags = { process.env.UNLEASH_EXPERIMENTAL_REGISTER_FRONTEND_CLIENT, false, ), + featureLinks: parseEnvVarBoolean( + process.env.UNLEASH_EXPERIMENTAL_FEATURE_LINKS, + false, + ), }; export const defaultExperimentalOptions: IExperimentalOptions = {