feat(region): Add admin region get + list endpoints (#6322)

**What**
Add `GET /admin/regions`
Add `GET /admin/regions/:id`

Blocked by #6320 

Co-authored-by: Adrien de Peretti <25098370+adrien2p@users.noreply.github.com>
This commit is contained in:
Oli Juhl
2024-02-11 17:13:49 +00:00
committed by GitHub
co-authored by Adrien de Peretti
parent b91a1ca5b8
commit 95d0e58d31
28 changed files with 566 additions and 87 deletions
@@ -0,0 +1,19 @@
import { remoteQueryObjectFromString } from "@medusajs/utils"
import { MedusaRequest, MedusaResponse } from "../../../../types/routing"
import { defaultAdminRegionFields } 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: defaultAdminRegionFields,
})
const [region] = await remoteQuery(queryObject)
res.status(200).json({ region })
}
@@ -0,0 +1,30 @@
import { transformQuery } from "../../../api/middlewares"
import { MiddlewareRoute } from "../../../loaders/helpers/routing/types"
import * as QueryConfig from "./query-config"
import {
AdminGetRegionsParams,
AdminGetRegionsRegionParams,
} from "./validators"
export const adminRegionRoutesMiddlewares: MiddlewareRoute[] = [
{
method: ["GET"],
matcher: "/admin/regions",
middlewares: [
transformQuery(
AdminGetRegionsParams,
QueryConfig.listTransformQueryConfig
),
],
},
{
method: ["GET"],
matcher: "/admin/regions/:id",
middlewares: [
transformQuery(
AdminGetRegionsRegionParams,
QueryConfig.retrieveTransformQueryConfig
),
],
},
]
@@ -0,0 +1,27 @@
export const defaultAdminRegionFields = [
"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,
}
@@ -0,0 +1,20 @@
import { remoteQueryObjectFromString } from "@medusajs/utils"
import { MedusaRequest, MedusaResponse } from "../../../types/routing"
import { defaultAdminRegionFields } 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: defaultAdminRegionFields,
})
// TODO: Add count, offset, limit
const regions = await remoteQuery(queryObject)
res.json({ regions })
}
@@ -0,0 +1,71 @@
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 AdminGetRegionsRegionParams extends FindParams {}
/**
* Parameters used to filter and configure the pagination of the retrieved regions.
*/
export class AdminGetRegionsParams extends extendedFindParamsMixin({
limit: 50,
offset: 0,
}) {
/**
* Search parameter for regions.
*/
@IsString({ each: true })
@IsOptional()
id?: string | string[]
/**
* 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<string>
/**
* Date filters to apply on the regions' `updated_at` date.
*/
@IsOptional()
@ValidateNested()
@Type(() => OperatorMapValidator)
updated_at?: OperatorMap<string>
/**
* Date filters to apply on the regions' `deleted_at` date.
*/
@ValidateNested()
@IsOptional()
@Type(() => OperatorMapValidator)
deleted_at?: OperatorMap<string>
// Additional filters from BaseFilterable
@IsOptional()
@ValidateNested({ each: true })
@Type(() => AdminGetRegionsParams)
$and?: AdminGetRegionsParams[]
@IsOptional()
@ValidateNested({ each: true })
@Type(() => AdminGetRegionsParams)
$or?: AdminGetRegionsParams[]
}
+4 -2
View File
@@ -1,11 +1,12 @@
import { MiddlewaresConfig } from "../loaders/helpers/routing/types"
import { adminCampaignRoutesMiddlewares } from "./admin/campaigns/middlewares"
import { adminCustomerGroupRoutesMiddlewares } from "./admin/customer-groups/middlewares"
import { storeCustomerRoutesMiddlewares } from "./store/customers/middlewares"
import { adminCustomerRoutesMiddlewares } from "./admin/customers/middlewares"
import { adminPromotionRoutesMiddlewares } from "./admin/promotions/middlewares"
import { storeCartRoutesMiddlewares } from "./store/carts/middlewares"
import { adminRegionRoutesMiddlewares } from "./admin/regions/middlewares"
import { authRoutesMiddlewares } from "./auth/middlewares"
import { storeCartRoutesMiddlewares } from "./store/carts/middlewares"
import { storeCustomerRoutesMiddlewares } from "./store/customers/middlewares"
export const config: MiddlewaresConfig = {
routes: [
@@ -16,5 +17,6 @@ export const config: MiddlewaresConfig = {
...storeCustomerRoutesMiddlewares,
...storeCartRoutesMiddlewares,
...authRoutesMiddlewares,
...adminRegionRoutesMiddlewares,
],
}
+4 -1
View File
@@ -8,7 +8,10 @@ import { Express, NextFunction, Request, Response } from "express"
import databaseLoader, { dataSource } from "./database"
import pluginsLoader, { registerPluginModels } from "./plugins"
import { ContainerRegistrationKeys, isString } from "@medusajs/utils"
import {
ContainerRegistrationKeys,
isString
} from "@medusajs/utils"
import { asValue } from "awilix"
import { createMedusaContainer } from "medusa-core-utils"
import { track } from "medusa-telemetry"
+69 -4
View File
@@ -1,8 +1,9 @@
import {
MODULE_PACKAGE_NAMES,
MedusaApp,
MedusaAppMigrateUp,
MedusaAppOutput,
MedusaModule,
MODULE_PACKAGE_NAMES,
Modules,
ModulesDefinition,
} from "@medusajs/modules-sdk"
@@ -12,9 +13,12 @@ import {
MedusaContainer,
ModuleDefinition,
} from "@medusajs/types"
import { FlagRouter, MedusaV2Flag } from "@medusajs/utils"
import { ContainerRegistrationKeys, isObject } from "@medusajs/utils"
import {
ContainerRegistrationKeys,
FlagRouter,
isObject,
MedusaV2Flag,
} from "@medusajs/utils"
import { asValue } from "awilix"
import { remoteQueryFetchData } from ".."
import { joinerConfig } from "../joiner-config"
@@ -37,6 +41,67 @@ export function mergeDefaultModules(
return configModules
}
export async function migrateMedusaApp(
{
configModule,
container,
}: {
configModule: {
modules?: CommonTypes.ConfigModule["modules"]
projectConfig: CommonTypes.ConfigModule["projectConfig"]
}
container: MedusaContainer
},
config = { registerInContainer: true }
): Promise<void> {
const featureFlagRouter = container.resolve<FlagRouter>("featureFlagRouter")
const isMedusaV2Enabled = featureFlagRouter.isFeatureEnabled(MedusaV2Flag.key)
const injectedDependencies = {
[ContainerRegistrationKeys.PG_CONNECTION]: container.resolve(
ContainerRegistrationKeys.PG_CONNECTION
),
}
const sharedResourcesConfig = {
database: {
clientUrl: configModule.projectConfig.database_url,
driverOptions: configModule.projectConfig.database_extra,
},
}
const configModules = mergeDefaultModules(configModule.modules)
// Apply default options to legacy modules
for (const moduleKey of Object.keys(configModules)) {
if (!ModulesDefinition[moduleKey].isLegacy) {
continue
}
if (isObject(configModules[moduleKey])) {
;(
configModules[moduleKey] as Partial<InternalModuleDeclaration>
).options ??= {
database: {
type: "postgres",
url: configModule.projectConfig.database_url,
extra: configModule.projectConfig.database_extra,
schema: configModule.projectConfig.database_schema,
logging: configModule.projectConfig.database_logging,
},
}
}
}
await MedusaAppMigrateUp({
modulesConfig: configModules,
servicesConfig: joinerConfig,
remoteFetchData: remoteQueryFetchData(container),
sharedContainer: container,
sharedResourcesConfig,
injectedDependencies,
})
}
export const loadMedusaApp = async (
{
configModule,