From 3e197e3adf0bcd39cdcf30c7dda381cc4b7ac779 Mon Sep 17 00:00:00 2001 From: Philip Korsholm <88927411+pKorsholm@users.noreply.github.com> Date: Mon, 11 Jul 2022 11:42:58 +0200 Subject: [PATCH] feat(medusa): Add feature flags to store response (#1819) **What** - Add `feature_flags` string array to store response **Why** - to provide conditional ui in admin corresponding to enabled features Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com> --- .changeset/brave-knives-study.md | 5 ++++ .../admin/__snapshots__/store.js.snap | 6 ++++ .../api/__tests__/admin/store.js | 6 ++++ .../src/api/routes/admin/store/get-store.ts | 10 ++++++- packages/medusa/src/types/feature-flags.ts | 6 ++++ .../medusa/src/utils/__tests__/flag-router.ts | 30 +++++++++++++++++++ packages/medusa/src/utils/flag-router.ts | 9 +++++- 7 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 .changeset/brave-knives-study.md create mode 100644 packages/medusa/src/utils/__tests__/flag-router.ts diff --git a/.changeset/brave-knives-study.md b/.changeset/brave-knives-study.md new file mode 100644 index 0000000000..ba4b838861 --- /dev/null +++ b/.changeset/brave-knives-study.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +Add feature flags to store response diff --git a/integration-tests/api/__tests__/admin/__snapshots__/store.js.snap b/integration-tests/api/__tests__/admin/__snapshots__/store.js.snap index d8fe3ab0e3..5155809a0c 100644 --- a/integration-tests/api/__tests__/admin/__snapshots__/store.js.snap +++ b/integration-tests/api/__tests__/admin/__snapshots__/store.js.snap @@ -121,6 +121,12 @@ Object { "symbol_native": "$", }, "default_currency_code": "usd", + "feature_flags": Array [ + Object { + "key": "sales_channels", + "value": false, + }, + ], "fulfillment_providers": Array [ Object { "id": "test-ful", diff --git a/integration-tests/api/__tests__/admin/store.js b/integration-tests/api/__tests__/admin/store.js index 7cf95afa7c..65097c68d6 100644 --- a/integration-tests/api/__tests__/admin/store.js +++ b/integration-tests/api/__tests__/admin/store.js @@ -52,6 +52,12 @@ describe("/admin/store", () => { code: "usd", }, ], + feature_flags: [ + { + key: "sales_channels", + value: false, + }, + ], default_currency_code: "usd", created_at: expect.any(String), updated_at: expect.any(String), diff --git a/packages/medusa/src/api/routes/admin/store/get-store.ts b/packages/medusa/src/api/routes/admin/store/get-store.ts index 1498d4b38f..37dcc6d024 100644 --- a/packages/medusa/src/api/routes/admin/store/get-store.ts +++ b/packages/medusa/src/api/routes/admin/store/get-store.ts @@ -1,9 +1,11 @@ +import { FulfillmentProvider, PaymentProvider, Store } from "../../../../models" import { FulfillmentProviderService, PaymentProviderService, StoreService, } from "../../../../services" -import { FulfillmentProvider, PaymentProvider, Store } from "../../../../models" +import { FeatureFlagsResponse } from "../../../../types/feature-flags" +import { FlagRouter } from "../../../../utils/flag-router" /** * @oas [get] /store @@ -25,6 +27,9 @@ import { FulfillmentProvider, PaymentProvider, Store } from "../../../../models" */ export default async (req, res) => { const storeService: StoreService = req.scope.resolve("storeService") + + const featureFlagRouter: FlagRouter = req.scope.resolve("featureFlagRouter") + const paymentProviderService: PaymentProviderService = req.scope.resolve( "paymentProviderService" ) @@ -36,8 +41,11 @@ export default async (req, res) => { })) as Store & { payment_providers: PaymentProvider[] fulfillment_providers: FulfillmentProvider[] + feature_flags: FeatureFlagsResponse } + data.feature_flags = featureFlagRouter.listFlags() + const paymentProviders = await paymentProviderService.list() const fulfillmentProviders = await fulfillmentProviderService.list() diff --git a/packages/medusa/src/types/feature-flags.ts b/packages/medusa/src/types/feature-flags.ts index e29acaffb2..b40a8fb09b 100644 --- a/packages/medusa/src/types/feature-flags.ts +++ b/packages/medusa/src/types/feature-flags.ts @@ -1,7 +1,13 @@ export interface IFlagRouter { isFeatureEnabled: (key: string) => boolean + listFlags: () => FeatureFlagsResponse } +export type FeatureFlagsResponse = { + key: string + value: boolean +}[] + export type FlagSettings = { key: string description: string diff --git a/packages/medusa/src/utils/__tests__/flag-router.ts b/packages/medusa/src/utils/__tests__/flag-router.ts new file mode 100644 index 0000000000..5c452fc321 --- /dev/null +++ b/packages/medusa/src/utils/__tests__/flag-router.ts @@ -0,0 +1,30 @@ +import { FlagRouter } from "../flag-router" + +describe("Flag Router", () => { + describe("listFlags", () => { + it("should list all feature flags", () => { + const flagRouter = new FlagRouter({}) + + flagRouter.setFlag("test", false) + flagRouter.setFlag("test2", true) + flagRouter.setFlag("test3", false) + + const listOfFlags = flagRouter.listFlags() + + expect(listOfFlags).toEqual([ + { + key: "test", + value: false, + }, + { + key: "test2", + value: true, + }, + { + key: "test3", + value: false, + }, + ]) + }) + }) +}) diff --git a/packages/medusa/src/utils/flag-router.ts b/packages/medusa/src/utils/flag-router.ts index 8ef8d8ea62..12bb8f0229 100644 --- a/packages/medusa/src/utils/flag-router.ts +++ b/packages/medusa/src/utils/flag-router.ts @@ -1,4 +1,4 @@ -import { IFlagRouter } from "../types/feature-flags" +import { FeatureFlagsResponse, IFlagRouter } from "../types/feature-flags" export class FlagRouter implements IFlagRouter { private flags: Record = {} @@ -14,4 +14,11 @@ export class FlagRouter implements IFlagRouter { public setFlag(key: string, value = true): void { this.flags[key] = value } + + public listFlags(): FeatureFlagsResponse { + return Object.entries(this.flags || {}).map(([key, value]) => ({ + key, + value, + })) + } }