Skip to content

fix: for exact metada match for multiple items with same variant_id#14730

Closed
jbrigbyjs wants to merge 7 commits intomedusajs:developfrom
jbrigbyjs:get-line-item-axtions-fix
Closed

fix: for exact metada match for multiple items with same variant_id#14730
jbrigbyjs wants to merge 7 commits intomedusajs:developfrom
jbrigbyjs:get-line-item-axtions-fix

Conversation

@jbrigbyjs
Copy link
Copy Markdown
Contributor

@jbrigbyjs jbrigbyjs commented Feb 9, 2026

Summary

What — What changes are introduced in this PR?

Updated the cart line-item action resolution logic to correctly handle cases where multiple cart line items share the same variant_id but differ in metadata.

The step now:

  • Groups existing cart items by variant_id (as an array, not a single item).
  • Matches items using deep metadata equality.
  • Accumulates updates per existing line-item id to avoid emitting duplicate updates for the same record.

Why — Why are these changes relevant or necessary?

The previous approach implicitly assumed variant_id is unique per cart line item. In real scenarios, the same variant can exist multiple times in the cart with different metadata (e.g., different dates, room details, bundle context).

Using a Map<variant_id, item> causes overwriting and can result in:

  • Updating the wrong line item,
  • Incorrect quantity merges,
  • Or creating duplicates instead of updating the intended line.

How — How have these changes been implemented?

  • Fetch existing cart line items for the relevant variant_ids.
  • Build a structure: variant_id -> CartLineItemDTO[] (list of candidates).
  • For each incoming item:
    • Find a candidate with matching metadata (deepEqualObj, with proper handling of missing metadata).
    • If found, compute the new quantity and store a single update entry per line_item.id in updatesById.
    • If not found, add the item to itemsToCreate.
  • Return { itemsToCreate, itemsToUpdate }, where itemsToUpdate is derived from updatesById.values().

ISSUE

#14731


Note

Medium Risk
Changes cart line-item merge/update resolution logic used by add-to-cart workflows; incorrect matching could affect cart quantities/prices, but scope is limited and covered by a new integration test.

Overview
Fixes cart line-item action resolution so items are merged/updated only when both variant_id and metadata match, allowing multiple line items with the same variant to coexist.

get-line-item-actions-step now groups existing items per variant_id, deep-compares metadata to choose the correct line item, deduplicates requested variant IDs for lookups, and accumulates updates per line-item id to avoid emitting multiple updates for the same record. Adds an integration test covering add-A/meta-A, add-A/meta-B, then add-A/meta-A merging quantities correctly, plus a patch changeset for @medusajs/core-flows.

Written by Cursor Bugbot for commit 6546491. This will update automatically on new commits. Configure here.

@jbrigbyjs jbrigbyjs requested a review from a team as a code owner February 9, 2026 14:47
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Feb 9, 2026

🦋 Changeset detected

Latest commit: 6546491

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

This PR includes changesets to release 76 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/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

@vercel
Copy link
Copy Markdown

vercel bot commented Feb 9, 2026

@jbrigbyjs is attempting to deploy a commit to the medusajs Team on Vercel.

A member of the Team first needs to authorize it.

@carlos-r-l-rodrigues
Copy link
Copy Markdown
Contributor

Hi @jbrigbyjs,
Thanks for the PR.
would you mind creating a new test case for that here: integration-tests/modules/__tests__/cart/store/carts.spec.ts

@NicolasGorga
Copy link
Copy Markdown
Contributor

Hey @jbrigbyjs thanks for the contribution. I will go ahead and close this, though, as I've included this fix as part of #14834 while also handling unit_price differences to decide upon updating/creating

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants