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 11:42:58 +02:00
committed by GitHub
parent 02967f95b1
commit 3e197e3adf
7 changed files with 70 additions and 2 deletions

View File

@@ -0,0 +1,5 @@
---
"@medusajs/medusa": patch
---
Add feature flags to store response

View File

@@ -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",

View File

@@ -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),

View File

@@ -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()

View File

@@ -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

View 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,
},
])
})
})
})

View File

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