From ae79ff46f484667e0026de7052e7f36b65f5003d Mon Sep 17 00:00:00 2001 From: Oli Juhl <59018053+olivermrbl@users.noreply.github.com> Date: Tue, 13 Feb 2024 15:29:29 +0100 Subject: [PATCH] feat(region): Add store region get + list endpoints (#6342) --- packages/medusa/src/api-v2/middlewares.ts | 2 + .../src/api-v2/store/regions/[id]/route.ts | 19 +++++++ .../src/api-v2/store/regions/middlewares.ts | 27 +++++++++ .../src/api-v2/store/regions/query-config.ts | 27 +++++++++ .../medusa/src/api-v2/store/regions/route.ts | 20 +++++++ .../src/api-v2/store/regions/validators.ts | 55 +++++++++++++++++++ 6 files changed, 150 insertions(+) create mode 100644 packages/medusa/src/api-v2/store/regions/[id]/route.ts create mode 100644 packages/medusa/src/api-v2/store/regions/middlewares.ts create mode 100644 packages/medusa/src/api-v2/store/regions/query-config.ts create mode 100644 packages/medusa/src/api-v2/store/regions/route.ts create mode 100644 packages/medusa/src/api-v2/store/regions/validators.ts diff --git a/packages/medusa/src/api-v2/middlewares.ts b/packages/medusa/src/api-v2/middlewares.ts index 4fc7aad0b3..2496d72287 100644 --- a/packages/medusa/src/api-v2/middlewares.ts +++ b/packages/medusa/src/api-v2/middlewares.ts @@ -7,6 +7,7 @@ import { adminRegionRoutesMiddlewares } from "./admin/regions/middlewares" import { authRoutesMiddlewares } from "./auth/middlewares" import { storeCartRoutesMiddlewares } from "./store/carts/middlewares" import { storeCustomerRoutesMiddlewares } from "./store/customers/middlewares" +import { storeRegionRoutesMiddlewares } from "./store/regions/middlewares" export const config: MiddlewaresConfig = { routes: [ @@ -17,6 +18,7 @@ export const config: MiddlewaresConfig = { ...storeCustomerRoutesMiddlewares, ...storeCartRoutesMiddlewares, ...authRoutesMiddlewares, + ...storeRegionRoutesMiddlewares, ...adminRegionRoutesMiddlewares, ], } diff --git a/packages/medusa/src/api-v2/store/regions/[id]/route.ts b/packages/medusa/src/api-v2/store/regions/[id]/route.ts new file mode 100644 index 0000000000..bd04de5e2e --- /dev/null +++ b/packages/medusa/src/api-v2/store/regions/[id]/route.ts @@ -0,0 +1,19 @@ +import { remoteQueryObjectFromString } from "@medusajs/utils" +import { MedusaRequest, MedusaResponse } from "../../../../types/routing" +import { defaultStoreRegionFields } from "../query-config" + +export const GET = async (req: MedusaRequest, res: MedusaResponse) => { + const remoteQuery = req.scope.resolve("remoteQuery") + + const variables = { id: req.params.id } + + const queryObject = remoteQueryObjectFromString({ + entryPoint: "region", + variables, + fields: defaultStoreRegionFields, + }) + + const [region] = await remoteQuery(queryObject) + + res.status(200).json({ region }) +} diff --git a/packages/medusa/src/api-v2/store/regions/middlewares.ts b/packages/medusa/src/api-v2/store/regions/middlewares.ts new file mode 100644 index 0000000000..2dcf89281f --- /dev/null +++ b/packages/medusa/src/api-v2/store/regions/middlewares.ts @@ -0,0 +1,27 @@ +import { transformQuery } from "../../../api/middlewares" +import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" +import * as QueryConfig from "./query-config" +import { StoreGetRegionsParams, StoreRegionsRegionParams } from "./validators" + +export const storeRegionRoutesMiddlewares: MiddlewareRoute[] = [ + { + method: ["GET"], + matcher: "/store/regions", + middlewares: [ + transformQuery( + StoreGetRegionsParams, + QueryConfig.listTransformQueryConfig + ), + ], + }, + { + method: ["GET"], + matcher: "/store/regions/:id", + middlewares: [ + transformQuery( + StoreRegionsRegionParams, + QueryConfig.retrieveTransformQueryConfig + ), + ], + }, +] diff --git a/packages/medusa/src/api-v2/store/regions/query-config.ts b/packages/medusa/src/api-v2/store/regions/query-config.ts new file mode 100644 index 0000000000..1eef989e7f --- /dev/null +++ b/packages/medusa/src/api-v2/store/regions/query-config.ts @@ -0,0 +1,27 @@ +export const defaultStoreRegionFields = [ + "id", + "name", + "currency_code", + "created_at", + "updated_at", + "deleted_at", + "metadata", + "countries.id", + "countries.iso_2", + "countries.iso_3", + "countries.num_code", + "countries.name", + "currency.code", + "currency.symbol", + "currency.symbol_native", + "currency.name", +] + +export const retrieveTransformQueryConfig = { + isList: false, +} + +export const listTransformQueryConfig = { + defaultLimit: 20, + isList: true, +} diff --git a/packages/medusa/src/api-v2/store/regions/route.ts b/packages/medusa/src/api-v2/store/regions/route.ts new file mode 100644 index 0000000000..e370bb2027 --- /dev/null +++ b/packages/medusa/src/api-v2/store/regions/route.ts @@ -0,0 +1,20 @@ +import { remoteQueryObjectFromString } from "@medusajs/utils" +import { MedusaRequest, MedusaResponse } from "../../../types/routing" +import { defaultStoreRegionFields } from "./query-config" + +export const GET = async (req: MedusaRequest, res: MedusaResponse) => { + const remoteQuery = req.scope.resolve("remoteQuery") + + const variables = { filters: req.filterableFields } + + const queryObject = remoteQueryObjectFromString({ + entryPoint: "region", + variables, + fields: defaultStoreRegionFields, + }) + + // TODO: Add count, offset, limit + const regions = await remoteQuery(queryObject) + + res.json({ regions }) +} diff --git a/packages/medusa/src/api-v2/store/regions/validators.ts b/packages/medusa/src/api-v2/store/regions/validators.ts new file mode 100644 index 0000000000..c784af7568 --- /dev/null +++ b/packages/medusa/src/api-v2/store/regions/validators.ts @@ -0,0 +1,55 @@ +import { OperatorMap } from "@medusajs/types" +import { Type } from "class-transformer" +import { IsOptional, IsString, ValidateNested } from "class-validator" +import { FindParams, extendedFindParamsMixin } from "../../../types/common" +import { OperatorMapValidator } from "../../../types/validators/operator-map" + +export class StoreRegionsRegionParams extends FindParams {} + +/** + * Parameters used to filter and configure the pagination of the retrieved regions. + */ +export class StoreGetRegionsParams extends extendedFindParamsMixin({ + limit: 50, + offset: 0, +}) { + /** + * Filter by currency code + */ + @IsString({ each: true }) + @IsOptional() + code?: string | string[] + + /** + * Filter by region name + */ + @IsString({ each: true }) + @IsOptional() + name?: string | string[] + + /** + * Date filters to apply on the regions' `created_at` date. + */ + @IsOptional() + @ValidateNested() + @Type(() => OperatorMapValidator) + created_at?: OperatorMap + + /** + * Date filters to apply on the regions' `updated_at` date. + */ + @IsOptional() + @ValidateNested() + @Type(() => OperatorMapValidator) + updated_at?: OperatorMap + + @IsOptional() + @ValidateNested({ each: true }) + @Type(() => StoreGetRegionsParams) + $and?: StoreGetRegionsParams[] + + @IsOptional() + @ValidateNested({ each: true }) + @Type(() => StoreGetRegionsParams) + $or?: StoreGetRegionsParams[] +}