feat(medusa, link-modules): sales channel <> cart link (#5459)
* feat: sales channel joiner config * feat: product sales channel link config, SC list method * feat: migration * fix: refactor list SC * refactor: SC repo api * chore: changeset * feat: add dedicated FF * wip: cart<>sc link and migration * chore: changeset * fix: update migration with the cart table constraints * feat: populate the pivot table * chore: remove relation from joiner config * fix: constraint name * fix: filter out link relations when calling internal services * feat: product<> sc join entity * fix: update case * fix: add FF on in the repository, fix tests * fix: assign id when FF is on * fix: target table * feat: product service - fetch SC with RQ * feat: admin list products & SC with isolated product domain * feat: get admin product * feat: store endpoints * fix: remove duplicate import * fix: remove "name" prop * feat: typeorm entity changes * feat: pivot table, entity, on cart create changes * feat: update carts' SC * feat: cart - getValidatedSalesChannel with RQ * feat: refactor * wip: changes to create cart workflow * fix: remove join table entity due to migrations failing * fix: product seeder if FF is on * feat: attach SC handler and test * fix: env * feat: workflow compensation, cart service retrieve with RQ * fix: remote joiner implode map * chore: update changesets * fix: remove methods from SC service/repo * feat: use remote link in handlers * fix: remove SC service calls * fix: link params * fix: migration add constraint to make link upsert pass * refactor: workflow product handlers to handle remote links * fix: condition * fix: use correct method * fix: build * wip: update FF * fix: update FF in the handlers * chore: migrate to medusav2 FF * chore: uncomment test * fix: product factory * fix: unlinking SC and product * fix: use module name variable * refactor: cleanup query definitions * fix: add constraint * wip: migrate FF * fix: comments * feat: cart entity callbacks, fix tests * fix: only create SC in test * wip: services updates, changes to models * chore: rename prop * fix: add hook * fix: address comments * fix: temp sc filtering * fix: use RQ to filter by SC * fix: relations on retrieve * feat: migration sync data, remove FF * fix: revert order of queries * fix: alter migration, relations in service * fix: revert id * fix: migrations * fix: make expand work * fix: remote link method call * fix: try making tests work without id in the pivot table * test: use remote link * test: relations changes * fix: preserve channel id column * fix: seeder and factory * fix: remove sales_channels from response * feat: support feature flag arrays * fix: cover everything with correct FF * fix: remove verbose * fix: unit and plugin tests * chore: comments * fix: reenable workflow handler, add comments, split cart create workflow tests * chore: reenable link in the create mehod, update changesets * fix: address feedback * fix: revert migration * fix: change the migration to follow link module * fix: migration syntax * fix: merge conflicts * fix: typo * feat: remove store sales channel foreign key * fix: merge migrations * fix: FF keys * refactor: cart service * refactor: FF missing key * fix: comments * fix: address PR comments * fix: new changesets * fix: revert flag router changes * chore: refactor `isFeatureEnabled` --------- Co-authored-by: Carlos R. L. Rodrigues <rodrigolr@gmail.com> Co-authored-by: Riqwan Thamir <rmthamir@gmail.com>
This commit is contained in:
@@ -18,6 +18,7 @@ import { exportWorkflow, pipe } from "@medusajs/workflows-sdk"
|
||||
enum CreateCartActions {
|
||||
setContext = "setContext",
|
||||
attachLineItems = "attachLineItems",
|
||||
attachToSalesChannel = "attachToSalesChannel",
|
||||
findRegion = "findRegion",
|
||||
findSalesChannel = "findSalesChannel",
|
||||
createCart = "createCart",
|
||||
@@ -58,10 +59,13 @@ const workflowSteps: TransactionStepsDefinition = {
|
||||
noCompensation: true,
|
||||
next: {
|
||||
action: CreateCartActions.createCart,
|
||||
next: {
|
||||
action: CreateCartActions.attachLineItems,
|
||||
noCompensation: true,
|
||||
},
|
||||
next: [
|
||||
{
|
||||
action: CreateCartActions.attachLineItems,
|
||||
noCompensation: true,
|
||||
},
|
||||
{ action: CreateCartActions.attachToSalesChannel },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -134,6 +138,10 @@ const handlers = new Map([
|
||||
invoke: pipe(
|
||||
{
|
||||
invoke: [
|
||||
{
|
||||
from: CreateCartActions.findSalesChannel,
|
||||
alias: CartHandlers.createCart.aliases.SalesChannel,
|
||||
},
|
||||
{
|
||||
from: CreateCartActions.findRegion,
|
||||
alias: CartHandlers.createCart.aliases.Region,
|
||||
@@ -186,6 +194,38 @@ const handlers = new Map([
|
||||
),
|
||||
},
|
||||
],
|
||||
[
|
||||
CreateCartActions.attachToSalesChannel,
|
||||
{
|
||||
invoke: pipe(
|
||||
{
|
||||
invoke: [
|
||||
{
|
||||
from: CreateCartActions.createCart,
|
||||
alias: CartHandlers.attachCartToSalesChannel.aliases.Cart,
|
||||
},
|
||||
{
|
||||
from: CreateCartActions.findSalesChannel,
|
||||
alias: CartHandlers.attachCartToSalesChannel.aliases.SalesChannel,
|
||||
},
|
||||
],
|
||||
},
|
||||
CartHandlers.attachCartToSalesChannel
|
||||
),
|
||||
compensate: pipe(
|
||||
{
|
||||
invoke: [
|
||||
{
|
||||
from: CreateCartActions.findSalesChannel,
|
||||
alias:
|
||||
CartHandlers.detachCartFromSalesChannel.aliases.SalesChannel,
|
||||
},
|
||||
],
|
||||
},
|
||||
CartHandlers.detachCartFromSalesChannel
|
||||
),
|
||||
},
|
||||
],
|
||||
])
|
||||
|
||||
WorkflowManager.register(Workflows.CreateCart, workflowSteps, handlers)
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
import { MedusaV2Flag } from "@medusajs/utils"
|
||||
import { WorkflowArguments } from "@medusajs/workflows-sdk"
|
||||
|
||||
type HandlerInputData = {
|
||||
cart: {
|
||||
id: string
|
||||
}
|
||||
sales_channel: {
|
||||
sales_channel_id: string
|
||||
}
|
||||
}
|
||||
|
||||
enum Aliases {
|
||||
Cart = "cart",
|
||||
SalesChannel = "sales_channel",
|
||||
}
|
||||
|
||||
export async function attachCartToSalesChannel({
|
||||
container,
|
||||
data,
|
||||
}: WorkflowArguments<HandlerInputData>): Promise<void> {
|
||||
const featureFlagRouter = container.resolve("featureFlagRouter")
|
||||
const remoteLink = container.resolve("remoteLink")
|
||||
|
||||
if (!featureFlagRouter.isFeatureEnabled(MedusaV2Flag.key)) {
|
||||
return
|
||||
}
|
||||
|
||||
const cart = data[Aliases.Cart]
|
||||
const salesChannel = data[Aliases.SalesChannel]
|
||||
|
||||
await remoteLink.create({
|
||||
cartService: {
|
||||
cart_id: cart.id,
|
||||
},
|
||||
salesChannelService: {
|
||||
sales_channel_id: salesChannel.sales_channel_id,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
attachCartToSalesChannel.aliases = Aliases
|
||||
@@ -47,15 +47,13 @@ export async function createCart({
|
||||
const cartService = container.resolve("cartService")
|
||||
const cartServiceTx = cartService.withTransaction(manager)
|
||||
|
||||
const cart = await cartServiceTx.create({
|
||||
return await cartServiceTx.create({
|
||||
...data[Aliases.SalesChannel],
|
||||
...data[Aliases.Addresses],
|
||||
...data[Aliases.Customer],
|
||||
...data[Aliases.Region],
|
||||
...data[Aliases.Context],
|
||||
})
|
||||
|
||||
return cart
|
||||
}
|
||||
|
||||
createCart.aliases = Aliases
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
import { MedusaV2Flag } from "@medusajs/utils"
|
||||
import { WorkflowArguments } from "@medusajs/workflows-sdk"
|
||||
|
||||
type HandlerInputData = {
|
||||
cart: {
|
||||
id: string
|
||||
}
|
||||
sales_channel: {
|
||||
sales_channel_id: string
|
||||
}
|
||||
}
|
||||
|
||||
enum Aliases {
|
||||
Cart = "cart",
|
||||
SalesChannel = "sales_channel",
|
||||
}
|
||||
|
||||
export async function detachCartFromSalesChannel({
|
||||
container,
|
||||
data,
|
||||
}: WorkflowArguments<HandlerInputData>): Promise<void> {
|
||||
const featureFlagRouter = container.resolve("featureFlagRouter")
|
||||
const remoteLink = container.resolve("remoteLink")
|
||||
|
||||
if (!featureFlagRouter.isFeatureEnabled(MedusaV2Flag.key)) {
|
||||
return
|
||||
}
|
||||
|
||||
const cart = data[Aliases.Cart]
|
||||
const salesChannel = data[Aliases.SalesChannel]
|
||||
|
||||
await remoteLink.dismiss({
|
||||
cartService: {
|
||||
cart_id: cart.id,
|
||||
},
|
||||
salesChannelService: {
|
||||
sales_channel_id: salesChannel.sales_channel_id,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
detachCartFromSalesChannel.aliases = Aliases
|
||||
@@ -2,3 +2,5 @@ export * from "./attach-line-items-to-cart"
|
||||
export * from "./create-cart"
|
||||
export * from "./remove-cart"
|
||||
export * from "./retrieve-cart"
|
||||
export * from "./attach-cart-to-sales-channel"
|
||||
export * from "./detach-cart-from-sales-channel"
|
||||
|
||||
Reference in New Issue
Block a user