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, + })) + } }