feat(): Add support for store locales end point (#14307)

**What**
Add support for `store/locales` which return the configured supported locales
This commit is contained in:
Adrien de Peretti
2025-12-15 14:10:43 +01:00
committed by GitHub
parent 665b80adb1
commit 0f1566c644
7 changed files with 141 additions and 6 deletions

View File

@@ -0,0 +1,6 @@
---
"@medusajs/medusa": patch
"@medusajs/link-modules": patch
---
feat(): Add support for store locales end point

View File

@@ -0,0 +1,93 @@
import { medusaIntegrationTestRunner } from "@medusajs/test-utils"
import { MedusaContainer } from "@medusajs/types"
import { Modules } from "@medusajs/utils"
import {
generatePublishableKey,
generateStoreHeaders,
} from "../../../../helpers/create-admin-user"
jest.setTimeout(30000)
process.env.MEDUSA_FF_TRANSLATION = "true"
medusaIntegrationTestRunner({
testSuite: ({ getContainer, api }) => {
describe("Store Locales API", () => {
let appContainer: MedusaContainer
let storeHeaders
beforeAll(async () => {
appContainer = getContainer()
})
beforeEach(async () => {
const publishableKey = await generatePublishableKey(appContainer)
storeHeaders = generateStoreHeaders({ publishableKey })
const storeModule = appContainer.resolve(Modules.STORE)
const [defaultStore] = await storeModule.listStores(
{},
{
select: ["id"],
take: 1,
}
)
await storeModule.updateStores(defaultStore.id, {
supported_locales: [
{ locale_code: "en-US" },
{ locale_code: "fr-FR" },
{ locale_code: "de-DE" },
],
})
})
afterAll(async () => {
delete process.env.MEDUSA_FF_TRANSLATION
})
describe("GET /store/locales", () => {
it("should return store supported locales", async () => {
const response = await api.get("/store/locales", storeHeaders)
expect(response.status).toEqual(200)
expect(response.data.locales).toHaveLength(3)
expect(response.data.locales).toEqual(
expect.arrayContaining([
{
code: "en-US",
name: expect.any(String),
},
{
code: "fr-FR",
name: expect.any(String),
},
{
code: "de-DE",
name: expect.any(String),
},
])
)
})
it("should return empty array when no locales configured", async () => {
const storeModule = appContainer.resolve(Modules.STORE)
const [defaultStore] = await storeModule.listStores(
{},
{
select: ["id"],
take: 1,
}
)
await storeModule.updateStores(defaultStore.id, {
supported_locales: [],
})
const response = await api.get("/store/locales", storeHeaders)
expect(response.status).toEqual(200)
expect(response.data.locales).toEqual([])
})
})
})
},
})

View File

@@ -85,6 +85,7 @@ module.exports = defineConfig({
}, },
featureFlags: { featureFlags: {
index_engine: process.env.ENABLE_INDEX_MODULE === "true", index_engine: process.env.ENABLE_INDEX_MODULE === "true",
translation: process.env.MEDUSA_FF_TRANSLATION === "true",
}, },
modules, modules,
}) })

View File

@@ -0,0 +1,9 @@
import { MiddlewareRoute } from "@medusajs/framework/http"
export const storeLocalesRoutesMiddlewares: MiddlewareRoute[] = [
{
method: ["GET"],
matcher: "/store/locales",
middlewares: [],
},
]

View File

@@ -0,0 +1,28 @@
import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http"
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
const query = req.scope.resolve(ContainerRegistrationKeys.QUERY)
const {
data: [store],
} = await query.graph({
entity: "store",
fields: ["supported_locales.*", "supported_locales.locale.*"],
pagination: {
take: 1,
},
})
const locales = store?.supported_locales.reduce((acc, locale) => {
acc.push({
code: locale.locale_code,
name: locale.locale.name,
})
return acc
}, [])
res.json({
locales,
})
}

View File

@@ -1,6 +1,8 @@
import { MiddlewareRoute } from "@medusajs/framework/http" import { MiddlewareRoute } from "@medusajs/framework/http"
import { storeLocalesRoutesMiddlewares } from "./locales/middlewares"
import { storeReturnsRoutesMiddlewares } from "./returns/middlewares" import { storeReturnsRoutesMiddlewares } from "./returns/middlewares"
export const storeRoutesMiddlewares: MiddlewareRoute[] = [ export const storeRoutesMiddlewares: MiddlewareRoute[] = [
...storeLocalesRoutesMiddlewares,
...storeReturnsRoutesMiddlewares, ...storeReturnsRoutesMiddlewares,
] ]

View File

@@ -1,12 +1,8 @@
import { ModuleJoinerConfig } from "@medusajs/framework/types" import { ModuleJoinerConfig } from "@medusajs/framework/types"
import { import { MEDUSA_SKIP_FILE, Modules } from "@medusajs/framework/utils"
FeatureFlag,
MEDUSA_SKIP_FILE,
Modules,
} from "@medusajs/framework/utils"
export const StoreLocales: ModuleJoinerConfig = { export const StoreLocales: ModuleJoinerConfig = {
[MEDUSA_SKIP_FILE]: !FeatureFlag.isFeatureEnabled("translation"), [MEDUSA_SKIP_FILE]: process.env.MEDUSA_FF_TRANSLATION !== "true",
isLink: true, isLink: true,
isReadOnlyLink: true, isReadOnlyLink: true,
extends: [ extends: [