Skip to content

Commit 0f1566c

Browse files
authored
feat(): Add support for store locales end point (medusajs#14307)
**What** Add support for `store/locales` which return the configured supported locales
1 parent 665b80a commit 0f1566c

File tree

7 files changed

+141
-6
lines changed

7 files changed

+141
-6
lines changed

.changeset/wicked-candles-mate.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@medusajs/medusa": patch
3+
"@medusajs/link-modules": patch
4+
---
5+
6+
feat(): Add support for store locales end point
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import { medusaIntegrationTestRunner } from "@medusajs/test-utils"
2+
import { MedusaContainer } from "@medusajs/types"
3+
import { Modules } from "@medusajs/utils"
4+
import {
5+
generatePublishableKey,
6+
generateStoreHeaders,
7+
} from "../../../../helpers/create-admin-user"
8+
9+
jest.setTimeout(30000)
10+
11+
process.env.MEDUSA_FF_TRANSLATION = "true"
12+
13+
medusaIntegrationTestRunner({
14+
testSuite: ({ getContainer, api }) => {
15+
describe("Store Locales API", () => {
16+
let appContainer: MedusaContainer
17+
let storeHeaders
18+
19+
beforeAll(async () => {
20+
appContainer = getContainer()
21+
})
22+
23+
beforeEach(async () => {
24+
const publishableKey = await generatePublishableKey(appContainer)
25+
storeHeaders = generateStoreHeaders({ publishableKey })
26+
27+
const storeModule = appContainer.resolve(Modules.STORE)
28+
const [defaultStore] = await storeModule.listStores(
29+
{},
30+
{
31+
select: ["id"],
32+
take: 1,
33+
}
34+
)
35+
await storeModule.updateStores(defaultStore.id, {
36+
supported_locales: [
37+
{ locale_code: "en-US" },
38+
{ locale_code: "fr-FR" },
39+
{ locale_code: "de-DE" },
40+
],
41+
})
42+
})
43+
44+
afterAll(async () => {
45+
delete process.env.MEDUSA_FF_TRANSLATION
46+
})
47+
48+
describe("GET /store/locales", () => {
49+
it("should return store supported locales", async () => {
50+
const response = await api.get("/store/locales", storeHeaders)
51+
52+
expect(response.status).toEqual(200)
53+
expect(response.data.locales).toHaveLength(3)
54+
expect(response.data.locales).toEqual(
55+
expect.arrayContaining([
56+
{
57+
code: "en-US",
58+
name: expect.any(String),
59+
},
60+
{
61+
code: "fr-FR",
62+
name: expect.any(String),
63+
},
64+
{
65+
code: "de-DE",
66+
name: expect.any(String),
67+
},
68+
])
69+
)
70+
})
71+
72+
it("should return empty array when no locales configured", async () => {
73+
const storeModule = appContainer.resolve(Modules.STORE)
74+
const [defaultStore] = await storeModule.listStores(
75+
{},
76+
{
77+
select: ["id"],
78+
take: 1,
79+
}
80+
)
81+
await storeModule.updateStores(defaultStore.id, {
82+
supported_locales: [],
83+
})
84+
85+
const response = await api.get("/store/locales", storeHeaders)
86+
87+
expect(response.status).toEqual(200)
88+
expect(response.data.locales).toEqual([])
89+
})
90+
})
91+
})
92+
},
93+
})

integration-tests/http/medusa-config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ module.exports = defineConfig({
8585
},
8686
featureFlags: {
8787
index_engine: process.env.ENABLE_INDEX_MODULE === "true",
88+
translation: process.env.MEDUSA_FF_TRANSLATION === "true",
8889
},
8990
modules,
9091
})
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { MiddlewareRoute } from "@medusajs/framework/http"
2+
3+
export const storeLocalesRoutesMiddlewares: MiddlewareRoute[] = [
4+
{
5+
method: ["GET"],
6+
matcher: "/store/locales",
7+
middlewares: [],
8+
},
9+
]
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http"
2+
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
3+
4+
export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
5+
const query = req.scope.resolve(ContainerRegistrationKeys.QUERY)
6+
7+
const {
8+
data: [store],
9+
} = await query.graph({
10+
entity: "store",
11+
fields: ["supported_locales.*", "supported_locales.locale.*"],
12+
pagination: {
13+
take: 1,
14+
},
15+
})
16+
17+
const locales = store?.supported_locales.reduce((acc, locale) => {
18+
acc.push({
19+
code: locale.locale_code,
20+
name: locale.locale.name,
21+
})
22+
return acc
23+
}, [])
24+
25+
res.json({
26+
locales,
27+
})
28+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { MiddlewareRoute } from "@medusajs/framework/http"
2+
import { storeLocalesRoutesMiddlewares } from "./locales/middlewares"
23
import { storeReturnsRoutesMiddlewares } from "./returns/middlewares"
34

45
export const storeRoutesMiddlewares: MiddlewareRoute[] = [
6+
...storeLocalesRoutesMiddlewares,
57
...storeReturnsRoutesMiddlewares,
68
]

packages/modules/link-modules/src/definitions/readonly/store-locale.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
import { ModuleJoinerConfig } from "@medusajs/framework/types"
2-
import {
3-
FeatureFlag,
4-
MEDUSA_SKIP_FILE,
5-
Modules,
6-
} from "@medusajs/framework/utils"
2+
import { MEDUSA_SKIP_FILE, Modules } from "@medusajs/framework/utils"
73

84
export const StoreLocales: ModuleJoinerConfig = {
9-
[MEDUSA_SKIP_FILE]: !FeatureFlag.isFeatureEnabled("translation"),
5+
[MEDUSA_SKIP_FILE]: process.env.MEDUSA_FF_TRANSLATION !== "true",
106
isLink: true,
117
isReadOnlyLink: true,
128
extends: [

0 commit comments

Comments
 (0)