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:
Philip Korsholm
2022-07-11 09:42:58 +00:00
committed by GitHub
co-authored by Oliver Windall Juhl
parent 02967f95b1
commit 3e197e3adf
7 changed files with 70 additions and 2 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"@medusajs/medusa": patch
---
Add feature flags to store response
@@ -121,6 +121,12 @@ Object {
"symbol_native": "$", "symbol_native": "$",
}, },
"default_currency_code": "usd", "default_currency_code": "usd",
"feature_flags": Array [
Object {
"key": "sales_channels",
"value": false,
},
],
"fulfillment_providers": Array [ "fulfillment_providers": Array [
Object { Object {
"id": "test-ful", "id": "test-ful",
@@ -52,6 +52,12 @@ describe("/admin/store", () => {
code: "usd", code: "usd",
}, },
], ],
feature_flags: [
{
key: "sales_channels",
value: false,
},
],
default_currency_code: "usd", default_currency_code: "usd",
created_at: expect.any(String), created_at: expect.any(String),
updated_at: expect.any(String), updated_at: expect.any(String),
@@ -1,9 +1,11 @@
import { FulfillmentProvider, PaymentProvider, Store } from "../../../../models"
import { import {
FulfillmentProviderService, FulfillmentProviderService,
PaymentProviderService, PaymentProviderService,
StoreService, StoreService,
} from "../../../../services" } from "../../../../services"
import { FulfillmentProvider, PaymentProvider, Store } from "../../../../models" import { FeatureFlagsResponse } from "../../../../types/feature-flags"
import { FlagRouter } from "../../../../utils/flag-router"
/** /**
* @oas [get] /store * @oas [get] /store
@@ -25,6 +27,9 @@ import { FulfillmentProvider, PaymentProvider, Store } from "../../../../models"
*/ */
export default async (req, res) => { export default async (req, res) => {
const storeService: StoreService = req.scope.resolve("storeService") const storeService: StoreService = req.scope.resolve("storeService")
const featureFlagRouter: FlagRouter = req.scope.resolve("featureFlagRouter")
const paymentProviderService: PaymentProviderService = req.scope.resolve( const paymentProviderService: PaymentProviderService = req.scope.resolve(
"paymentProviderService" "paymentProviderService"
) )
@@ -36,8 +41,11 @@ export default async (req, res) => {
})) as Store & { })) as Store & {
payment_providers: PaymentProvider[] payment_providers: PaymentProvider[]
fulfillment_providers: FulfillmentProvider[] fulfillment_providers: FulfillmentProvider[]
feature_flags: FeatureFlagsResponse
} }
data.feature_flags = featureFlagRouter.listFlags()
const paymentProviders = await paymentProviderService.list() const paymentProviders = await paymentProviderService.list()
const fulfillmentProviders = await fulfillmentProviderService.list() const fulfillmentProviders = await fulfillmentProviderService.list()
@@ -1,7 +1,13 @@
export interface IFlagRouter { export interface IFlagRouter {
isFeatureEnabled: (key: string) => boolean isFeatureEnabled: (key: string) => boolean
listFlags: () => FeatureFlagsResponse
} }
export type FeatureFlagsResponse = {
key: string
value: boolean
}[]
export type FlagSettings = { export type FlagSettings = {
key: string key: string
description: string description: string
@@ -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,
},
])
})
})
})
+8 -1
View File
@@ -1,4 +1,4 @@
import { IFlagRouter } from "../types/feature-flags" import { FeatureFlagsResponse, IFlagRouter } from "../types/feature-flags"
export class FlagRouter implements IFlagRouter { export class FlagRouter implements IFlagRouter {
private flags: Record<string, boolean> = {} private flags: Record<string, boolean> = {}
@@ -14,4 +14,11 @@ export class FlagRouter implements IFlagRouter {
public setFlag(key: string, value = true): void { public setFlag(key: string, value = true): void {
this.flags[key] = value this.flags[key] = value
} }
public listFlags(): FeatureFlagsResponse {
return Object.entries(this.flags || {}).map(([key, value]) => ({
key,
value,
}))
}
} }