diff --git a/.changeset/wicked-candles-mate.md b/.changeset/wicked-candles-mate.md new file mode 100644 index 0000000000..9cdbca45a2 --- /dev/null +++ b/.changeset/wicked-candles-mate.md @@ -0,0 +1,6 @@ +--- +"@medusajs/medusa": patch +"@medusajs/link-modules": patch +--- + +feat(): Add support for store locales end point diff --git a/integration-tests/http/__tests__/store/store/locale.spec.ts b/integration-tests/http/__tests__/store/store/locale.spec.ts new file mode 100644 index 0000000000..3d81c69395 --- /dev/null +++ b/integration-tests/http/__tests__/store/store/locale.spec.ts @@ -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([]) + }) + }) + }) + }, +}) diff --git a/integration-tests/http/medusa-config.js b/integration-tests/http/medusa-config.js index 37fad7c664..6ffd3cfe8e 100644 --- a/integration-tests/http/medusa-config.js +++ b/integration-tests/http/medusa-config.js @@ -85,6 +85,7 @@ module.exports = defineConfig({ }, featureFlags: { index_engine: process.env.ENABLE_INDEX_MODULE === "true", + translation: process.env.MEDUSA_FF_TRANSLATION === "true", }, modules, }) diff --git a/packages/medusa/src/api/store/locales/middlewares.ts b/packages/medusa/src/api/store/locales/middlewares.ts new file mode 100644 index 0000000000..01ae5a9366 --- /dev/null +++ b/packages/medusa/src/api/store/locales/middlewares.ts @@ -0,0 +1,9 @@ +import { MiddlewareRoute } from "@medusajs/framework/http" + +export const storeLocalesRoutesMiddlewares: MiddlewareRoute[] = [ + { + method: ["GET"], + matcher: "/store/locales", + middlewares: [], + }, +] diff --git a/packages/medusa/src/api/store/locales/route.ts b/packages/medusa/src/api/store/locales/route.ts new file mode 100644 index 0000000000..715363de6d --- /dev/null +++ b/packages/medusa/src/api/store/locales/route.ts @@ -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, + }) +} diff --git a/packages/medusa/src/api/store/middlewares.ts b/packages/medusa/src/api/store/middlewares.ts index c20bd00997..5812bd154f 100644 --- a/packages/medusa/src/api/store/middlewares.ts +++ b/packages/medusa/src/api/store/middlewares.ts @@ -1,6 +1,8 @@ import { MiddlewareRoute } from "@medusajs/framework/http" +import { storeLocalesRoutesMiddlewares } from "./locales/middlewares" import { storeReturnsRoutesMiddlewares } from "./returns/middlewares" export const storeRoutesMiddlewares: MiddlewareRoute[] = [ + ...storeLocalesRoutesMiddlewares, ...storeReturnsRoutesMiddlewares, ] diff --git a/packages/modules/link-modules/src/definitions/readonly/store-locale.ts b/packages/modules/link-modules/src/definitions/readonly/store-locale.ts index 0d15bed4ae..39013a52d4 100644 --- a/packages/modules/link-modules/src/definitions/readonly/store-locale.ts +++ b/packages/modules/link-modules/src/definitions/readonly/store-locale.ts @@ -1,12 +1,8 @@ import { ModuleJoinerConfig } from "@medusajs/framework/types" -import { - FeatureFlag, - MEDUSA_SKIP_FILE, - Modules, -} from "@medusajs/framework/utils" +import { MEDUSA_SKIP_FILE, Modules } from "@medusajs/framework/utils" export const StoreLocales: ModuleJoinerConfig = { - [MEDUSA_SKIP_FILE]: !FeatureFlag.isFeatureEnabled("translation"), + [MEDUSA_SKIP_FILE]: process.env.MEDUSA_FF_TRANSLATION !== "true", isLink: true, isReadOnlyLink: true, extends: [