From e78c47b66fe99f5d242ca119dea580804a31768c Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Wed, 2 Aug 2023 13:50:06 +0200 Subject: [PATCH] fix(workflows): Workflow types (#4673) * fix(workflow): types and handlers * add middleware pipe example * Create nine-gorillas-collect.md --- .changeset/nine-gorillas-collect.md | 5 ++++ .../src/handlers/attach-inventory-items.ts | 16 +++++-------- .../src/handlers/create-inventory-items.ts | 23 ++++++++++--------- .../workflows/src/handlers/create-products.ts | 16 ++++--------- .../create-products-prepare-data.ts | 9 ++++++++ .../src/handlers/remove-inventory-items.ts | 17 +++++--------- .../workflows/src/handlers/remove-products.ts | 13 ++++------- packages/workflows/src/helper/pipe.ts | 16 ++++++++----- 8 files changed, 56 insertions(+), 59 deletions(-) create mode 100644 .changeset/nine-gorillas-collect.md create mode 100644 packages/workflows/src/handlers/middlewares/create-products-prepare-data.ts diff --git a/.changeset/nine-gorillas-collect.md b/.changeset/nine-gorillas-collect.md new file mode 100644 index 0000000000..9cbbec8adf --- /dev/null +++ b/.changeset/nine-gorillas-collect.md @@ -0,0 +1,5 @@ +--- +"@medusajs/workflows": patch +--- + +Feat/workflow confusion elimination diff --git a/packages/workflows/src/handlers/attach-inventory-items.ts b/packages/workflows/src/handlers/attach-inventory-items.ts index 19806b82d0..c366aaa4ba 100644 --- a/packages/workflows/src/handlers/attach-inventory-items.ts +++ b/packages/workflows/src/handlers/attach-inventory-items.ts @@ -1,9 +1,10 @@ import { InventoryItemDTO, ProductTypes } from "@medusajs/types" import { InputAlias } from "../definitions" -import { WorkflowArguments } from "../helper" +import { PipelineHandlerResult, WorkflowArguments } from "../helper" +import { ProductVariantInventoryItem } from "@medusajs/medusa/src" -export async function attachInventoryItems({ +export async function attachInventoryItems({ container, data, }: WorkflowArguments & { @@ -11,13 +12,13 @@ export async function attachInventoryItems({ variant: ProductTypes.ProductVariantDTO [InputAlias.InventoryItems]: InventoryItemDTO }[] -}) { +}): Promise> { const manager = container.resolve("manager") const productVariantInventoryService = container .resolve("productVariantInventoryService") .withTransaction(manager) - const value = await Promise.all( + return (await Promise.all( data .filter((d) => d) .map(async ({ variant, [InputAlias.InventoryItems]: inventoryItem }) => { @@ -26,10 +27,5 @@ export async function attachInventoryItems({ inventoryItem.id ) }) - ) - - return { - alias: InputAlias.AttachedInventoryItems, - value, - } + )) as PipelineHandlerResult } diff --git a/packages/workflows/src/handlers/create-inventory-items.ts b/packages/workflows/src/handlers/create-inventory-items.ts index 937dc89c82..cbb55c944f 100644 --- a/packages/workflows/src/handlers/create-inventory-items.ts +++ b/packages/workflows/src/handlers/create-inventory-items.ts @@ -1,16 +1,22 @@ -import { IInventoryService, ProductTypes } from "@medusajs/types" +import { + IInventoryService, + InventoryItemDTO, + ProductTypes, +} from "@medusajs/types" import { InputAlias } from "../definitions" -import { WorkflowArguments } from "../helper" +import { PipelineHandlerResult, WorkflowArguments } from "../helper" -export async function createInventoryItems({ +export async function createInventoryItems< + T = { variant: any; inventoryItem: InventoryItemDTO }[] +>({ container, data, }: WorkflowArguments & { data: { [InputAlias.Products]: ProductTypes.ProductDTO[] } -}) { +}): Promise> { const manager = container.resolve("manager") const inventoryService: IInventoryService = container.resolve("inventoryService") @@ -27,7 +33,7 @@ export async function createInventoryItems({ [] ) - const value = await Promise.all( + return (await Promise.all( variants.map(async (variant) => { if (!variant.manage_inventory) { return @@ -50,10 +56,5 @@ export async function createInventoryItems({ return { variant, inventoryItem } }) - ) - - return { - alias: InputAlias.InventoryItems, - value, - } + )) as PipelineHandlerResult } diff --git a/packages/workflows/src/handlers/create-products.ts b/packages/workflows/src/handlers/create-products.ts index 539f167475..bce090e289 100644 --- a/packages/workflows/src/handlers/create-products.ts +++ b/packages/workflows/src/handlers/create-products.ts @@ -1,23 +1,15 @@ import { InputAlias } from "../definitions" import { ProductTypes } from "@medusajs/types" -import { WorkflowArguments } from "../helper" +import { PipelineHandlerResult, WorkflowArguments } from "../helper" -export async function createProducts({ +export async function createProducts({ container, context, data, }: WorkflowArguments & { data: { [InputAlias.Products]: ProductTypes.CreateProductDTO[] } -}) { +}): Promise> { const productModuleService = container.resolve("productModuleService") - const value = await productModuleService.create( - data[InputAlias.Products], - context - ) - - return { - alias: InputAlias.Products, - value, - } + return await productModuleService.create(data[InputAlias.Products], context) } diff --git a/packages/workflows/src/handlers/middlewares/create-products-prepare-data.ts b/packages/workflows/src/handlers/middlewares/create-products-prepare-data.ts new file mode 100644 index 0000000000..0a041cc35a --- /dev/null +++ b/packages/workflows/src/handlers/middlewares/create-products-prepare-data.ts @@ -0,0 +1,9 @@ +import { InputAlias } from "../../definitions" +import { PipelineHandlerResult } from "../../helper" + +export function createProductsPrepareData({ data }): PipelineHandlerResult { + return { + alias: InputAlias.Products as string, + value: [{}], + } +} diff --git a/packages/workflows/src/handlers/remove-inventory-items.ts b/packages/workflows/src/handlers/remove-inventory-items.ts index 301245f91d..5ee6baef07 100644 --- a/packages/workflows/src/handlers/remove-inventory-items.ts +++ b/packages/workflows/src/handlers/remove-inventory-items.ts @@ -1,31 +1,26 @@ -import { InventoryItemDTO, MedusaContainer } from "@medusajs/types" +import { InventoryItemDTO } from "@medusajs/types" import { InputAlias } from "../definitions" -import { WorkflowArguments } from "../helper" +import { PipelineHandlerResult, WorkflowArguments } from "../helper" -export async function removeInventoryItems({ +export async function removeInventoryItems({ container, data, }: WorkflowArguments & { data: { [InputAlias.InventoryItems]: InventoryItemDTO }[] -}) { +}): Promise> { const manager = container.resolve("manager") const inventoryService = container.resolve("inventoryService") const context = { transactionManager: manager } - const value = await Promise.all( + return (await Promise.all( data.map(async ({ [InputAlias.InventoryItems]: inventoryItem }) => { return await inventoryService!.deleteInventoryItem( inventoryItem.id, context ) }) - ) - - return { - alias: InputAlias.RemovedInventoryItems, - value, - } + )) as PipelineHandlerResult } diff --git a/packages/workflows/src/handlers/remove-products.ts b/packages/workflows/src/handlers/remove-products.ts index b9a0dbe3a2..2faf072422 100644 --- a/packages/workflows/src/handlers/remove-products.ts +++ b/packages/workflows/src/handlers/remove-products.ts @@ -1,22 +1,17 @@ import { InputAlias } from "../definitions" import { ProductTypes } from "@medusajs/types" -import { WorkflowArguments } from "../helper" +import { PipelineHandlerResult, WorkflowArguments } from "../helper" -export async function removeProducts({ +export async function removeProducts({ container, data, }: WorkflowArguments & { data: { [InputAlias.Products]: ProductTypes.ProductDTO[] } -}) { +}): Promise> { const productModuleService = container.resolve("productModuleService") - const value = await productModuleService.softDelete( + return await productModuleService.softDelete( data[InputAlias.Products].map((p) => p.id) ) - - return { - alias: InputAlias.RemovedProducts, - value, - } } diff --git a/packages/workflows/src/helper/pipe.ts b/packages/workflows/src/helper/pipe.ts index 6f150d2093..634e7bbf59 100644 --- a/packages/workflows/src/helper/pipe.ts +++ b/packages/workflows/src/helper/pipe.ts @@ -6,20 +6,20 @@ import { import { InputAlias } from "../definitions" -type WorkflowStepReturn = { +type WorkflowStepMiddlewareReturn = { alias: string value: any } -type WorkflowStepInput = { +type WorkflowStepMiddlewareInput = { from: string alias: string } interface PipelineInput { inputAlias?: InputAlias | string - invoke?: WorkflowStepInput | WorkflowStepInput[] - compensate?: WorkflowStepInput | WorkflowStepInput[] + invoke?: WorkflowStepMiddlewareInput | WorkflowStepMiddlewareInput[] + compensate?: WorkflowStepMiddlewareInput | WorkflowStepMiddlewareInput[] } export type WorkflowArguments = { @@ -30,9 +30,13 @@ export type WorkflowArguments = { context: Context | SharedContext } -export type PipelineHandler = ( +export type PipelineHandlerResult = T extends undefined + ? WorkflowStepMiddlewareReturn | WorkflowStepMiddlewareReturn[] + : T + +export type PipelineHandler = ( args: WorkflowArguments -) => Promise +) => PipelineHandlerResult | Promise> export function pipe( input: PipelineInput,