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>
This commit is contained in:
5
.changeset/brave-knives-study.md
Normal file
5
.changeset/brave-knives-study.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@medusajs/medusa": patch
|
||||
---
|
||||
|
||||
Add feature flags to store response
|
||||
@@ -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",
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
30
packages/medusa/src/utils/__tests__/flag-router.ts
Normal file
30
packages/medusa/src/utils/__tests__/flag-router.ts
Normal file
@@ -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,
|
||||
},
|
||||
])
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -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<string, boolean> = {}
|
||||
@@ -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,
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user