Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 9 commits into from
Aug 1, 2024
Original file line number Diff line number Diff line change
@@ -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> => {
Original file line number Diff line number Diff line change
@@ -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],
})
}
)
Original file line number Diff line number Diff line change
@@ -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],
})
}
)
Original file line number Diff line number Diff line change
@@ -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],
})
}
)
Original file line number Diff line number Diff line change
@@ -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],
})
}
)
Original file line number Diff line number Diff line change
@@ -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],
})
}
)
Original file line number Diff line number Diff line change
@@ -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],
})
}
)
Original file line number Diff line number Diff line change
@@ -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],
})
}
)
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { deleteProductOptionsStep } from "../steps"

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],
})
}
)
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { deleteProductTagsStep } from "../steps"

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],
})
}
)
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { deleteProductTypesStep } from "../steps"

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],
})
}
)
Original file line number Diff line number Diff line change
@@ -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],
})
}
)
Original file line number Diff line number Diff line change
@@ -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],
})
}
)
Original file line number Diff line number Diff line change
@@ -2,23 +2,31 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { updateCollectionsStep } from "../steps"

type UpdateCollectionsStepInput = {
selector: ProductTypes.FilterableProductCollectionProps
update: ProductTypes.UpdateProductCollectionDTO
additional_data?: Record<string, unknown>
}

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],
})
}
)
Original file line number Diff line number Diff line change
@@ -2,23 +2,31 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { updateProductOptionsStep } from "../steps"

type UpdateProductOptionsStepInput = {
selector: ProductTypes.FilterableProductOptionProps
update: ProductTypes.UpdateProductOptionDTO
additional_data?: Record<string, unknown>
}

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],
})
}
)
Original file line number Diff line number Diff line change
@@ -2,23 +2,30 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { updateProductTagsStep } from "../steps"

type UpdateProductTagsStepInput = {
selector: ProductTypes.FilterableProductTypeProps
update: ProductTypes.UpdateProductTypeDTO
additional_data?: Record<string, unknown>
}

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],
})
}
)
Original file line number Diff line number Diff line change
@@ -2,23 +2,31 @@ import { ProductTypes } from "@medusajs/types"
import {
WorkflowData,
WorkflowResponse,
createHook,
createWorkflow,
} from "@medusajs/workflows-sdk"
import { updateProductTypesStep } from "../steps"

type UpdateProductTypesStepInput = {
selector: ProductTypes.FilterableProductTypeProps
update: ProductTypes.UpdateProductTypeDTO
additional_data?: Record<string, unknown>
}

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],
})
}
)
Original file line number Diff line number Diff line change
@@ -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],
})
}
)
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@ import {
} from "@medusajs/types"
import { arrayDifference, Modules } from "@medusajs/utils"
import {
createHook,
createWorkflow,
transform,
WorkflowData,
@@ -26,13 +27,15 @@ type UpdateProductsStepInputSelector = {
sales_channels?: { id: string }[]
variants?: UpdateProductVariantWorkflowInputDTO[]
}
additional_data?: Record<string, unknown>
}

type UpdateProductsStepInputProducts = {
products: (Omit<ProductTypes.UpsertProductDTO, "variants"> & {
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],
})
}
)