feat(region): Region create, delete, update admin endpoints (#6332)

**What**
Add `POST /admin/regions`
Add `POST /admin/regions/:id`
Add `DELETE /admin/regions/:id`

All are added for v2 using API Routes and workflows.

In follow-up PRs, I will add support for passing countries in update and create.

Update: First follow-up PR is #6372
This commit is contained in:
Oli Juhl
2024-02-20 10:19:07 +00:00
committed by GitHub
parent 1d91b7429b
commit 691f68c3b8
22 changed files with 586 additions and 169 deletions
+6 -4
View File
@@ -1,8 +1,10 @@
export * from "./customer"
export * from "./customer-group"
export * from "./definition"
export * from "./definitions"
export * as Handlers from "./handlers"
export * from "./promotion"
export * from "./customer"
export * from "./customer-group"
export * from "./user"
export * from "./invite"
export * from "./promotion"
export * from "./region"
export * from "./user"
+2
View File
@@ -0,0 +1,2 @@
export * from "./steps"
export * from "./workflows"
@@ -0,0 +1,31 @@
import { ModuleRegistrationName } from "@medusajs/modules-sdk"
import { CreateRegionDTO, IRegionModuleService } from "@medusajs/types"
import { StepResponse, createStep } from "@medusajs/workflows-sdk"
export const createRegionsStepId = "create-regions"
export const createRegionsStep = createStep(
createRegionsStepId,
async (data: CreateRegionDTO[], { container }) => {
const service = container.resolve<IRegionModuleService>(
ModuleRegistrationName.REGION
)
const created = await service.create(data)
return new StepResponse(
created,
created.map((region) => region.id)
)
},
async (createdIds, { container }) => {
if (!createdIds?.length) {
return
}
const service = container.resolve<IRegionModuleService>(
ModuleRegistrationName.REGION
)
await service.delete(createdIds)
}
)
@@ -0,0 +1,28 @@
import { ModuleRegistrationName } from "@medusajs/modules-sdk"
import { IRegionModuleService } from "@medusajs/types"
import { StepResponse, createStep } from "@medusajs/workflows-sdk"
export const deleteRegionsStepId = "delete-regions"
export const deleteRegionsStep = createStep(
deleteRegionsStepId,
async (ids: string[], { container }) => {
const service = container.resolve<IRegionModuleService>(
ModuleRegistrationName.REGION
)
await service.softDelete(ids)
return new StepResponse(void 0, ids)
},
async (prevIds, { container }) => {
if (!prevIds?.length) {
return
}
const service = container.resolve<IRegionModuleService>(
ModuleRegistrationName.REGION
)
await service.restore(prevIds)
}
)
@@ -0,0 +1,3 @@
export * from "./create-regions"
export * from "./delete-regions"
export * from "./update-regions"
@@ -0,0 +1,54 @@
import { ModuleRegistrationName } from "@medusajs/modules-sdk"
import {
FilterableRegionProps,
IRegionModuleService,
UpdatableRegionFields,
} from "@medusajs/types"
import { getSelectsAndRelationsFromObjectArray } from "@medusajs/utils"
import { StepResponse, createStep } from "@medusajs/workflows-sdk"
type UpdateRegionsStepInput = {
selector: FilterableRegionProps
update: UpdatableRegionFields
}
export const updateRegionsStepId = "update-region"
export const updateRegionsStep = createStep(
updateRegionsStepId,
async (data: UpdateRegionsStepInput, { container }) => {
const service = container.resolve<IRegionModuleService>(
ModuleRegistrationName.REGION
)
const { selects, relations } = getSelectsAndRelationsFromObjectArray([
data.update,
])
const prevData = await service.list(data.selector, {
select: selects,
relations,
})
const regions = await service.update(data.selector, data.update)
return new StepResponse(regions, prevData)
},
async (prevData, { container }) => {
if (!prevData?.length) {
return
}
const service = container.resolve<IRegionModuleService>(
ModuleRegistrationName.REGION
)
await service.update(
prevData.map((r) => ({
id: r.id,
name: r.name,
currency_code: r.currency_code,
metadata: r.metadata,
}))
)
}
)
@@ -0,0 +1,13 @@
import { CreateRegionDTO, RegionDTO } from "@medusajs/types"
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import { createRegionsStep } from "../steps"
type WorkflowInput = { regionsData: CreateRegionDTO[] }
export const createRegionsWorkflowId = "create-regions"
export const createRegionsWorkflow = createWorkflow(
createRegionsWorkflowId,
(input: WorkflowData<WorkflowInput>): WorkflowData<RegionDTO[]> => {
return createRegionsStep(input.regionsData)
}
)
@@ -0,0 +1,12 @@
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import { deleteRegionsStep } from "../steps"
type WorkflowInput = { ids: string[] }
export const deleteRegionsWorkflowId = "delete-regions"
export const deleteRegionsWorkflow = createWorkflow(
deleteRegionsWorkflowId,
(input: WorkflowData<WorkflowInput>): WorkflowData<void> => {
return deleteRegionsStep(input.ids)
}
)
@@ -0,0 +1,3 @@
export * from "./create-regions"
export * from "./delete-regions"
export * from "./update-regions"
@@ -0,0 +1,22 @@
import {
FilterableRegionProps,
RegionDTO,
UpdatableRegionFields,
} from "@medusajs/types"
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import { updateRegionsStep } from "../steps"
type UpdateRegionsStepInput = {
selector: FilterableRegionProps
update: UpdatableRegionFields
}
type WorkflowInput = UpdateRegionsStepInput
export const updateRegionsWorkflowId = "update-regions"
export const updateRegionsWorkflow = createWorkflow(
updateRegionsWorkflowId,
(input: WorkflowData<WorkflowInput>): WorkflowData<RegionDTO[]> => {
return updateRegionsStep(input)
}
)