feat: add hooks to product module's workflows (#8389)

This commit is contained in:
Harminder Virk
2024-08-01 22:02:07 +05:30
committed by GitHub
parent 5ed5b45cce
commit 6efdba1967
19 changed files with 247 additions and 72 deletions

View File

@@ -4,6 +4,7 @@ import { batchLinkProductsToCollectionStep } from "../steps/batch-link-products-
export const batchLinkProductsToCollectionWorkflowId =
"batch-link-products-to-collection"
export const batchLinkProductsToCollectionWorkflow = createWorkflow(
batchLinkProductsToCollectionWorkflowId,
(input: WorkflowData<LinkWorkflowInput>): WorkflowData<void> => {

View File

@@ -2,18 +2,28 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { createCollectionsStep } from "../steps"
type WorkflowInput = { collections: ProductTypes.CreateProductCollectionDTO[] }
type WorkflowInput = {
collections: ProductTypes.CreateProductCollectionDTO[]
additional_data?: Record<string, unknown>
}
export const createCollectionsWorkflowId = "create-collections"
export const createCollectionsWorkflow = createWorkflow(
createCollectionsWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductCollectionDTO[]> => {
return new WorkflowResponse(createCollectionsStep(input.collections))
(input: WorkflowData<WorkflowInput>) => {
const collections = createCollectionsStep(input.collections)
const collectionsCreated = createHook("collectionsCreated", {
collections,
additional_data: input.additional_data,
})
return new WorkflowResponse(collections, {
hooks: [collectionsCreated],
})
}
)

View File

@@ -2,18 +2,29 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { createProductOptionsStep } from "../steps"
type WorkflowInput = { product_options: ProductTypes.CreateProductOptionDTO[] }
type WorkflowInput = {
product_options: ProductTypes.CreateProductOptionDTO[]
additional_data?: Record<string, unknown>
}
export const createProductOptionsWorkflowId = "create-product-options"
export const createProductOptionsWorkflow = createWorkflow(
createProductOptionsWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductOptionDTO[]> => {
return new WorkflowResponse(createProductOptionsStep(input.product_options))
(input: WorkflowData<WorkflowInput>) => {
const productOptions = createProductOptionsStep(input.product_options)
const productOptionsCreated = createHook("productOptionsCreated", {
product_options: productOptions,
additional_data: input.additional_data,
})
return new WorkflowResponse(productOptions, {
hooks: [productOptionsCreated],
})
}
)

View File

@@ -2,18 +2,29 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { createProductTagsStep } from "../steps"
type WorkflowInput = { product_tags: ProductTypes.CreateProductTagDTO[] }
type WorkflowInput = {
product_tags: ProductTypes.CreateProductTagDTO[]
additional_data?: Record<string, unknown>
}
export const createProductTagsWorkflowId = "create-product-tags"
export const createProductTagsWorkflow = createWorkflow(
createProductTagsWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductTagDTO[]> => {
return new WorkflowResponse(createProductTagsStep(input.product_tags))
(input: WorkflowData<WorkflowInput>) => {
const productTags = createProductTagsStep(input.product_tags)
const productTagsCreated = createHook("productTagsCreated", {
product_tags: productTags,
additional_data: input.additional_data,
})
return new WorkflowResponse(productTags, {
hooks: [productTagsCreated],
})
}
)

View File

@@ -2,18 +2,29 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { createProductTypesStep } from "../steps"
type WorkflowInput = { product_types: ProductTypes.CreateProductTypeDTO[] }
type WorkflowInput = {
product_types: ProductTypes.CreateProductTypeDTO[]
additional_data?: Record<string, unknown>
}
export const createProductTypesWorkflowId = "create-product-types"
export const createProductTypesWorkflow = createWorkflow(
createProductTypesWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductTypeDTO[]> => {
return new WorkflowResponse(createProductTypesStep(input.product_types))
(input: WorkflowData<WorkflowInput>) => {
const productTypes = createProductTypesStep(input.product_types)
const productTypesCreated = createHook("productTypesCreated", {
product_types: productTypes,
additional_data: input.additional_data,
})
return new WorkflowResponse(productTypes, {
hooks: [productTypesCreated],
})
}
)

View File

@@ -3,6 +3,7 @@ import { InventoryTypes, PricingTypes, ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
transform,
} from "@medusajs/workflows-sdk"
@@ -24,6 +25,7 @@ type WorkflowInput = {
required_quantity?: number
}[]
})[]
additional_data?: Record<string, unknown>
}
const buildLink = (
@@ -118,11 +120,10 @@ const buildVariantItemCreateMap = (data: {
}
export const createProductVariantsWorkflowId = "create-product-variants"
export const createProductVariantsWorkflow = createWorkflow(
createProductVariantsWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductVariantDTO[]> => {
(input: WorkflowData<WorkflowInput>) => {
// Passing prices to the product module will fail, we want to keep them for after the variant is created.
const variantsWithoutPrices = transform({ input }, (data) =>
data.input.product_variants.map((v) => ({
@@ -224,6 +225,13 @@ export const createProductVariantsWorkflow = createWorkflow(
}
)
return new WorkflowResponse(response)
const productVariantsCreated = createHook("productVariantsCreated", {
product_variants: response,
additional_data: input.additional_data,
})
return new WorkflowResponse(response, {
hooks: [productVariantsCreated],
})
}
)

View File

@@ -7,6 +7,7 @@ import { isPresent } from "@medusajs/utils"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
transform,
} from "@medusajs/workflows-sdk"
@@ -16,14 +17,14 @@ import { createProductVariantsWorkflow } from "./create-product-variants"
type WorkflowInput = {
products: CreateProductWorkflowInputDTO[]
additional_data?: Record<string, unknown>
}
export const createProductsWorkflowId = "create-products"
export const createProductsWorkflow = createWorkflow(
createProductsWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductDTO[]> => {
(input: WorkflowData<WorkflowInput>) => {
// Passing prices to the product module will fail, we want to keep them for after the product is created.
const productWithoutExternalRelations = transform({ input }, (data) =>
data.input.products.map((p) => ({
@@ -98,6 +99,13 @@ export const createProductsWorkflow = createWorkflow(
}
)
return new WorkflowResponse(response)
const productsCreated = createHook("productsCreated", {
products: response,
additional_data: input.additional_data,
})
return new WorkflowResponse(response, {
hooks: [productsCreated],
})
}
)

View File

@@ -1,12 +1,25 @@
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { deleteCollectionsStep } from "../steps"
type WorkflowInput = { ids: string[] }
export const deleteCollectionsWorkflowId = "delete-collections"
export const deleteCollectionsWorkflow = createWorkflow(
deleteCollectionsWorkflowId,
(input: WorkflowData<WorkflowInput>): WorkflowData<void> => {
return deleteCollectionsStep(input.ids)
(input: WorkflowData<WorkflowInput>) => {
const deletedCollections = deleteCollectionsStep(input.ids)
const collectionsDeleted = createHook("collectionsDeleted", {
ids: input.ids,
})
return new WorkflowResponse(deletedCollections, {
hooks: [collectionsDeleted],
})
}
)

View File

@@ -1,4 +1,9 @@
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { deleteProductOptionsStep } from "../steps"
type WorkflowInput = { ids: string[] }
@@ -6,7 +11,14 @@ type WorkflowInput = { ids: string[] }
export const deleteProductOptionsWorkflowId = "delete-product-options"
export const deleteProductOptionsWorkflow = createWorkflow(
deleteProductOptionsWorkflowId,
(input: WorkflowData<WorkflowInput>): WorkflowData<void> => {
return deleteProductOptionsStep(input.ids)
(input: WorkflowData<WorkflowInput>) => {
const deletedProductOptions = deleteProductOptionsStep(input.ids)
const productOptionsDeleted = createHook("productOptionsDeleted", {
ids: input.ids,
})
return new WorkflowResponse(deletedProductOptions, {
hooks: [productOptionsDeleted],
})
}
)

View File

@@ -1,4 +1,9 @@
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { deleteProductTagsStep } from "../steps"
type WorkflowInput = { ids: string[] }
@@ -6,7 +11,14 @@ type WorkflowInput = { ids: string[] }
export const deleteProductTagsWorkflowId = "delete-product-tags"
export const deleteProductTagsWorkflow = createWorkflow(
deleteProductTagsWorkflowId,
(input: WorkflowData<WorkflowInput>): WorkflowData<void> => {
return deleteProductTagsStep(input.ids)
(input: WorkflowData<WorkflowInput>) => {
const deletedProductTags = deleteProductTagsStep(input.ids)
const productTagsDeleted = createHook("productTagsDeleted", {
ids: input.ids,
})
return new WorkflowResponse(deletedProductTags, {
hooks: [productTagsDeleted],
})
}
)

View File

@@ -1,4 +1,9 @@
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { deleteProductTypesStep } from "../steps"
type WorkflowInput = { ids: string[] }
@@ -6,7 +11,14 @@ type WorkflowInput = { ids: string[] }
export const deleteProductTypesWorkflowId = "delete-product-types"
export const deleteProductTypesWorkflow = createWorkflow(
deleteProductTypesWorkflowId,
(input: WorkflowData<WorkflowInput>): WorkflowData<void> => {
return deleteProductTypesStep(input.ids)
(input: WorkflowData<WorkflowInput>) => {
const deletedProductTypes = deleteProductTypesStep(input.ids)
const productTypesDeleted = createHook("productTypesDeleted", {
ids: input.ids,
})
return new WorkflowResponse(deletedProductTypes, {
hooks: [productTypesDeleted],
})
}
)

View File

@@ -1,4 +1,9 @@
import { createWorkflow, WorkflowData } from "@medusajs/workflows-sdk"
import {
createHook,
createWorkflow,
WorkflowData,
WorkflowResponse,
} from "@medusajs/workflows-sdk"
import { deleteProductVariantsStep } from "../steps"
import { removeRemoteLinkStep } from "../../common"
import { Modules } from "@medusajs/utils"
@@ -8,11 +13,18 @@ type WorkflowInput = { ids: string[] }
export const deleteProductVariantsWorkflowId = "delete-product-variants"
export const deleteProductVariantsWorkflow = createWorkflow(
deleteProductVariantsWorkflowId,
(input: WorkflowData<WorkflowInput>): WorkflowData<void> => {
(input: WorkflowData<WorkflowInput>) => {
removeRemoteLinkStep({
[Modules.PRODUCT]: { variant_id: input.ids },
}).config({ name: "remove-variant-link-step" })
return deleteProductVariantsStep(input.ids)
const deletedProductVariants = deleteProductVariantsStep(input.ids)
const productVariantsDeleted = createHook("productVariantsDeleted", {
ids: input.ids,
})
return new WorkflowResponse(deletedProductVariants, {
hooks: [productVariantsDeleted],
})
}
)

View File

@@ -1,8 +1,10 @@
import {
createHook,
createWorkflow,
parallelize,
transform,
WorkflowData,
WorkflowResponse,
} from "@medusajs/workflows-sdk"
import { removeRemoteLinkStep } from "../../common"
import { deleteProductsStep } from "../steps/delete-products"
@@ -14,7 +16,7 @@ type WorkflowInput = { ids: string[] }
export const deleteProductsWorkflowId = "delete-products"
export const deleteProductsWorkflow = createWorkflow(
deleteProductsWorkflowId,
(input: WorkflowData<WorkflowInput>): WorkflowData<void> => {
(input: WorkflowData<WorkflowInput>) => {
const productsToDelete = getProductsStep({ ids: input.ids })
const variantsToBeDeleted = transform({ productsToDelete }, (data) => {
return data.productsToDelete
@@ -32,6 +34,12 @@ export const deleteProductsWorkflow = createWorkflow(
deleteProductsStep(input.ids)
)
return deletedProduct
const productsDeleted = createHook("productsDeleted", {
ids: input.ids,
})
return new WorkflowResponse(deletedProduct, {
hooks: [productsDeleted],
})
}
)

View File

@@ -2,6 +2,7 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { updateCollectionsStep } from "../steps"
@@ -9,6 +10,7 @@ import { updateCollectionsStep } from "../steps"
type UpdateCollectionsStepInput = {
selector: ProductTypes.FilterableProductCollectionProps
update: ProductTypes.UpdateProductCollectionDTO
additional_data?: Record<string, unknown>
}
type WorkflowInput = UpdateCollectionsStepInput
@@ -16,9 +18,15 @@ type WorkflowInput = UpdateCollectionsStepInput
export const updateCollectionsWorkflowId = "update-collections"
export const updateCollectionsWorkflow = createWorkflow(
updateCollectionsWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductCollectionDTO[]> => {
return new WorkflowResponse(updateCollectionsStep(input))
(input: WorkflowData<WorkflowInput>) => {
const updatedCollections = updateCollectionsStep(input)
const collectionsUpdated = createHook("collectionsUpdated", {
additional_data: input.additional_data,
collections: updateCollectionsStep,
})
return new WorkflowResponse(updatedCollections, {
hooks: [collectionsUpdated],
})
}
)

View File

@@ -2,6 +2,7 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { updateProductOptionsStep } from "../steps"
@@ -9,6 +10,7 @@ import { updateProductOptionsStep } from "../steps"
type UpdateProductOptionsStepInput = {
selector: ProductTypes.FilterableProductOptionProps
update: ProductTypes.UpdateProductOptionDTO
additional_data?: Record<string, unknown>
}
type WorkflowInput = UpdateProductOptionsStepInput
@@ -16,9 +18,15 @@ type WorkflowInput = UpdateProductOptionsStepInput
export const updateProductOptionsWorkflowId = "update-product-options"
export const updateProductOptionsWorkflow = createWorkflow(
updateProductOptionsWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductOptionDTO[]> => {
return new WorkflowResponse(updateProductOptionsStep(input))
(input: WorkflowData<WorkflowInput>) => {
const updatedProductOptions = updateProductOptionsStep(input)
const productOptionsUpdated = createHook("productOptionsUpdated", {
product_options: updatedProductOptions,
additional_data: input.additional_data,
})
return new WorkflowResponse(updatedProductOptions, {
hooks: [productOptionsUpdated],
})
}
)

View File

@@ -2,6 +2,7 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { updateProductTagsStep } from "../steps"
@@ -9,6 +10,7 @@ import { updateProductTagsStep } from "../steps"
type UpdateProductTagsStepInput = {
selector: ProductTypes.FilterableProductTypeProps
update: ProductTypes.UpdateProductTypeDTO
additional_data?: Record<string, unknown>
}
type WorkflowInput = UpdateProductTagsStepInput
@@ -16,9 +18,14 @@ type WorkflowInput = UpdateProductTagsStepInput
export const updateProductTagsWorkflowId = "update-product-tags"
export const updateProductTagsWorkflow = createWorkflow(
updateProductTagsWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductTagDTO[]> => {
return new WorkflowResponse(updateProductTagsStep(input))
(input: WorkflowData<WorkflowInput>) => {
const updatedProductTags = updateProductTagsStep(input)
const productTagsUpdated = createHook("productTagsUpdated", {
product_tags: updatedProductTags,
additional_data: input.additional_data,
})
return new WorkflowResponse(updatedProductTags, {
hooks: [productTagsUpdated],
})
}
)

View File

@@ -2,6 +2,7 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { updateProductTypesStep } from "../steps"
@@ -9,6 +10,7 @@ import { updateProductTypesStep } from "../steps"
type UpdateProductTypesStepInput = {
selector: ProductTypes.FilterableProductTypeProps
update: ProductTypes.UpdateProductTypeDTO
additional_data?: Record<string, unknown>
}
type WorkflowInput = UpdateProductTypesStepInput
@@ -16,9 +18,15 @@ type WorkflowInput = UpdateProductTypesStepInput
export const updateProductTypesWorkflowId = "update-product-types"
export const updateProductTypesWorkflow = createWorkflow(
updateProductTypesWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductTypeDTO[]> => {
return new WorkflowResponse(updateProductTypesStep(input))
(input: WorkflowData<WorkflowInput>) => {
const updatedProductTypes = updateProductTypesStep(input)
const productTypesUpdated = createHook("productTypesUpdated", {
product_types: updatedProductTypes,
additional_data: input.additional_data,
})
return new WorkflowResponse(updatedProductTypes, {
hooks: [productTypesUpdated],
})
}
)

View File

@@ -2,6 +2,7 @@ import { PricingTypes, ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
transform,
} from "@medusajs/workflows-sdk"
@@ -22,14 +23,14 @@ type UpdateProductVariantsStepInput =
})[]
}
type WorkflowInput = UpdateProductVariantsStepInput
type WorkflowInput = UpdateProductVariantsStepInput & {
additional_data?: Record<string, unknown>
}
export const updateProductVariantsWorkflowId = "update-product-variants"
export const updateProductVariantsWorkflow = createWorkflow(
updateProductVariantsWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductVariantDTO[]> => {
(input: WorkflowData<WorkflowInput>) => {
// Passing prices to the product module will fail, we want to keep them for after the variant is updated.
const updateWithoutPrices = transform({ input }, (data) => {
if ("product_variants" in data.input) {
@@ -120,7 +121,7 @@ export const updateProductVariantsWorkflow = createWorkflow(
updatedPriceSets,
},
(data) => {
return data.updatedVariants.map((variant, i) => {
return data.updatedVariants.map((variant) => {
const linkForVariant = data.variantPriceSetLinks?.find(
(link) => link.variant_id === variant.id
)
@@ -134,6 +135,13 @@ export const updateProductVariantsWorkflow = createWorkflow(
}
)
return new WorkflowResponse(response)
const productVariantsUpdated = createHook("productVariantsUpdated", {
product_variants: response,
additional_data: input.additional_data,
})
return new WorkflowResponse(response, {
hooks: [productVariantsUpdated],
})
}
)

View File

@@ -7,6 +7,7 @@ import {
} from "@medusajs/types"
import { arrayDifference, Modules } from "@medusajs/utils"
import {
createHook,
createWorkflow,
transform,
WorkflowData,
@@ -26,6 +27,7 @@ type UpdateProductsStepInputSelector = {
sales_channels?: { id: string }[]
variants?: UpdateProductVariantWorkflowInputDTO[]
}
additional_data?: Record<string, unknown>
}
type UpdateProductsStepInputProducts = {
@@ -33,6 +35,7 @@ type UpdateProductsStepInputProducts = {
sales_channels?: { id: string }[]
variants?: UpdateProductVariantWorkflowInputDTO[]
})[]
additional_data?: Record<string, unknown>
}
type UpdateProductsStepInput =
@@ -210,9 +213,7 @@ function prepareToDeleteSalesChannelLinks({
export const updateProductsWorkflowId = "update-products"
export const updateProductsWorkflow = createWorkflow(
updateProductsWorkflowId,
(
input: WorkflowData<WorkflowInput>
): WorkflowResponse<ProductTypes.ProductDTO[]> => {
(input: WorkflowData<WorkflowInput>) => {
const previousVariantIds = getVariantIdsForProductsStep(input)
const toUpdateInput = transform({ input }, prepareUpdateProductInput)
@@ -248,9 +249,15 @@ export const updateProductsWorkflow = createWorkflow(
})
dismissRemoteLinkStep(toDeleteSalesChannelLinks)
createRemoteLinkStep(salesChannelLinks)
return new WorkflowResponse(updatedProducts)
const productsUpdated = createHook("productsUpdated", {
products: updatedProducts,
additional_data: input.additional_data,
})
return new WorkflowResponse(updatedProducts, {
hooks: [productsUpdated],
})
}
)