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:
co-authored by
Oliver Windall Juhl
parent
02967f95b1
commit
3e197e3adf
@@ -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,
|
||||||
|
},
|
||||||
|
])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -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,
|
||||||
|
}))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user