Skip to content

fix(core-flows): consider price and metadata for multiple items linked to a single variant when resolving line action#14834

Open
NicolasGorga wants to merge 7 commits intodevelopfrom
fix/upsert-cart-line-item
Open

fix(core-flows): consider price and metadata for multiple items linked to a single variant when resolving line action#14834
NicolasGorga wants to merge 7 commits intodevelopfrom
fix/upsert-cart-line-item

Conversation

@NicolasGorga
Copy link
Copy Markdown
Contributor

@NicolasGorga NicolasGorga commented Mar 1, 2026

Summary

What — What changes are introduced in this PR?

Update getLineItemActionStep operation (update/create) resolution logic, to handle scenarios where a single variant is linked to multiple line items, such as when having custom price line items, or having added items with normal pricing but different metadata than the existing line item.

Why — Why are these changes relevant or necessary?

We were treating the map of variant <> line item as if it were a one-to-one relation, when in fact a variant can be linked to multiple items, such as when we add different items with different prices or when the metadata is different than the existing item. We were also only taking into consideration the metadata to determine if we should update/create, when in fact, for custom unit price items, we should also compare the unit price.

How — How have these changes been implemented?

Treat the map as a one-to-many relation, where a variant can be linked to multiple items. Also, take unit price into account when the item to be added has a custom price, when comparing against existing items linked to the variant, to determine if we should update/create.

Testing — How have these changes been tested, or how can the reviewer test the feature?

Please provide answer here


Examples

Provide examples or code snippets that demonstrate how this feature works, or how it can be used in practice.
This helps with documentation and ensures maintainers can quickly understand and verify the change.

// Example usage

Checklist

Please ensure the following before requesting a review:

  • I have added a changeset for this PR
    • Every non-breaking change should be marked as a patch
    • To add a changeset, run yarn changeset and follow the prompts
  • The changes are covered by relevant tests
  • I have verified the code works as intended locally
  • I have linked the related issue(s) if applicable

Additional Context

Add any additional context, related issues, or references that might help the reviewer understand this PR.

closes CORE-1378
fixes #14731

@NicolasGorga NicolasGorga requested a review from a team as a code owner March 1, 2026 20:27
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 1, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

9 Skipped Deployments
Project Deployment Actions Updated (UTC)
api-reference Ignored Ignored Apr 10, 2026 9:37pm
api-reference-v2 Ignored Ignored Preview Apr 10, 2026 9:37pm
bloom-docs Ignored Ignored Preview Apr 10, 2026 9:37pm
cloud-docs Ignored Ignored Preview Apr 10, 2026 9:37pm
docs-ui Ignored Ignored Preview Apr 10, 2026 9:37pm
docs-v2 Ignored Ignored Preview Apr 10, 2026 9:37pm
medusa-docs Ignored Ignored Preview Apr 10, 2026 9:37pm
resources-docs Ignored Ignored Preview Apr 10, 2026 9:37pm
user-guide Ignored Ignored Preview Apr 10, 2026 9:37pm

Request Review

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Mar 1, 2026

🦋 Changeset detected

Latest commit: 1a6cef0

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 77 packages
Name Type
@medusajs/core-flows Patch
@medusajs/medusa Patch
@medusajs/test-utils Patch
integration-tests-http Patch
@medusajs/medusa-oas-cli Patch
@medusajs/analytics Patch
@medusajs/api-key Patch
@medusajs/auth Patch
@medusajs/caching Patch
@medusajs/cart Patch
@medusajs/currency Patch
@medusajs/customer Patch
@medusajs/file Patch
@medusajs/fulfillment Patch
@medusajs/index Patch
@medusajs/inventory Patch
@medusajs/link-modules Patch
@medusajs/locking Patch
@medusajs/notification Patch
@medusajs/order Patch
@medusajs/payment Patch
@medusajs/pricing Patch
@medusajs/product Patch
@medusajs/promotion Patch
@medusajs/rbac Patch
@medusajs/region Patch
@medusajs/sales-channel Patch
@medusajs/settings Patch
@medusajs/stock-location Patch
@medusajs/store Patch
@medusajs/tax Patch
@medusajs/translation Patch
@medusajs/user Patch
@medusajs/workflow-engine-inmemory Patch
@medusajs/workflow-engine-redis Patch
@medusajs/draft-order Patch
@medusajs/oas-github-ci Patch
@medusajs/cache-inmemory Patch
@medusajs/cache-redis Patch
@medusajs/event-bus-local Patch
@medusajs/event-bus-redis Patch
@medusajs/analytics-local Patch
@medusajs/analytics-posthog Patch
@medusajs/auth-emailpass Patch
@medusajs/auth-github Patch
@medusajs/auth-google Patch
@medusajs/caching-redis Patch
@medusajs/file-local Patch
@medusajs/file-s3 Patch
@medusajs/fulfillment-manual Patch
@medusajs/locking-postgres Patch
@medusajs/locking-redis Patch
@medusajs/notification-local Patch
@medusajs/notification-sendgrid Patch
@medusajs/payment-stripe Patch
@medusajs/framework Patch
@medusajs/js-sdk Patch
@medusajs/modules-sdk Patch
@medusajs/orchestration Patch
@medusajs/types Patch
@medusajs/utils Patch
@medusajs/workflows-sdk Patch
@medusajs/http-types-generator Patch
@medusajs/cli Patch
@medusajs/deps Patch
@medusajs/telemetry Patch
@medusajs/admin-bundler Patch
@medusajs/admin-sdk Patch
@medusajs/admin-shared Patch
@medusajs/admin-vite-plugin Patch
@medusajs/dashboard Patch
@medusajs/icons Patch
@medusajs/toolbox Patch
@medusajs/ui-preset Patch
create-medusa-app Patch
medusa-dev-cli Patch
@medusajs/ui Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@NicolasGorga NicolasGorga requested a review from olivermrbl March 31, 2026 19:55
@medusa-os-bot
Copy link
Copy Markdown

medusa-os-bot bot commented Apr 9, 2026

Thank you for your contribution! 🎉

After an initial review, this PR looks good to us. Here's a summary:

✅ Linked to a verified issue (#14731)
✅ Changeset included (patch — correct for a bug fix)
✅ Integration tests included (237 additions to cart.spec.ts)
✅ Fix approach is sound

Notes:

  • The Testing section in the PR description was left as a placeholder. For future PRs, filling in the reproduction steps or test instructions helps reviewers verify the fix faster.
  • The one-to-many map refactor and the unit price comparison for custom-price items are both well-motivated by the bug. Worth double-checking in final review that the new matching logic correctly handles the edge case where the same variant appears multiple times in data.items with the same metadata and the same unit price — the updated item should accumulate quantity correctly without creating duplicates.

A team member will do a final review before this is merged. We appreciate your patience!

@shahednasser
Copy link
Copy Markdown
Member

@NicolasGorga keeping it open as I think this is a valid concern:

Worth double-checking in final review that the new matching logic correctly handles the edge case where the same variant appears multiple times in data.items with the same metadata and the same unit price — the updated item should accumulate quantity correctly without creating duplicates.

Comment on lines +1701 to +1713
await addToCartWorkflow(appContainer).run({
input: {
cart_id: cart.id,
items: [
{
variant_id: variantId,
quantity: 1,
unit_price: 999,
metadata,
},
],
},
})
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The edge case here is that you pass two items to the workflow having the same variant, price, and metadata

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @shahednasser, that is tested below, starting from line 1722. Let me know if that is what you meant :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: bug/upgrade, getLineItemActionsStep - matching by metada and variant_id

2 participants