From 2336cda2c95970850dd0d29c1c18043ca8c9078a Mon Sep 17 00:00:00 2001 From: eduardoformiga Date: Thu, 6 Aug 2026 17:48:31 -0300 Subject: [PATCH 01/10] fix(api): preserve orderForm sales channel in validateCart Avoid wiping cart items after Quick Order by omitting stale session `sc` on the initial orderForm GET and adopting the orderForm SC when the cart etag is stale. Also defer client validateCart until the first validateSession completes. --- .../platforms/vtex/clients/commerce/index.ts | 18 ++++- .../platforms/vtex/resolvers/validateCart.ts | 45 ++++++++++- .../platforms/vtex/utils/cartSalesChannel.ts | 55 +++++++++++++ .../api/test/mocks/ValidateCartMutation.ts | 6 +- .../platforms/vtex/clients/commerce.test.ts | 55 +++++++++++++ .../vtex/utils/cartSalesChannel.test.ts | 79 +++++++++++++++++++ packages/core/src/sdk/cart/index.ts | 42 +++++++++- packages/core/src/sdk/session/index.ts | 3 + 8 files changed, 294 insertions(+), 9 deletions(-) create mode 100644 packages/api/src/platforms/vtex/utils/cartSalesChannel.ts create mode 100644 packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts diff --git a/packages/api/src/platforms/vtex/clients/commerce/index.ts b/packages/api/src/platforms/vtex/clients/commerce/index.ts index 3e67dc7f37..aeff738104 100644 --- a/packages/api/src/platforms/vtex/clients/commerce/index.ts +++ b/packages/api/src/platforms/vtex/clients/commerce/index.ts @@ -435,21 +435,35 @@ export const VtexCommerce = ( id, refreshOutdatedData = true, channel = ctx.storage.channel, + preserveSalesChannel = false, }: { id?: string refreshOutdatedData?: boolean channel?: Required + /** + * When true, omit the `sc` query param so Checkout keeps the cart's + * current sales channel. Use this when the session SC may be stale + * relative to an external flow (e.g. Quick Order) that already + * advanced the orderForm. + */ + preserveSalesChannel?: boolean }): Promise => { const { salesChannel } = channel const headers: HeadersInit = withCookie({ 'content-type': 'application/json', 'X-FORWARDED-HOST': forwardedHost, }) - const params = new URLSearchParams({ sc: salesChannel }) + const params = new URLSearchParams() + // New carts (no id) always need an explicit SC. Existing carts may + // omit it so Checkout does not recalculate under a stale session SC. + if (!preserveSalesChannel || !id) { + params.set('sc', salesChannel) + } if (id) { params.set('refreshOutdatedData', refreshOutdatedData.toString()) } - const url = `${base}/api/checkout/pub/orderForm${id ? `/${id}` : ''}?${params.toString()}` + const qs = params.toString() + const url = `${base}/api/checkout/pub/orderForm${id ? `/${id}` : ''}${qs ? `?${qs}` : ''}` return fetchAPI( url, diff --git a/packages/api/src/platforms/vtex/resolvers/validateCart.ts b/packages/api/src/platforms/vtex/resolvers/validateCart.ts index 8d0b570ee3..928476d390 100644 --- a/packages/api/src/platforms/vtex/resolvers/validateCart.ts +++ b/packages/api/src/platforms/vtex/resolvers/validateCart.ts @@ -1,6 +1,10 @@ import deepEquals from 'fast-deep-equal' import { parse } from 'cookie' +import { + channelAfterExternalOrderFormSync, + shouldRefetchOrderFormWithSessionSalesChannel, +} from '../utils/cartSalesChannel' import { mutateChannelContext, mutateLocaleContext } from '../utils/contex' import { md5 } from '../utils/md5' import { @@ -374,10 +378,17 @@ export const validateCart = async ( mutateLocaleContext(ctx, locale) } - // Step1: Get OrderForm from VTEX Commerce - const orderForm = await commerce.checkout.orderForm({ - id: orderFormIdFromCookie || undefined, + // Step1: Get OrderForm from VTEX Commerce. + // For existing carts (`orderFormId` present), omit `sc` on the first GET so + // Checkout keeps the orderForm's current sales channel. Passing a stale + // session SC (e.g. after Quick Order) would recalculate the cart and drop + // items only available in the orderForm's trade policy. New carts still + // send `sc` from the session (see commerce.checkout.orderForm). + const orderFormId = orderFormIdFromCookie || undefined + let orderForm = await commerce.checkout.orderForm({ + id: orderFormId, channel: ctx.storage.channel, + preserveSalesChannel: Boolean(orderFormId), }) const orderNumber = orderForm.orderFormId @@ -398,6 +409,17 @@ export const validateCart = async ( const isStale = isOrderFormStale(orderForm, sessionJwt) if (isStale) { + // Adopt the orderForm SC so subsequent checkout calls (etag, etc.) stay + // on the trade policy that actually owns the items. + const adoptedChannel = channelAfterExternalOrderFormSync( + ctx.storage.channel, + orderForm.salesChannel, + isStale + ) + if (adoptedChannel) { + mutateChannelContext(ctx, adoptedChannel) + } + const newOrderForm = await setOrderFormEtag( orderForm, commerce, @@ -408,6 +430,23 @@ export const validateCart = async ( } } + // Session owns the channel when the cart is not externally stale. If the + // user switched sales channel in-session (e.g. locale/binding), re-fetch + // with the session SC so Checkout recalculates under the new trade policy. + if ( + shouldRefetchOrderFormWithSessionSalesChannel( + ctx.storage.channel.salesChannel, + orderForm.salesChannel, + isStale + ) + ) { + orderForm = await commerce.checkout.orderForm({ + id: orderForm.orderFormId, + channel: ctx.storage.channel, + preserveSalesChannel: false, + }) + } + // Step2: Process items from both browser and checkout so they have the same shape const browserItemsById = groupById(acceptedOffer) const originItemsById = groupById(orderForm.items.map(orderFormItemToOffer)) diff --git a/packages/api/src/platforms/vtex/utils/cartSalesChannel.ts b/packages/api/src/platforms/vtex/utils/cartSalesChannel.ts new file mode 100644 index 0000000000..29acc3440c --- /dev/null +++ b/packages/api/src/platforms/vtex/utils/cartSalesChannel.ts @@ -0,0 +1,55 @@ +import type { Channel } from './channel' +import ChannelMarshal from './channel' + +/** + * When another system changed the orderForm (stale cartEtag), the orderForm's + * sales channel is authoritative. Returns a channel string to apply via + * `mutateChannelContext`, or `null` when no adoption is needed. + */ +export function channelAfterExternalOrderFormSync( + currentChannel: Required, + orderFormSalesChannel: string | null | undefined, + isOrderFormStale: boolean +): string | null { + if (!isOrderFormStale) { + return null + } + + if (orderFormSalesChannel == null || orderFormSalesChannel === '') { + return null + } + + if ( + String(orderFormSalesChannel) === String(currentChannel.salesChannel ?? '') + ) { + return null + } + + return ChannelMarshal.stringify({ + ...currentChannel, + salesChannel: String(orderFormSalesChannel), + hasOnlyDefaultSalesChannel: false, + }) +} + +/** + * After a non-stale validation, the session owns the channel. If session SC + * differs from the orderForm's SC (e.g. locale/binding switch), the cart must + * be re-fetched with the session SC so Checkout recalculates under the new + * trade policy. + */ +export function shouldRefetchOrderFormWithSessionSalesChannel( + sessionSalesChannel: string | undefined, + orderFormSalesChannel: string | null | undefined, + isOrderFormStale: boolean +): boolean { + if (isOrderFormStale) { + return false + } + + if (!sessionSalesChannel || !orderFormSalesChannel) { + return false + } + + return String(sessionSalesChannel) !== String(orderFormSalesChannel) +} diff --git a/packages/api/test/mocks/ValidateCartMutation.ts b/packages/api/test/mocks/ValidateCartMutation.ts index e5620945fb..4a4672583e 100644 --- a/packages/api/test/mocks/ValidateCartMutation.ts +++ b/packages/api/test/mocks/ValidateCartMutation.ts @@ -262,7 +262,7 @@ export const InvalidCart = { // Valid Cart export const checkoutOrderFormValidFetch = { - info: 'https://storeframework.vtexcommercestable.com.br/api/checkout/pub/orderForm/edbe3b03c8c94827a37ec5a6a4648fd2?sc=1&refreshOutdatedData=true', + info: 'https://storeframework.vtexcommercestable.com.br/api/checkout/pub/orderForm/edbe3b03c8c94827a37ec5a6a4648fd2?refreshOutdatedData=true', init: { method: 'POST', headers: { 'content-type': 'application/json', 'X-FORWARDED-HOST': '' }, @@ -289,7 +289,7 @@ export const checkoutOrderFormCustomDataValidFetch = { // "Invalid" Cart export const checkoutOrderFormInvalidFetch = { - info: 'https://storeframework.vtexcommercestable.com.br/api/checkout/pub/orderForm/edbe3b03c8c94827a37ec5a6a4648fd2?sc=1&refreshOutdatedData=true', + info: 'https://storeframework.vtexcommercestable.com.br/api/checkout/pub/orderForm/edbe3b03c8c94827a37ec5a6a4648fd2?refreshOutdatedData=true', init: { method: 'POST', headers: { 'content-type': 'application/json', 'X-FORWARDED-HOST': '' }, @@ -515,7 +515,7 @@ export const createProductFetchResultForSku = ( // Stale Cart export const checkoutOrderFormStaleFetch = { - info: 'https://storeframework.vtexcommercestable.com.br/api/checkout/pub/orderForm/edbe3b03c8c94827a37ec5a6a4648fd2?sc=1&refreshOutdatedData=true', + info: 'https://storeframework.vtexcommercestable.com.br/api/checkout/pub/orderForm/edbe3b03c8c94827a37ec5a6a4648fd2?refreshOutdatedData=true', init: { method: 'POST', headers: { 'content-type': 'application/json', 'X-FORWARDED-HOST': '' }, diff --git a/packages/api/test/unit/platforms/vtex/clients/commerce.test.ts b/packages/api/test/unit/platforms/vtex/clients/commerce.test.ts index 127d93290c..5aa900bcb7 100644 --- a/packages/api/test/unit/platforms/vtex/clients/commerce.test.ts +++ b/packages/api/test/unit/platforms/vtex/clients/commerce.test.ts @@ -71,6 +71,61 @@ describe('VTEX Commerce', () => { expect(fetchAPIMocked).not.toHaveBeenCalled() }) }) + + describe('orderForm', () => { + it('includes sc query param by default', async () => { + fetchAPIMocked.mockResolvedValueOnce({ + orderFormId: 'of-1', + salesChannel: '1', + items: [], + }) + + const { commerce } = clients.getClients(apiOptions, context) + await commerce.checkout.orderForm({ id: 'of-1' }) + + const [url] = fetchAPIMocked.mock.calls[0] + expect(url).toContain('/api/checkout/pub/orderForm/of-1?') + expect(url).toContain('sc=1') + expect(url).toContain('refreshOutdatedData=true') + }) + + it('omits sc when preserveSalesChannel is true for an existing cart', async () => { + fetchAPIMocked.mockResolvedValueOnce({ + orderFormId: 'of-1', + salesChannel: '4', + items: [{ id: 'sku-1' }], + }) + + const { commerce } = clients.getClients(apiOptions, context) + await commerce.checkout.orderForm({ + id: 'of-1', + preserveSalesChannel: true, + }) + + const [url] = fetchAPIMocked.mock.calls[0] + expect(url).toContain('/api/checkout/pub/orderForm/of-1?') + expect(url).not.toContain('sc=') + expect(url).toContain('refreshOutdatedData=true') + }) + + it('still sends sc when preserveSalesChannel is true but creating a new cart', async () => { + fetchAPIMocked.mockResolvedValueOnce({ + orderFormId: 'of-new', + salesChannel: '1', + items: [], + }) + + const { commerce } = clients.getClients(apiOptions, context) + await commerce.checkout.orderForm({ + preserveSalesChannel: true, + }) + + const [url] = fetchAPIMocked.mock.calls[0] + expect(url).toContain('/api/checkout/pub/orderForm?') + expect(url).toContain('sc=1') + expect(url).not.toContain('refreshOutdatedData') + }) + }) }) describe('Order Entry', () => { diff --git a/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts b/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts new file mode 100644 index 0000000000..ed20d2424c --- /dev/null +++ b/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts @@ -0,0 +1,79 @@ +import { describe, expect, it } from 'vitest' +import { + channelAfterExternalOrderFormSync, + shouldRefetchOrderFormWithSessionSalesChannel, +} from '../../../../../src/platforms/vtex/utils/cartSalesChannel' +import type { Channel } from '../../../../../src/platforms/vtex/utils/channel' + +const baseChannel = (salesChannel: string): Required => ({ + salesChannel, + regionId: '', + seller: '', + hasOnlyDefaultSalesChannel: true, +}) + +describe('channelAfterExternalOrderFormSync', () => { + it('returns null when the orderForm is not stale', () => { + expect( + channelAfterExternalOrderFormSync(baseChannel('1'), '4', false) + ).toBeNull() + }) + + it('returns null when orderForm SC matches session SC', () => { + expect( + channelAfterExternalOrderFormSync(baseChannel('4'), '4', true) + ).toBeNull() + }) + + it('returns null when orderForm SC is missing', () => { + expect( + channelAfterExternalOrderFormSync(baseChannel('1'), null, true) + ).toBeNull() + expect( + channelAfterExternalOrderFormSync(baseChannel('1'), '', true) + ).toBeNull() + }) + + it('adopts orderForm SC when stale and divergent (Quick Order case)', () => { + const result = channelAfterExternalOrderFormSync( + baseChannel('1'), + '4', + true + ) + + expect(result).not.toBeNull() + expect(JSON.parse(result as string)).toMatchObject({ + salesChannel: '4', + hasOnlyDefaultSalesChannel: false, + }) + }) +}) + +describe('shouldRefetchOrderFormWithSessionSalesChannel', () => { + it('does not refetch when the orderForm is externally stale', () => { + expect(shouldRefetchOrderFormWithSessionSalesChannel('1', '4', true)).toBe( + false + ) + }) + + it('does not refetch when SCs already match', () => { + expect(shouldRefetchOrderFormWithSessionSalesChannel('1', '1', false)).toBe( + false + ) + }) + + it('refetches when session SC diverges and cart is not stale (locale switch)', () => { + expect(shouldRefetchOrderFormWithSessionSalesChannel('2', '1', false)).toBe( + true + ) + }) + + it('does not refetch when either SC is missing', () => { + expect( + shouldRefetchOrderFormWithSessionSalesChannel(undefined, '1', false) + ).toBe(false) + expect( + shouldRefetchOrderFormWithSessionSalesChannel('1', null, false) + ).toBe(false) + }) +}) diff --git a/packages/core/src/sdk/cart/index.ts b/packages/core/src/sdk/cart/index.ts index c23939cc3d..aff5f1cec8 100644 --- a/packages/core/src/sdk/cart/index.ts +++ b/packages/core/src/sdk/cart/index.ts @@ -13,7 +13,7 @@ import type { import storeConfig from '../../../discovery.config' import { request } from '../graphql/request' -import { sessionStore } from '../session' +import { hasValidatedSessionStore, sessionStore } from '../session' import { createValidationStore, useStore } from '../useStore' export interface CartItem @@ -28,6 +28,44 @@ export interface Cart extends SDKCart { shouldSplitItem?: boolean } +/** Max time to wait for the first validateSession before validating the cart. */ +const SESSION_VALIDATION_WAIT_MS = 3_000 + +/** + * Defers cart validation until session has been validated at least once, so + * `session.channel` (sales channel) is less likely to be stale relative to + * Session Manager / external flows like Quick Order. + */ +const waitForSessionValidated = async (): Promise => { + if (hasValidatedSessionStore.read()) { + return + } + + await new Promise((resolve) => { + const timeoutId = setTimeout(() => { + unsubscribe() + resolve() + }, SESSION_VALIDATION_WAIT_MS) + + const unsubscribe = hasValidatedSessionStore.subscribe((validated) => { + if (!validated) { + return + } + + clearTimeout(timeoutId) + unsubscribe() + resolve() + }) + + // Race: validation may have finished between read() and subscribe() + if (hasValidatedSessionStore.read()) { + clearTimeout(timeoutId) + unsubscribe() + resolve() + } + }) +} + export const ValidateCartMutation = gql(` mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) { validateCart(cart: $cart, session: $session) { @@ -114,6 +152,8 @@ const getItemId = (item: Pick) => .join('::') const validateCart = async (cart: Cart): Promise => { + await waitForSessionValidated() + const { validateCart: validated = null } = await request< ValidateCartMutationMutation, ValidateCartMutationMutationVariables diff --git a/packages/core/src/sdk/session/index.ts b/packages/core/src/sdk/session/index.ts index 8a1fa0ef82..fd49575d9d 100644 --- a/packages/core/src/sdk/session/index.ts +++ b/packages/core/src/sdk/session/index.ts @@ -194,6 +194,9 @@ export const validateSession = async (session: Session) => { const [validationStore, onValidate, hasValidatedStore] = createValidationStore(validateSession) +/** True after at least one validateSession cycle finished (success or failure). */ +export const hasValidatedSessionStore = hasValidatedStore + const urlAwareInitialSession = getInitialSession() const defaultStore = createSessionStore( urlAwareInitialSession, From 28509c3f0b8d5affe9d7521d343e2a4de56577a5 Mon Sep 17 00:00:00 2001 From: eduardoformiga Date: Thu, 6 Aug 2026 18:05:44 -0300 Subject: [PATCH 02/10] test(api): colocate commerce client tests under commerce/index.test.ts Align the unit test path with the commerce/index.ts source module. --- .../{commerce.test.ts => commerce/index.test.ts} | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) rename packages/api/test/unit/platforms/vtex/clients/{commerce.test.ts => commerce/index.test.ts} (98%) diff --git a/packages/api/test/unit/platforms/vtex/clients/commerce.test.ts b/packages/api/test/unit/platforms/vtex/clients/commerce/index.test.ts similarity index 98% rename from packages/api/test/unit/platforms/vtex/clients/commerce.test.ts rename to packages/api/test/unit/platforms/vtex/clients/commerce/index.test.ts index 5aa900bcb7..70945efb08 100644 --- a/packages/api/test/unit/platforms/vtex/clients/commerce.test.ts +++ b/packages/api/test/unit/platforms/vtex/clients/commerce/index.test.ts @@ -1,8 +1,8 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import * as clients from '../../../../../src/platforms/vtex/clients' -// This should be imported AFTER the '../../../../../src/platforms/vtex/clients' -import { NotFoundError } from '../../../../../src/platforms/errors' -import { GraphqlVtexContextFactory } from '../../../../../src/platforms/vtex' +import * as clients from '../../../../../../src/platforms/vtex/clients' +// This should be imported AFTER the '../../../../../../src/platforms/vtex/clients' +import { NotFoundError } from '../../../../../../src/platforms/errors' +import { GraphqlVtexContextFactory } from '../../../../../../src/platforms/vtex' const apiOptions = { platform: 'vtex', @@ -27,7 +27,7 @@ beforeEach(() => { fetchAPIMocked.mockClear() }) -vi.mock('../../../../../src/platforms/vtex/clients/fetch.ts', () => ({ +vi.mock('../../../../../../src/platforms/vtex/clients/fetch.ts', () => ({ fetchAPI: async ( info: RequestInfo, init?: RequestInit, From 321123179d3e5789fb7730ef94c8f2f0d8b878b1 Mon Sep 17 00:00:00 2001 From: eduardoformiga Date: Thu, 6 Aug 2026 18:05:52 -0300 Subject: [PATCH 03/10] fix(api): address Sonar findings in validateCart and orderForm URL Extract SC adoption glue to reduce cognitive complexity, flatten nested template literals in checkout.orderForm, and narrow the cartSalesChannel test without a type assertion. --- .../platforms/vtex/clients/commerce/index.ts | 4 ++- .../platforms/vtex/resolvers/validateCart.ts | 26 +++++++++++++------ .../vtex/utils/cartSalesChannel.test.ts | 7 +++-- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/packages/api/src/platforms/vtex/clients/commerce/index.ts b/packages/api/src/platforms/vtex/clients/commerce/index.ts index aeff738104..cd17795121 100644 --- a/packages/api/src/platforms/vtex/clients/commerce/index.ts +++ b/packages/api/src/platforms/vtex/clients/commerce/index.ts @@ -463,7 +463,9 @@ export const VtexCommerce = ( params.set('refreshOutdatedData', refreshOutdatedData.toString()) } const qs = params.toString() - const url = `${base}/api/checkout/pub/orderForm${id ? `/${id}` : ''}${qs ? `?${qs}` : ''}` + const orderFormPath = id ? `/${id}` : '' + const queryString = qs ? `?${qs}` : '' + const url = `${base}/api/checkout/pub/orderForm${orderFormPath}${queryString}` return fetchAPI( url, diff --git a/packages/api/src/platforms/vtex/resolvers/validateCart.ts b/packages/api/src/platforms/vtex/resolvers/validateCart.ts index 928476d390..d0a3900f77 100644 --- a/packages/api/src/platforms/vtex/resolvers/validateCart.ts +++ b/packages/api/src/platforms/vtex/resolvers/validateCart.ts @@ -340,6 +340,23 @@ const getCookieCheckoutOrderNumber = (ctx: string, nameCookie: string) => { return cookieValue ? cookieValue.split('=')[1] : '' } +/** Adopt the orderForm SC when another system changed the cart (stale etag). */ +const adoptOrderFormSalesChannelIfNeeded = ( + ctx: GraphqlContext, + orderForm: OrderForm, + isOrderFormStaleFlag: boolean +) => { + const adoptedChannel = channelAfterExternalOrderFormSync( + ctx.storage.channel, + orderForm.salesChannel, + isOrderFormStaleFlag + ) + + if (adoptedChannel) { + mutateChannelContext(ctx, adoptedChannel) + } +} + /** * This resolver implements the optimistic cart behavior. The main idea in here * is that we receive a cart from the UI (as query params) and we validate it with @@ -411,14 +428,7 @@ export const validateCart = async ( if (isStale) { // Adopt the orderForm SC so subsequent checkout calls (etag, etc.) stay // on the trade policy that actually owns the items. - const adoptedChannel = channelAfterExternalOrderFormSync( - ctx.storage.channel, - orderForm.salesChannel, - isStale - ) - if (adoptedChannel) { - mutateChannelContext(ctx, adoptedChannel) - } + adoptOrderFormSalesChannelIfNeeded(ctx, orderForm, isStale) const newOrderForm = await setOrderFormEtag( orderForm, diff --git a/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts b/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts index ed20d2424c..0d76c75e53 100644 --- a/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts +++ b/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts @@ -41,8 +41,11 @@ describe('channelAfterExternalOrderFormSync', () => { true ) - expect(result).not.toBeNull() - expect(JSON.parse(result as string)).toMatchObject({ + if (result === null) { + throw new Error('expected channel string after adopting orderForm SC') + } + + expect(JSON.parse(result)).toMatchObject({ salesChannel: '4', hasOnlyDefaultSalesChannel: false, }) From 2dbe2951b8774de14bc07828c93ecae014d7edf7 Mon Sep 17 00:00:00 2001 From: eduardoformiga Date: Thu, 6 Aug 2026 18:14:27 -0300 Subject: [PATCH 04/10] test(core): cover waitForSessionValidated for Sonar new-code coverage Extract the session-wait helper so unit tests can exercise immediate, subscribe, race, and timeout paths under the Quality Gate threshold. --- packages/core/src/sdk/cart/index.ts | 41 +------- .../src/sdk/cart/waitForSessionValidated.ts | 42 +++++++++ .../sdk/cart/waitForSessionValidated.test.ts | 94 +++++++++++++++++++ 3 files changed, 138 insertions(+), 39 deletions(-) create mode 100644 packages/core/src/sdk/cart/waitForSessionValidated.ts create mode 100644 packages/core/test/sdk/cart/waitForSessionValidated.test.ts diff --git a/packages/core/src/sdk/cart/index.ts b/packages/core/src/sdk/cart/index.ts index aff5f1cec8..09c2ce1c6a 100644 --- a/packages/core/src/sdk/cart/index.ts +++ b/packages/core/src/sdk/cart/index.ts @@ -15,6 +15,7 @@ import storeConfig from '../../../discovery.config' import { request } from '../graphql/request' import { hasValidatedSessionStore, sessionStore } from '../session' import { createValidationStore, useStore } from '../useStore' +import { waitForSessionValidated } from './waitForSessionValidated' export interface CartItem extends SDKCartItem, @@ -28,44 +29,6 @@ export interface Cart extends SDKCart { shouldSplitItem?: boolean } -/** Max time to wait for the first validateSession before validating the cart. */ -const SESSION_VALIDATION_WAIT_MS = 3_000 - -/** - * Defers cart validation until session has been validated at least once, so - * `session.channel` (sales channel) is less likely to be stale relative to - * Session Manager / external flows like Quick Order. - */ -const waitForSessionValidated = async (): Promise => { - if (hasValidatedSessionStore.read()) { - return - } - - await new Promise((resolve) => { - const timeoutId = setTimeout(() => { - unsubscribe() - resolve() - }, SESSION_VALIDATION_WAIT_MS) - - const unsubscribe = hasValidatedSessionStore.subscribe((validated) => { - if (!validated) { - return - } - - clearTimeout(timeoutId) - unsubscribe() - resolve() - }) - - // Race: validation may have finished between read() and subscribe() - if (hasValidatedSessionStore.read()) { - clearTimeout(timeoutId) - unsubscribe() - resolve() - } - }) -} - export const ValidateCartMutation = gql(` mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) { validateCart(cart: $cart, session: $session) { @@ -152,7 +115,7 @@ const getItemId = (item: Pick) => .join('::') const validateCart = async (cart: Cart): Promise => { - await waitForSessionValidated() + await waitForSessionValidated(hasValidatedSessionStore) const { validateCart: validated = null } = await request< ValidateCartMutationMutation, diff --git a/packages/core/src/sdk/cart/waitForSessionValidated.ts b/packages/core/src/sdk/cart/waitForSessionValidated.ts new file mode 100644 index 0000000000..f632b892ea --- /dev/null +++ b/packages/core/src/sdk/cart/waitForSessionValidated.ts @@ -0,0 +1,42 @@ +import type { Store } from '@faststore/sdk' + +/** Max time to wait for the first validateSession before validating the cart. */ +export const SESSION_VALIDATION_WAIT_MS = 3_000 + +/** + * Defers cart validation until session has been validated at least once, so + * `session.channel` (sales channel) is less likely to be stale relative to + * Session Manager / external flows like Quick Order. + */ +export const waitForSessionValidated = async ( + hasValidatedSessionStore: Store, + waitMs = SESSION_VALIDATION_WAIT_MS +): Promise => { + if (hasValidatedSessionStore.read()) { + return + } + + await new Promise((resolve) => { + const timeoutId = setTimeout(() => { + unsubscribe() + resolve() + }, waitMs) + + const unsubscribe = hasValidatedSessionStore.subscribe((validated) => { + if (!validated) { + return + } + + clearTimeout(timeoutId) + unsubscribe() + resolve() + }) + + // Race: validation may have finished between read() and subscribe() + if (hasValidatedSessionStore.read()) { + clearTimeout(timeoutId) + unsubscribe() + resolve() + } + }) +} diff --git a/packages/core/test/sdk/cart/waitForSessionValidated.test.ts b/packages/core/test/sdk/cart/waitForSessionValidated.test.ts new file mode 100644 index 0000000000..fafe8af664 --- /dev/null +++ b/packages/core/test/sdk/cart/waitForSessionValidated.test.ts @@ -0,0 +1,94 @@ +import { createBaseStore } from '@faststore/sdk' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { + SESSION_VALIDATION_WAIT_MS, + waitForSessionValidated, +} from '../../../src/sdk/cart/waitForSessionValidated' + +describe('waitForSessionValidated', () => { + afterEach(() => { + vi.useRealTimers() + }) + + it('resolves immediately when session was already validated', async () => { + const store = createBaseStore(true) + + await expect(waitForSessionValidated(store)).resolves.toBeUndefined() + }) + + it('resolves when session becomes validated after subscribe', async () => { + const store = createBaseStore(false) + + const pending = waitForSessionValidated(store, 5_000) + store.set(true) + + await expect(pending).resolves.toBeUndefined() + }) + + it('ignores subscribe callbacks while validated is still false', async () => { + vi.useFakeTimers() + const listeners: Array<(value: boolean) => void> = [] + const store = { + read: vi.fn(() => false), + subscribe: vi.fn((listener: (value: boolean) => void) => { + listeners.push(listener) + return () => { + const index = listeners.indexOf(listener) + if (index >= 0) { + listeners.splice(index, 1) + } + } + }), + set: vi.fn(), + } + + const pending = waitForSessionValidated(store, SESSION_VALIDATION_WAIT_MS) + + // Emit false — should not resolve yet + for (const listener of listeners) { + listener(false) + } + + await vi.advanceTimersByTimeAsync(SESSION_VALIDATION_WAIT_MS) + await expect(pending).resolves.toBeUndefined() + }) + + it('resolves on timeout when session never validates', async () => { + vi.useFakeTimers() + const store = createBaseStore(false) + + const pending = waitForSessionValidated(store, SESSION_VALIDATION_WAIT_MS) + + await vi.advanceTimersByTimeAsync(SESSION_VALIDATION_WAIT_MS) + + await expect(pending).resolves.toBeUndefined() + }) + + it('resolves the race when validation finishes between read and subscribe', async () => { + let current = false + const listeners: Array<(value: boolean) => void> = [] + + const store = { + read: vi.fn(() => { + // First read: not validated. Second read (post-subscribe): validated. + const value = current + current = true + return value + }), + subscribe: vi.fn((listener: (value: boolean) => void) => { + listeners.push(listener) + return () => { + const index = listeners.indexOf(listener) + if (index >= 0) { + listeners.splice(index, 1) + } + } + }), + set: vi.fn(), + } + + await expect(waitForSessionValidated(store, 5_000)).resolves.toBeUndefined() + expect(store.subscribe).toHaveBeenCalledTimes(1) + expect(store.read).toHaveBeenCalledTimes(2) + }) +}) From d5be27c4e155b56a0d1ddfde55b23d530e77e6ca Mon Sep 17 00:00:00 2001 From: eduardoformiga Date: Thu, 6 Aug 2026 18:22:48 -0300 Subject: [PATCH 05/10] docs(api): add before/after screenshots for validateCart PR --- .github/assets/pr-3435/antes-validate-cart.png | Bin 0 -> 75587 bytes .github/assets/pr-3435/depois-validate-cart.png | Bin 0 -> 80793 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/assets/pr-3435/antes-validate-cart.png create mode 100644 .github/assets/pr-3435/depois-validate-cart.png diff --git a/.github/assets/pr-3435/antes-validate-cart.png b/.github/assets/pr-3435/antes-validate-cart.png new file mode 100644 index 0000000000000000000000000000000000000000..54ff8cf787437928fefb6a75f9b3213069e8a8df GIT binary patch literal 75587 zcmeFZbwE_@);ByzDlMI&fQWSGph(BiA>ANH-$g9Yc4Aq$v90 zeZ0?oo^#&we(&?g^ZxUlYijL%t!u5{ifdh)&EEUx%+F;2k)o`EEC3A+06@Ea0e-Hc z%_vAonW$-~$|@+!{H>!0aN97r0RX6jn~R3r3x=0^`V831e;e_u&&DTYSX}5AO zrhZ8W0LD4~4bT5+_gzaXSBqPQc}qXB`3KtkA7~3FmtXu5w>;udd-q?uezjkS@vI!QHE(}$Za=gDSAYgU z4)Efa{kPk<%`poA5IzS0(4+s_XPyKA)V>7(DChp#$CLp85WWEbYKH&X_m@wc%v{X= z5QlO5eaG4w0Qiy*0O0EZ03;&-z&(RM`fk7e4K{|`F4|jMj<+uxfIYwpzyMGHH~=gF zoVOG&fE&OA5d4V(NCD9A-1+ssZ5X$2OdL#13=GVB*w|P&c=zz|aPQ&b;uG8_!Y3dm zz{MpZCn6>xB_kulBcz}tC#AekN=Eui2panB7!1t2n3#7-@p17<|J&_n8-N(+4jKjk z9qkd|4lx=!G1|}10Qz6)go$?B{h?M|uCkqvUmN+c zih@blJZPNC{Y`wkX5uO+Olptmr0h>!n*cmllW}*io|xqn zASH`A)z&)V=^0!;m?o%W__Go*f{$(f_cr&YL-6mUiEWgQs`mTxaPYV zr?0{`bqvq!j?~75tLtOd%IPHau4Iq6fw|8z1l?VyJjvA!o<#b)X7iC-3RG6O*ME)% zP|+$JXy`)mJ*(y+9FsM62(8f`vvdi|M&}OLU35C>2Z=#}9Zig{5*@43iCYJR=CsNM zE2USMOyBjkgTIXx%(BPN!M5;Q7F2eNdV|9s*%;L78~Q&dxsIj?_=8^+XK9n>;K{Dy zz2xgm5C|i7LX1IKx{a~msh;dytt2DZ=;1qMeNUyfUI*V}ISh=bH;$+H7qOp& zzJ`2Lq#`1b_yRBqeJ=ar3g_H*g=?cyF4*#6v$RB1cVqN_R|#JVKP_cunw;d(9GCvO72h5K z6WkbLDL|W3yZ>K2nUo1nx9Mb~qm5uLvk1YJ-^0|dMHQ7*JCBWO_G)WB_I&s@cgO>c z1>l4Brks> zwPK(Pp+kx(-6WCxQ2c{UM8xrMIU9!d)2G%YX{V}eTS;4-a5)N*?lD#Uyg)XT>oCi$ZNv4m|I!kPc0SZ^8_$!||Rcei{`J~AJk&9>xOQI4O)5*aS8Wy4=2V3`rf6kMALU;^T(h*V_>TtU@J((PpcQW`PVEcsTP_Ab+S>xnJ{nF`s1`9!397Z4+VgK9u3)Hx% zj}kWs#XB~fl^Eyxh^)@@ntOT>QKisGNtp*pT<*HGtgHt%={ybGSK@q^?SZJ29Tb2h zSRr?8w2cJVvdrLYfsvcfcTN#Kv%xPJ54#COwCG%F^mfWGw$G|VZ1=CJ5nn;<6C7@7 z+=&K5!Z(*^Wy@YpxG@+oJoZJgH|w?Hye(>Ujd^Dw=?&9U#syX1we=fnRpuOsQ5;j- zMGCy3_uiZ5`39?!*9!0UF1KV=%s(7&RLz)+4MpDxKOrcYGhjCWjwVl)^;&&wXfU_| zwt(r-ZJ<>C^ykvfHVkH8yF@G7t-hI8fI(!Y1!cKovi=;7=^+q~@yzjVkUF`(%KrDw zb2;IK{fPT_SFtFFxw0-rGIKvyH$P8DLz^erZ+)(}`?M4b5u~3c(pqNs6bmPP@lu&a z*|*I`%0q13CA;!~a__W?t@N66)MMoQqA$6)b4t+~II44~=!uuqPdkkT7+RaCi&U{) zuyPym34x#6CQ2D88k=)DoJzXVb|BKRJDs1qdmv`DnNn~F%c{nw)K&AC8+g}1P}BDx z*Ac;5CM`QD5hAba9w<)JP{4iyJ}Rk9JmDmtvjcC9e%hdcJhIFkZOMz1b&Xv`^r#$p zQLR!ubF8ZpVsWEg6Q|hHNB>w2>$5%hhSl6}V4WAOW&o|$62h@%%*{tAJbqukxhvG4 zb7J}Mb0FHG#&voxR{Z2Oml~g{hVAvsYBB+SK~!4HlXXi6M|$&27)Rkdr<0Q@$-Wij zr7%E&!TpX;%&==91{~1VyNiQATkiI_AjO^nvT&qSySyzxN=n8p+^s~i^w@;dh6$~e zMqz1p4enJInuWY#t{F@>OtH-w?^@F{kt9QI*oVQ(9w!>rp+UkeqkP>X=k0#sy!*%vc=D_wFMKse5Y^qjI4!GQk?g0@2B+>wyq2MmFAPW z^Y42bXk&gw`=m7~_;AHEF3tRMYoyob*ilJomVC;EJ5Sb~oxr=%5%gc`EB%3o(Lq}j zL_BcUcE3N4#~%USy}R>>;n$)0|05D_mZIXBU0&}qq63MJ=ADZo``8nL@qMwyy#3i4 zgxB}*nFrOHmLJ}Ed@x%)`=%|Za1{!^pgU3-jATFg`frA&rBLgwec>_uH&9bc0<|Qr+yD3Ux`Yu)Vjo>nWt`MpESxmL!$j8GTY!lVf{Q56N zs()$UpBWo|5aWyf7sd~N0iUhRO&6Us$S7W86nA{$^mM#^*OAlY&G4`{RvaR{#ld1fc=H`54RMz&;6mACAezQ zu%+_QxbNTE8fpAnwK!egmyPo%mkZs$JSFj$`#xGIiQD~F-Mf4sl)zQun}BTn%lyB9 z|KWVy->OxATi6``7sh|`D0S0s)xRy=*f0Mp9{zs?$+`>SHThe0>~9PIRJl6hZMgZDQOL*ui^VWlb52X&pf z28B&~t3d~DpJTZkn~5w4AyyvOKh0d$zFLHqNNF27Ezh=Y+y(BSr7{B7%KoIe)YpWL zFO`<|OIP&sRovIMM+~s)K=U8}RHk}&?LEVUjW}d#kT}WR@+Qn;$sY1Y zU?ab!gvGi zOAz|wfGZ{@GN*o6FIhrYxneN z9%Hw&FY@`2(`XwWpdu1sKZMHher{aiJp7U>e><~IkBJ1nsjhWYdFGOE$1)NwZP=z_ zkZKduwJ9VjNwK9dx@Jdxs-`wy4SWNB$G^d0I8lX2DHox$8cy=I=(kfYh23AB#tNqC zMuVfR#EJ-oad;OB?&MWfuPyHmr7*?F;7xwi7#Fp*HQ+k4wyAwsf8!^7?rfsZXm>be zAT_0LsaMSUu%Z{&qE5bJPz$?*HqHNex+@2*%V=CrZ-qL}E|XQYxa2T7MH5@J!*Q-#XcLw^sjA%jF!EG^$~P;nd5AFy z(4c^YwLP>gPOzO_Zc$3CJ*W%fGa&z7%}x74o}Mq1B;*)qxz^0f2R|n-&)UGuKdky9 z0Snt#uF}*spi`G*Qf`o=@eD7Vmy7Bk*k{gXWDJ}3C~bzYrDa>IC$pN@+3mf_%gTAV zsHdvjlM|Z~nR*$qRyR6C61cGCaExa0nAa_f9UV-g5&PVZa9$6gs7V54c71E?+WP$mU9a>%?+Y5TQl6+Je6rLggk?rG-sP|U1Q#+CiPZ~ zg8eo7sN-w>fs&^A#WC^M@Z^ELNDy8cfky&jU?z7Nw~K%05*pGocSx`tgUcl7ZHYowjd)K0*s^OBRaM`Uc7c)>i zB*;ZM7@bNO*r^9CwiN=RAt8AM<7aM{G^s#J4UMTIUJ)bq6It{MNm`~Gx$=4}P++)P zWJAO5&C_p2w9dR+n6FfFORzs=7394W8EM1-NPQvnYNzvl`D37_u|%LNIpk>N@w@Wk zf-2GFe!7;B%y=F}^V`X^rm-xg0JzGQc+(q^@|8TQ)+MBB?dw|e z?BbGo)Xp>4kEvlV(l8cg+an$7kMLZL0)@{@D6GF17w6>6k*QR}dY!7lf@8hMKVWXi zF|E_KO@>~TV_$K@mCs%aiE9yw!_MP4)q<59Tsc*eE%&w$HAM$)gT89b*+IXsS~=M| zt$mJIhqc|+69|R~;;WZEt*S;U6zvt3Rv1~P#oV+>@rchX4R}#h0NbgwT($W<_W5sxww!z@6ZX-=_e}2&n+Mi9>wAVXO4f&z zbBT#Cq@NQL1Ei(V{y#}_nrb>S*C`Jilv%45cu-Q3ySR2*Rw-*s9|td8qVSOulSqEW zx-+i!4Kg96DF8zay!gHbbQq~=lbE2Pe!Qk{`R&@zYw$pv+G~T?f<@|4m!NBQ5x+!2 z(1L+iN$b4frK+xTskduh(w6r|c41`i@@?H^Ps2-p`6cxy0J>oCwdmCswGwRb(&M>j zdrw*$&Of;Pn+^>_q)=~J@vG8j=dS?BD`-4L|4{5l)NUtf{8_ZLaWC@%A@4KHwhI_G z{)unhhB;a5)Q9WVKt1d9=_(IMTJoAYq@cW{nwPw7YdU(go-N&JtRn=`NRu5X0<63F^8I3k)?fm}C|YyG2N&IGHMEe?(E9m7q%>WMxb5 zyf1Oy0r7a|rF}c?chB@g4u(4Ni@&GF0q?G~>r_Fz@`gDkOUFcY@`76OL|cRHIF8%} z#7n>sBNB{Yx0UXabYx(+V48V22#T$yzl>1G$}NeBgq!2e^QFQ?hsiKCZ)Br>JXr`z`*-n0o4}l2k>N^HjyY_k+V3=&7|5+j|oH()n$EH zazSRmPWysuoA8Z{L&{J;{{m-4akUJ@k4UrAi6eGJM@v)+&yk%u(w2R7ME)7?C<67S zrZ|$r9^>v#uKnl{UgT!9tlSW}jY$nnsr#5xEC<4ldM8E9x*$8#-Z3Q|Z2xwho~4Ur z>$xS@`ihTLdPwEu*+6<`)fWZjO<`B%#K`gHiBxNqXwVkBs*|n zHnF_O>@wIbW*tV$^Z9s{T=1ZJmts_{?Ltk$NA^?KR6~4TmaMd#;PkU9JhT~kbf#iE zj?$%VPV(KJ530jzI$G0GiAa&&Ihw~_CzQ0<=6C$(KRDuzX(i-OwRNlF2|P|3aN-El z#i~XvNS|P%!|uT|XYiSP5FxN~jd86pKh8Y?NTIoxA76+_dp0A?6KB}$Wq3`iKfF`H z-uHqV9F=y_oC>gw7`-J*%F&UDCaSvch7{?+7CA(i%S!7W+&{ls>p`1(8YXs8L$rXxUOwQnJsXz)~fJ zx64lT^lbi!i3A3&pRY$8KQw)JXGWAyWd_X8Jgl>{W9Q)1VMN!E9+K{0!z=Q3LmQvh4Zu6iDJu)KSM2amP(h}6{7b*?rV z{GghYk(cj2B_t{(p8e<#)5nky@;C;H!StZ=|^uVi)eI z#G}BZ$21`_6xZ0w+)dYWcWVFMj=E(2MsA(v#KaK^1x9-+6 zH|Waec{`ZbBfC$>$z&M(e5;8nXo*%*ow3JAF$L$UnK6-Ju(uN)r%L>MVPX0@NWBNd z16ErFYruJ5msU29{(xd9Vkw7=e4=4OnXDXpb^jSO#!I;+S_0s^yL46+;WZIsF2+T6 z%Q3f^sI5FzpU3IBy3!qdERRj6r$1;d8f8~os%=TWd$pZvIFlk^!5UbQD$Ct=d9j9G zOw~4|LmSAkVm0GmbORlkbkimQ0WBDkPhZdq&0>5M<>B{}c*4#B^y*i&8+$=T%ggAD zU4@x2Czw=duM1)B3o$m&8DbKe?Rc@*JHnRf`v{ohvE-_OKvty5QIn zzJG7^Mo8Ds%AUKeXR{cVE?XC?O4Gx+*d@jWVGC$s}p%E9Xw+i_tqv;xk zqFcDwtXx@5>a6!Tq3rj3%~-EG=lx7lrqtHf?ub93$j-M)XDq|VVbt{~%( zPeDFUiOEL8K5W||vPBrxaQC^N0#g2v+yK-$$&XO7tyR#|He$?)eYU6izTQDtco|P9 z1WUIoafZXVY-e@BC#R5G{wl*yU4A>C!}^EkNyxer)q$GFLWK!*L}Q$C8}cM0$DcT- zIPbm;yGs1n$^p<4_&F%&z%RpHCgVtou5#G&i`Mh4QNA0)o{{NyZEdy;Xy1wMOIab_ zu_Jc-^t%jqpPrpvikKz@NPrJKgp!}H1$SVVV~>>X3S#TgX%=KPj|@BK73STR2!ZlJ z#=JHM74GG`fVFB1C#cG~s#R`{K%CzskaX%o8Qd*4Ab+sM-B=q%yb#Z*SqlVd4>X10 z>`IRet80@n8gN*wK5*p|_VcqC39Oh-5jo}z3aX)L7Fb0TdGC1ld5AQ^Kk3tt(LP(G z)uGNSr*2vCtJXvnMOY`_E8L@`9H4iBF8ly4K50`cxHCTuOa|{%krbD>Ra1axWk?U} z#-=I{Vdk5mNPRzSo?s?N%ac#zY$7T4y1nf2=rAI+Cu(Bw8AuDW4U=_Y3 zqmBuc%1Me6A7@SNY89q+ZQ+4!oNCuXH8r)Bw7S*CCZ#m`dTsJ@EFNg{$!`07_H&K6 z?#uQ-fvyi;%so_vW@bSJK#Z*0g&4|~?wEOo0H0pd+hYUlg<&hanmM!7U1|!$r>0PC zj=IVNxL4}URJ458$=<@=ryhsz$z>Pekqt1VQt}%aU8$ra0t>TPr^b@+&TSE}$xyl? zW23y)j}4*}I2ojs)1vWtrO~0-IG@u@E&YDP`@5lxew-L6>1u)??$R2kW4$AK$@zze z2}&O#V-{fIJ|jfQ-((dsxt6e$G{;iS?c2ZiuQJdcb2woTM(F`9%i_o*LO3;c0Om|JRlt?ZB*CnO?S|nrKy|_TE4f~@X_>Q?)@Ie zMcBPY=H3L`(lelFDID1%L=h@K6-c`Rmh^#Wb2bp2G#^wL>pM2 zScbvlWEY`FkVW6i_qMBw)m2c@ODkwn+;DJ8b+=UbL&W3|^Lf)x`YL zI#9v31+v{SXpQcbz(W!__Of??c}rnnj%jhdAR#_;gMQzjfkPfF{hnPiBGK|O<<^gg zb7zs2z)HyGq@(Ax=(WgOCQ@y;3UxPqJ7-#_4!qPgD#{0>j&Rig#cY>3?ae(Ir`)s= z%HqPpLhFSnY!|}qlX>57BlOc8>V3MPT@HhfeGu!kD%=(SDVW_gu|^LQ0wE$D1)={5 zpzuO)JMVLTg-tDjHr(Pi8>84#ZZaE6rtNF;B6hsK?q%BvU^3F-3JG-tiW}oBA0m0p94fh*Ay$lVuSKB3wLDse8pY>#+QENy43nvhbBILg^6tMT04iSOTs*k-ElEaPCVH$Zs{A(WR#eWGHO-Sv@0Yqp4~et&-;GY|wELMSW| zy$%vgd>2!?+Eqn#yb=?i4mLtJ%B=}4ELYbZ@3(I5RNhig#7U-Fc^e({pgHnWm!Hx6 zRxK^Lb5lz1>tM18QP#^r*IWT~I}|Q^WHBUzy*D8pLe1^kL6g=k^3uK5vH@nWnFihc z>R4O}p6i|(3DYOR*D4chkBo0eCE9w@O+_9qPS#w;dUJC_A`Os25cDGJk~(hfdD}F{ zTJnxnwNJ~q-wm&ZeA~Fhc>#1`x^ng>H5`Nn`FopT9=f6#Lv!*2YLy>t*dy!3N&&}f ziyt}G7nSj-9aZ-=ega6&ZUipXMyFA3gLqXsh_TTIR+DD5*GLtm9%p;Y2!4K&PLRHb zj6jwB08I+h@$(_e&rEJ*E(m#H=MyK(#e>~Xvj)9Qi9Er0bDW{&lkpAaE0FS_kcM7o zveF&3B#Zc5n8nOz5pRMV39 zC6T9Rg>!uUFKcbEqO9AiX&o!{lL~E6O9j%Dq63@^)@~!sZGjav<1oaP z?9*N3U<}M_sPTSMLNvdOc}Cuo8#6K5OX(TU9!fQ|V=ByuZVKg+(t;8`SIu8AqT^5= z(@?xlx2>-a$zn|l**dC6ie6b+)ATld3>FsP_z5tLF%+!C`dGVw-@>9k(V++3yv$Db zwji!?{_If4Z+aOh77vZFAJ^Rf5;hE})7~lSH)?nvXReQ{6|LPz*)~-_%q#5NrAokN z=lJ-GX%{}p#YZJj=6Pg#xSE@9+SCSJ*R=B{FEo#eidhWZv&nR9Je~33(2?Fy)~uEg zT|DYcyCJuVe}X+TjLL-m7%v|#gcbo~l8c)9xbQ3BjM{q#iFUV(ML=d|GYWimm;rmT zXI_}WRTwDn8n&4}4e(4JJ?W@baqbA}uj-0TQ8hlC6yIRmd1{dlBc^5k_?p!0gL{Bq zKp8C-IjAY6#|A5I!zSa1MsaqK4BqQlR$2lbOKvXD2}-x_9%%KuOC=!9P~9Dh{UFJ9 z+Fnf8#A15VCs@f&^=&mUi%kg=5i%*Kpu!mNjoHlvhwk#o;yq9gx7IV(+pHuJ!t&6T zE_ruOX{xOCfS|pAi~oF1S?_UHeyuwHAPv@*5Q%w7{E%<*T3ev-14^fRr*P|-DPNKi z7p+}?k^;vD#Oa_bEE^u`gMg<$?f~JX9w=Li^VBok5k3*=+oSvC4qEp@57ol*Ye&1O zn(YH^-0JEtxSw4Tp>H&B7Kk@{uB5tIQpCO7&!2#7Dh|K}>yuN89AZTUZW0w``Q^<9 zOG*%bbw6v~%}%aQl(wFNixp0d!QMi#Sp2C*r5-e1lfLqk*9ag*aUrXt79Lc9Pzd5F zT?V0U*K8iYx+<~lLR*=tU3zT9s+ZxRZa*$Cm6F>~w$wa4VML=ctpj3=fGdvTeF?-( z^%9x=I(1u1*Ojm|+ONY;e^sjw1+7A{-e`YpML+nT*a$t4xGdrjq|6w-aCUE*9$?K( z_QV=jx1=2wqD52@hRwsB#B>^8J*Ko}kC{KH?Te}E*$^n3j6H$pxrkfKFP52pH@0^| zFAiHwxvdVAJZWhrj>*BwQW7~xi4NcQM?rasO%g)&`Lyc}*x__je8E9T_pePU?Pwbb ztiu-zldZ}5KLO15+C0*}K(l`!!@rg5UH+R6ZRUPPzhu~6VNqcjiS$fi_{-;*qj!Ab zo2U^hnhY@Nm(0=UJaJ!H&N0pWzv}0IX^l3Bl>{f*Jw2dym~>9=6fi1G5N(WSlQ?3H z?XowU#SqA*lPiB(ZC4cMG8FkXuH4Sn_$b`*ZKKlWptfLMd49}jzmh6xN)bzEF?H-q?!+{Ips{m%{w5V8`5+I#-o5kR)#`l+2RLzDTzQgz$}= zYuEx46^ah{S3#=IjWpW$dJ(`0s3pjEfs)~76mQL1LmlpB~j?>HoqD5voKD>Ka%78XKl`oPHy!sn*it%b0*O$``$*BUf3(mo>yN$`p z@;^ob3mv91S;U{%ZRXwgHi+UF-uv{m?Cay%Q-zy#%;~q)0oDl@55+l(Px)Ib?{y8j z2tulvT}^`u#`|VP!U{geCk>b*En)z+qC6T2cU<7AfXCUO}<(Z;VpO_FkN-l^i+eIMl7e^J>qAGvv;X9!-- z*}30fY>wceRbSt7FQo<0^>2>TiBBsE@6lW2xDD73I~u$+6pAWlLma1fc6P0Y{#T^9 z*|SEamZ;m?9t2`O+JBvVl!mA)(6{~I2-I{uJn>i|TpIFh)a5lP+}Ytuz+t5|Q6iI$ zct1qR{QC2qR~qf`YoNLjUk77ezVEQ60hWS^1o`CGWRsb<(EOH{w;3D$Emt<<@%O)Z zij!jXNMkEPh`?3BnR8D>Uo~zsF{pz+K6UnB z3i4K4999^D!U+>Ua>5{>0<5vMx{euDQ|MM{e9}{DMv_l+ zt$a$~h-$iEv!IZZ%o4KmslJ+;6*9|s-Mnd}aKV80{D6aF1fi42YUV-ehy2EAwb8Mq z!o0%dvHnSE=XSjm&&}EBt!#nr_^d7A`aOS>%ZJhs<@0^9ul z<{jLfiJH_S{0{lNla^P1A=s=x9<2^UlqKIGs^NZiYgzYq{M?hBJ3bH@ zC{Rjn>qV&X?VE$Z@bdMmADf}`8T_z;%qeQ>WF(cIg1&=BH_&kCv2fumTFmDv_cglk z?S0J@%i6o{WTZaMRXn=Lqd|H7i(bA=2!_`p!IDKgT}r)9({AgQB{1??-}|MSHNzi- zx1m3@_3z*QQZ*eJSvba#`}k92RJ^+kTXn1_65Kl=%|86>QiKt;M7L=rqYx1^2?>d0}s0l}Uq z6_?#vpz*5nDv4~*2=$1aX}mxrP`G8Q>vlNab^P#yw(opLEhW?@4&gfQx`c8rdxbsz z6L85dv0>xAAyvXP)faZJPYHb|-^`)|N>sIcNyJN-YnH+}KB1p)D+mE~A|*od%x4Wq zE@}0tRnXeIbzNrW9IfYUjHTpUDp9*nlqnE%#T=LSJ~C;9cCbhIGC|NoL=x_B`+Pb* z-2C{`)ka-CuU1{Q@VKUYVC=_dmfsWBnq*(L3}4Km!H*Tab4vbYmmEfvg-AD%#P*1! zQ#Uz`jWvJ$922Iv6v}B2#j6QR?z5ZjU@{zt0hW4vw{(0E!7b)OW^SSRyFUMYdVmB! znW%#ca&pqy;`@+W;E-t}Vpntcy@Db`Lw&EP?UdAWhxo7qHp_FA2x8H)7`CEn)bc1M zra{P&e>teznLc^P0U)UWtPX?`crztMLp8YO>s23h17b!C{1>$Jou#^wJdV)E8Ceuz zVb?`=-um=cd(!rVwvL1pjN+=`PZ5pwSf@54$`cU-h4 z>|aiLcWO|~VR>tM%cCKqK9OBCUW#>?!d7{ z%DJBaw1V@_bCM1klVt(=x|Xc|qIyxSa6=dM-FwuH9S2$o*VEyjXE>%XlAL+TU znIEc60kCIHL=OV~wyeGRo#*TcmZHf^`G-d^hXlHI=^i~eF?16Qz;bg>9XAt zKd|yh?**%`EVMAOwQaJ+*4JY31G>)F%!4SOK4LLh0X~W=>e@jFgVtCWmuRak_+>ZHqogCX8zAO>5OQD z-B+LbMQr^9n7@VGMBsaD;1 z#elpKDg*mqasWRyY+2Wh%9`dj>i2MMDhvxSdL|p9v0xBKtXNEk%?TRjLkCR)bg}#w}XcF6FV#uh7Ff>%z)X!hI zz5Wtr!{*rnZ)Lj zRe&zJ=A@+B`YQqksb*va7cv7ikeaz-re>jWGhm84O%&XnA& zEa{=$K^FNt%vACF*y*FOKU!up5)unqi6D1a3-LX@j{hL*c)|9}%X3QQ&yhKA6*Pwu zhPsep2wo7>LTd-A>y`OI@g;r`;;Bw2zg4ND2m=dehXS1;-;}QoL4E_@t4h6Z9W6*V z>)Y^tybSfXO0K2@H^4Wp*eTzT2^W;DHWQ4UTh%P#V{+y+XpX*E-riX&^0L4Yp`_}* zQ+EENvKE3EG5moic%!(yx$rpfHR$C^WN-3tQ}oFadMDEz9yqDvzrf5AVk|l588b9P zXg1Qg#ztHamBd~C3s>NRV7d;eR+Zr6d46VK*Bbb3rIf+=CC8#+BU43xuM zE{g8cf>Ri_M1;!LNUxS>KXGph95%pCZq8%6)La%XZ^S9?cPfF-fXlewEF7oN(# zt@!~=d35s1dN$5xO7ix;Ov$X0u3X0QOIN2Vjj9iDzD*g-==?Xqs-MP`e5239NTOqzLsOY(so~P2W)?hl|D~zco8!1(sp{; znMIrqOv05q`!mli|CHXJ?>JFbYL*po+;aDH=)f{xXXvfBT_J62_&3D0fyNXVUrNS1 zgP6KcL8RyNz>=9TpW(u_($yCul+$lTC)b&V7WT+z|y-gMTbmx1908JXY3|U%L z^!Tv++`|`mk3~|a~`A%0Dx_7 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 La0&{@|GxT^H~GGNxtzG11KfC~tfmaW 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 Date: Thu, 6 Aug 2026 18:24:59 -0300 Subject: [PATCH 06/10] Revert "docs(api): add before/after screenshots for validateCart PR" This reverts commit d5be27c4e155b56a0d1ddfde55b23d530e77e6ca. --- .github/assets/pr-3435/antes-validate-cart.png | Bin 75587 -> 0 bytes .github/assets/pr-3435/depois-validate-cart.png | Bin 80793 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/assets/pr-3435/antes-validate-cart.png delete mode 100644 .github/assets/pr-3435/depois-validate-cart.png diff --git a/.github/assets/pr-3435/antes-validate-cart.png b/.github/assets/pr-3435/antes-validate-cart.png deleted file mode 100644 index 54ff8cf787437928fefb6a75f9b3213069e8a8df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75587 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%0Dx_7 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 La0&{@|GxT^H~GGNxtzG11KfC~tfmaW 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 Date: Tue, 11 Aug 2026 21:23:49 -0300 Subject: [PATCH 07/10] fix(api): keep orderForm sales channel after stale validateCart sync Stop refetching Checkout with a lagging session SC on later validations, which wiped Quick Order items one request after the first preserve/adopt. Expose optional StoreOrder.salesChannel when SC was adopted from a stale cart. --- packages/api/src/__generated__/schema.ts | 6 ++ .../platforms/vtex/resolvers/validateCart.ts | 59 ++++++++++++------- .../src/platforms/vtex/typeDefs/order.graphql | 7 +++ .../platforms/vtex/utils/cartSalesChannel.ts | 32 +++++----- .../vtex/utils/cartSalesChannel.test.ts | 37 +++++------- packages/core/@generated/graphql.ts | 6 ++ .../sdk/cart/waitForSessionValidated.test.ts | 2 + 7 files changed, 93 insertions(+), 56 deletions(-) diff --git a/packages/api/src/__generated__/schema.ts b/packages/api/src/__generated__/schema.ts index 8889e0f090..ead60a9c88 100644 --- a/packages/api/src/__generated__/schema.ts +++ b/packages/api/src/__generated__/schema.ts @@ -1616,6 +1616,12 @@ export type StoreOrder = { acceptedOffer: Array; /** ID of the order in [VTEX order management](https://help.vtex.com/en/tutorial/license-manager-resources-oms--60QcBsvWeum02cFi3GjBzg#). */ orderNumber: Scalars['String']['output']; + /** + * Sales channel of the underlying orderForm when FastStore adopted it after an + * external cart change (e.g. Quick Order). Clients should align `session.channel` + * to this value so later validations do not force a stale session SC. + */ + salesChannel?: Maybe; /** Indicates whether or not items with attachments should be split. */ shouldSplitItem?: Maybe; }; diff --git a/packages/api/src/platforms/vtex/resolvers/validateCart.ts b/packages/api/src/platforms/vtex/resolvers/validateCart.ts index d0a3900f77..8fc2698f1c 100644 --- a/packages/api/src/platforms/vtex/resolvers/validateCart.ts +++ b/packages/api/src/platforms/vtex/resolvers/validateCart.ts @@ -3,7 +3,7 @@ import deepEquals from 'fast-deep-equal' import { parse } from 'cookie' import { channelAfterExternalOrderFormSync, - shouldRefetchOrderFormWithSessionSalesChannel, + channelWhenSessionDivergesFromOrderForm, } from '../utils/cartSalesChannel' import { mutateChannelContext, mutateLocaleContext } from '../utils/contex' import { md5 } from '../utils/md5' @@ -179,7 +179,8 @@ const joinItems = (form: OrderForm) => { const orderFormToCart = async ( form: OrderForm, skuLoader: GraphqlContext['loaders']['skuLoader'], - shouldSplitItem?: boolean | null + shouldSplitItem?: boolean | null, + adoptedSalesChannel?: string | null ) => { return { order: { @@ -189,6 +190,7 @@ const orderFormToCart = async ( product: await skuLoader.load(`${item.id}-invisibleItems`), })), shouldSplitItem, + ...(adoptedSalesChannel ? { salesChannel: adoptedSalesChannel } : {}), }, messages: form.messages.map(({ text, status }) => ({ text, @@ -352,6 +354,24 @@ const adoptOrderFormSalesChannelIfNeeded = ( isOrderFormStaleFlag ) + if (adoptedChannel) { + mutateChannelContext(ctx, adoptedChannel) + return orderForm.salesChannel ? String(orderForm.salesChannel) : null + } + + return null +} + +/** Keep Checkout on the orderForm SC when the browser session lags behind it. */ +const adoptOrderFormSalesChannelWhenSessionDiverges = ( + ctx: GraphqlContext, + orderForm: OrderForm +) => { + const adoptedChannel = channelWhenSessionDivergesFromOrderForm( + ctx.storage.channel, + orderForm.salesChannel + ) + if (adoptedChannel) { mutateChannelContext(ctx, adoptedChannel) } @@ -402,7 +422,7 @@ export const validateCart = async ( // items only available in the orderForm's trade policy. New carts still // send `sc` from the session (see commerce.checkout.orderForm). const orderFormId = orderFormIdFromCookie || undefined - let orderForm = await commerce.checkout.orderForm({ + const orderForm = await commerce.checkout.orderForm({ id: orderFormId, channel: ctx.storage.channel, preserveSalesChannel: Boolean(orderFormId), @@ -428,7 +448,11 @@ export const validateCart = async ( if (isStale) { // Adopt the orderForm SC so subsequent checkout calls (etag, etc.) stay // on the trade policy that actually owns the items. - adoptOrderFormSalesChannelIfNeeded(ctx, orderForm, isStale) + const adoptedSalesChannel = adoptOrderFormSalesChannelIfNeeded( + ctx, + orderForm, + isStale + ) const newOrderForm = await setOrderFormEtag( orderForm, @@ -436,26 +460,19 @@ export const validateCart = async ( sessionJwt ).then(joinItems) if (orderNumber) { - return orderFormToCart(newOrderForm, skuLoader, shouldSplitItem) + return orderFormToCart( + newOrderForm, + skuLoader, + shouldSplitItem, + adoptedSalesChannel + ) } } - // Session owns the channel when the cart is not externally stale. If the - // user switched sales channel in-session (e.g. locale/binding), re-fetch - // with the session SC so Checkout recalculates under the new trade policy. - if ( - shouldRefetchOrderFormWithSessionSalesChannel( - ctx.storage.channel.salesChannel, - orderForm.salesChannel, - isStale - ) - ) { - orderForm = await commerce.checkout.orderForm({ - id: orderForm.orderFormId, - channel: ctx.storage.channel, - preserveSalesChannel: false, - }) - } + // Keep Checkout on the orderForm trade policy when the browser session still + // has a stale SC (Quick Order). Refetching with `sc=session` would wipe + // items that exist only on the orderForm's sales channel. + adoptOrderFormSalesChannelWhenSessionDiverges(ctx, orderForm) // Step2: Process items from both browser and checkout so they have the same shape const browserItemsById = groupById(acceptedOffer) diff --git a/packages/api/src/platforms/vtex/typeDefs/order.graphql b/packages/api/src/platforms/vtex/typeDefs/order.graphql index 88d29520c1..a57e2b2492 100644 --- a/packages/api/src/platforms/vtex/typeDefs/order.graphql +++ b/packages/api/src/platforms/vtex/typeDefs/order.graphql @@ -14,6 +14,13 @@ type StoreOrder { Indicates whether or not items with attachments should be split. """ shouldSplitItem: Boolean + """ + Sales channel of the underlying orderForm when FastStore adopted it after an + external cart change (e.g. Quick Order). Null on ordinary validations where + no SC adoption happened. Optional — existing clients that omit this field + are unaffected. + """ + salesChannel: String } """ diff --git a/packages/api/src/platforms/vtex/utils/cartSalesChannel.ts b/packages/api/src/platforms/vtex/utils/cartSalesChannel.ts index 29acc3440c..5ecd7aa9b4 100644 --- a/packages/api/src/platforms/vtex/utils/cartSalesChannel.ts +++ b/packages/api/src/platforms/vtex/utils/cartSalesChannel.ts @@ -33,23 +33,27 @@ export function channelAfterExternalOrderFormSync( } /** - * After a non-stale validation, the session owns the channel. If session SC - * differs from the orderForm's SC (e.g. locale/binding switch), the cart must - * be re-fetched with the session SC so Checkout recalculates under the new - * trade policy. + * When session SC and orderForm SC diverge, keep Checkout operations on the + * orderForm trade policy. Forcing the session SC (refetch / item updates with + * `sc=session`) reintroduces the Quick Order wipe after the first stale sync. */ -export function shouldRefetchOrderFormWithSessionSalesChannel( - sessionSalesChannel: string | undefined, - orderFormSalesChannel: string | null | undefined, - isOrderFormStale: boolean -): boolean { - if (isOrderFormStale) { - return false +export function channelWhenSessionDivergesFromOrderForm( + currentChannel: Required, + orderFormSalesChannel: string | null | undefined +): string | null { + if (orderFormSalesChannel == null || orderFormSalesChannel === '') { + return null } - if (!sessionSalesChannel || !orderFormSalesChannel) { - return false + if ( + String(orderFormSalesChannel) === String(currentChannel.salesChannel ?? '') + ) { + return null } - return String(sessionSalesChannel) !== String(orderFormSalesChannel) + return ChannelMarshal.stringify({ + ...currentChannel, + salesChannel: String(orderFormSalesChannel), + hasOnlyDefaultSalesChannel: false, + }) } diff --git a/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts b/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts index 0d76c75e53..eded3709e2 100644 --- a/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts +++ b/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest' import { channelAfterExternalOrderFormSync, - shouldRefetchOrderFormWithSessionSalesChannel, + channelWhenSessionDivergesFromOrderForm, } from '../../../../../src/platforms/vtex/utils/cartSalesChannel' import type { Channel } from '../../../../../src/platforms/vtex/utils/channel' @@ -52,31 +52,26 @@ describe('channelAfterExternalOrderFormSync', () => { }) }) -describe('shouldRefetchOrderFormWithSessionSalesChannel', () => { - it('does not refetch when the orderForm is externally stale', () => { - expect(shouldRefetchOrderFormWithSessionSalesChannel('1', '4', true)).toBe( - false +describe('channelWhenSessionDivergesFromOrderForm', () => { + it('adopts orderForm SC when session lags behind the cart', () => { + const result = channelWhenSessionDivergesFromOrderForm( + baseChannel('1'), + '2' ) - }) - it('does not refetch when SCs already match', () => { - expect(shouldRefetchOrderFormWithSessionSalesChannel('1', '1', false)).toBe( - false - ) - }) + if (result === null) { + throw new Error('expected channel adoption when session diverges') + } - it('refetches when session SC diverges and cart is not stale (locale switch)', () => { - expect(shouldRefetchOrderFormWithSessionSalesChannel('2', '1', false)).toBe( - true - ) + expect(JSON.parse(result)).toMatchObject({ + salesChannel: '2', + hasOnlyDefaultSalesChannel: false, + }) }) - it('does not refetch when either SC is missing', () => { - expect( - shouldRefetchOrderFormWithSessionSalesChannel(undefined, '1', false) - ).toBe(false) + it('returns null when SCs already match', () => { expect( - shouldRefetchOrderFormWithSessionSalesChannel('1', null, false) - ).toBe(false) + channelWhenSessionDivergesFromOrderForm(baseChannel('2'), '2') + ).toBeNull() }) }) diff --git a/packages/core/@generated/graphql.ts b/packages/core/@generated/graphql.ts index 27d861e8fd..37932311d4 100644 --- a/packages/core/@generated/graphql.ts +++ b/packages/core/@generated/graphql.ts @@ -1538,6 +1538,12 @@ export type StoreOrder = { acceptedOffer: Array; /** ID of the order in [VTEX order management](https://help.vtex.com/en/tutorial/license-manager-resources-oms--60QcBsvWeum02cFi3GjBzg#). */ orderNumber: Scalars['String']['output']; + /** + * Sales channel of the underlying orderForm when FastStore adopted it after an + * external cart change (e.g. Quick Order). Clients should align `session.channel` + * to this value so later validations do not force a stale session SC. + */ + salesChannel: Maybe; /** Indicates whether or not items with attachments should be split. */ shouldSplitItem: Maybe; }; diff --git a/packages/core/test/sdk/cart/waitForSessionValidated.test.ts b/packages/core/test/sdk/cart/waitForSessionValidated.test.ts index fafe8af664..e4a57b39c7 100644 --- a/packages/core/test/sdk/cart/waitForSessionValidated.test.ts +++ b/packages/core/test/sdk/cart/waitForSessionValidated.test.ts @@ -30,6 +30,7 @@ describe('waitForSessionValidated', () => { const listeners: Array<(value: boolean) => void> = [] const store = { read: vi.fn(() => false), + readInitial: vi.fn(() => false), subscribe: vi.fn((listener: (value: boolean) => void) => { listeners.push(listener) return () => { @@ -75,6 +76,7 @@ describe('waitForSessionValidated', () => { current = true return value }), + readInitial: vi.fn(() => false), subscribe: vi.fn((listener: (value: boolean) => void) => { listeners.push(listener) return () => { From 8943da7821f8abec08a39b7907a258bf156b05ee Mon Sep 17 00:00:00 2001 From: eduardoformiga Date: Tue, 11 Aug 2026 23:05:29 -0300 Subject: [PATCH 08/10] fix(api): sync adopted orderForm sales channel into session Keep Checkout on the orderForm trade policy when session SC lags, return the adopted SC from validateCart, and silently align fs::session so later requests use the correct channel without revalidating the cart mid-flight. --- packages/api/src/__generated__/schema.ts | 6 +- .../platforms/vtex/clients/commerce/index.ts | 5 +- .../platforms/vtex/resolvers/validateCart.ts | 68 +++++---- .../vtex/resolvers/validateSession.ts | 13 +- .../src/platforms/vtex/typeDefs/order.graphql | 7 +- .../platforms/vtex/utils/cartSalesChannel.ts | 40 +----- .../__snapshots__/mutations.test.ts.snap | 2 + .../api/test/integration/mutations.test.ts | 132 ++++++++++++++++++ .../api/test/mocks/ValidateCartMutation.ts | 1 + .../vtex/utils/cartSalesChannel.test.ts | 54 ++----- packages/core/@generated/gql.ts | 6 +- packages/core/@generated/graphql.ts | 10 +- packages/core/src/sdk/cart/index.ts | 11 ++ .../src/sdk/cart/waitForSessionValidated.ts | 7 +- packages/core/src/sdk/session/index.ts | 11 ++ .../session/syncSalesChannelFromOrderForm.ts | 43 ++++++ .../syncSalesChannelFromOrderForm.test.ts | 58 ++++++++ 17 files changed, 342 insertions(+), 132 deletions(-) create mode 100644 packages/core/src/sdk/session/syncSalesChannelFromOrderForm.ts create mode 100644 packages/core/test/sdk/session/syncSalesChannelFromOrderForm.test.ts diff --git a/packages/api/src/__generated__/schema.ts b/packages/api/src/__generated__/schema.ts index ead60a9c88..dec26def8d 100644 --- a/packages/api/src/__generated__/schema.ts +++ b/packages/api/src/__generated__/schema.ts @@ -1617,9 +1617,9 @@ export type StoreOrder = { /** ID of the order in [VTEX order management](https://help.vtex.com/en/tutorial/license-manager-resources-oms--60QcBsvWeum02cFi3GjBzg#). */ orderNumber: Scalars['String']['output']; /** - * Sales channel of the underlying orderForm when FastStore adopted it after an - * external cart change (e.g. Quick Order). Clients should align `session.channel` - * to this value so later validations do not force a stale session SC. + * Sales channel of the underlying orderForm when FastStore adopted it because + * the browser session was stale (e.g. after Quick Order). Clients should align + * `session.channel` to this value. Null when no SC adoption happened. */ salesChannel?: Maybe; /** Indicates whether or not items with attachments should be split. */ diff --git a/packages/api/src/platforms/vtex/clients/commerce/index.ts b/packages/api/src/platforms/vtex/clients/commerce/index.ts index cd17795121..e46c3e888c 100644 --- a/packages/api/src/platforms/vtex/clients/commerce/index.ts +++ b/packages/api/src/platforms/vtex/clients/commerce/index.ts @@ -462,10 +462,9 @@ export const VtexCommerce = ( if (id) { params.set('refreshOutdatedData', refreshOutdatedData.toString()) } - const qs = params.toString() const orderFormPath = id ? `/${id}` : '' - const queryString = qs ? `?${qs}` : '' - const url = `${base}/api/checkout/pub/orderForm${orderFormPath}${queryString}` + // Always has at least `sc` (new cart) or `refreshOutdatedData` (existing). + const url = `${base}/api/checkout/pub/orderForm${orderFormPath}?${params}` return fetchAPI( url, diff --git a/packages/api/src/platforms/vtex/resolvers/validateCart.ts b/packages/api/src/platforms/vtex/resolvers/validateCart.ts index 8fc2698f1c..ff573332d7 100644 --- a/packages/api/src/platforms/vtex/resolvers/validateCart.ts +++ b/packages/api/src/platforms/vtex/resolvers/validateCart.ts @@ -1,10 +1,7 @@ import deepEquals from 'fast-deep-equal' import { parse } from 'cookie' -import { - channelAfterExternalOrderFormSync, - channelWhenSessionDivergesFromOrderForm, -} from '../utils/cartSalesChannel' +import { channelWhenSessionDivergesFromOrderForm } from '../utils/cartSalesChannel' import { mutateChannelContext, mutateLocaleContext } from '../utils/contex' import { md5 } from '../utils/md5' import { @@ -342,31 +339,11 @@ const getCookieCheckoutOrderNumber = (ctx: string, nameCookie: string) => { return cookieValue ? cookieValue.split('=')[1] : '' } -/** Adopt the orderForm SC when another system changed the cart (stale etag). */ -const adoptOrderFormSalesChannelIfNeeded = ( - ctx: GraphqlContext, - orderForm: OrderForm, - isOrderFormStaleFlag: boolean -) => { - const adoptedChannel = channelAfterExternalOrderFormSync( - ctx.storage.channel, - orderForm.salesChannel, - isOrderFormStaleFlag - ) - - if (adoptedChannel) { - mutateChannelContext(ctx, adoptedChannel) - return orderForm.salesChannel ? String(orderForm.salesChannel) : null - } - - return null -} - /** Keep Checkout on the orderForm SC when the browser session lags behind it. */ const adoptOrderFormSalesChannelWhenSessionDiverges = ( ctx: GraphqlContext, orderForm: OrderForm -) => { +): string | null => { const adoptedChannel = channelWhenSessionDivergesFromOrderForm( ctx.storage.channel, orderForm.salesChannel @@ -374,7 +351,10 @@ const adoptOrderFormSalesChannelWhenSessionDiverges = ( if (adoptedChannel) { mutateChannelContext(ctx, adoptedChannel) + return orderForm.salesChannel ? String(orderForm.salesChannel) : null } + + return null } /** @@ -448,10 +428,9 @@ export const validateCart = async ( if (isStale) { // Adopt the orderForm SC so subsequent checkout calls (etag, etc.) stay // on the trade policy that actually owns the items. - const adoptedSalesChannel = adoptOrderFormSalesChannelIfNeeded( + const adoptedSalesChannel = adoptOrderFormSalesChannelWhenSessionDiverges( ctx, - orderForm, - isStale + orderForm ) const newOrderForm = await setOrderFormEtag( @@ -472,7 +451,10 @@ export const validateCart = async ( // Keep Checkout on the orderForm trade policy when the browser session still // has a stale SC (Quick Order). Refetching with `sc=session` would wipe // items that exist only on the orderForm's sales channel. - adoptOrderFormSalesChannelWhenSessionDiverges(ctx, orderForm) + const adoptedSalesChannel = adoptOrderFormSalesChannelWhenSessionDiverges( + ctx, + orderForm + ) // Step2: Process items from both browser and checkout so they have the same shape const browserItemsById = groupById(acceptedOffer) @@ -536,8 +518,18 @@ export const validateCart = async ( ? shouldUpdateShippingData(orderForm, session) : { updateShipping: false } - // If there are no item changes and no shipping data updates needed, return null + // If there are no item/shipping changes: still return the cart when we + // adopted the orderForm SC so the client can align `fs::session`. if (changes.length === 0 && !updateShipping) { + if (adoptedSalesChannel) { + return orderFormToCart( + orderForm, + skuLoader, + shouldSplitItem, + adoptedSalesChannel + ) + } + return null } @@ -607,9 +599,23 @@ export const validateCart = async ( // Step5: If no changes detected before/after updating orderForm, the order is validated if (equals(order, updatedOrderForm) && equalMessages) { + if (adoptedSalesChannel) { + return orderFormToCart( + updatedOrderForm, + skuLoader, + shouldSplitItem, + adoptedSalesChannel + ) + } + return null } // Step6: There were changes, convert orderForm to StoreCart - return orderFormToCart(updatedOrderForm, skuLoader, shouldSplitItem) + return orderFormToCart( + updatedOrderForm, + skuLoader, + shouldSplitItem, + adoptedSalesChannel + ) } diff --git a/packages/api/src/platforms/vtex/resolvers/validateSession.ts b/packages/api/src/platforms/vtex/resolvers/validateSession.ts index 0b5e474a45..fc0a74f096 100644 --- a/packages/api/src/platforms/vtex/resolvers/validateSession.ts +++ b/packages/api/src/platforms/vtex/resolvers/validateSession.ts @@ -170,10 +170,19 @@ export const validateSession = async ( }, country: store?.countryCode?.value ?? country, channel: ChannelMarshal.stringify({ - salesChannel: store?.channel?.value ?? channel.salesChannel, + // When the client already pinned an explicit SC (e.g. adopted from the + // orderForm after Quick Order), keep it. Session Manager often still + // reports the default SC and would otherwise overwrite the adoption. + salesChannel: + channel.hasOnlyDefaultSalesChannel === false + ? channel.salesChannel || store?.channel?.value + : (store?.channel?.value ?? channel.salesChannel), regionId: checkout?.regionId?.value ?? channel.regionId, seller: seller?.id, - hasOnlyDefaultSalesChannel: !store?.channel?.value, + hasOnlyDefaultSalesChannel: + channel.hasOnlyDefaultSalesChannel === false + ? false + : !store?.channel?.value, }), /** * B2B data structure in Session: diff --git a/packages/api/src/platforms/vtex/typeDefs/order.graphql b/packages/api/src/platforms/vtex/typeDefs/order.graphql index a57e2b2492..925fe20be8 100644 --- a/packages/api/src/platforms/vtex/typeDefs/order.graphql +++ b/packages/api/src/platforms/vtex/typeDefs/order.graphql @@ -15,10 +15,9 @@ type StoreOrder { """ shouldSplitItem: Boolean """ - Sales channel of the underlying orderForm when FastStore adopted it after an - external cart change (e.g. Quick Order). Null on ordinary validations where - no SC adoption happened. Optional — existing clients that omit this field - are unaffected. + Sales channel of the underlying orderForm when FastStore adopted it because + the browser session was stale (e.g. after Quick Order). Clients should align + `session.channel` to this value. Null when no SC adoption happened. """ salesChannel: String } diff --git a/packages/api/src/platforms/vtex/utils/cartSalesChannel.ts b/packages/api/src/platforms/vtex/utils/cartSalesChannel.ts index 5ecd7aa9b4..c6567a153e 100644 --- a/packages/api/src/platforms/vtex/utils/cartSalesChannel.ts +++ b/packages/api/src/platforms/vtex/utils/cartSalesChannel.ts @@ -2,40 +2,12 @@ import type { Channel } from './channel' import ChannelMarshal from './channel' /** - * When another system changed the orderForm (stale cartEtag), the orderForm's - * sales channel is authoritative. Returns a channel string to apply via - * `mutateChannelContext`, or `null` when no adoption is needed. - */ -export function channelAfterExternalOrderFormSync( - currentChannel: Required, - orderFormSalesChannel: string | null | undefined, - isOrderFormStale: boolean -): string | null { - if (!isOrderFormStale) { - return null - } - - if (orderFormSalesChannel == null || orderFormSalesChannel === '') { - return null - } - - if ( - String(orderFormSalesChannel) === String(currentChannel.salesChannel ?? '') - ) { - return null - } - - return ChannelMarshal.stringify({ - ...currentChannel, - salesChannel: String(orderFormSalesChannel), - hasOnlyDefaultSalesChannel: false, - }) -} - -/** - * When session SC and orderForm SC diverge, keep Checkout operations on the - * orderForm trade policy. Forcing the session SC (refetch / item updates with - * `sc=session`) reintroduces the Quick Order wipe after the first stale sync. + * When session SC and orderForm SC diverge, keep Checkout on the orderForm + * trade policy. Used after external cart changes (stale etag / Quick Order) and + * on later validations while the browser session still lags. + * + * Forcing the session SC (refetch / item updates with `sc=session`) would drop + * items that exist only on the orderForm's sales channel. */ export function channelWhenSessionDivergesFromOrderForm( currentChannel: Required, diff --git a/packages/api/test/integration/__snapshots__/mutations.test.ts.snap b/packages/api/test/integration/__snapshots__/mutations.test.ts.snap index d1457e4b00..2a54eed993 100644 --- a/packages/api/test/integration/__snapshots__/mutations.test.ts.snap +++ b/packages/api/test/integration/__snapshots__/mutations.test.ts.snap @@ -24,6 +24,7 @@ exports[`\`validateCart\` mutation should return new cart when etag is stale 1`] }, ], "orderNumber": "edbe3b03c8c94827a37ec5a6a4648fd2", + "salesChannel": null, }, }, }, @@ -54,6 +55,7 @@ exports[`\`validateCart\` mutation should return the full order when an invalid }, ], "orderNumber": "edbe3b03c8c94827a37ec5a6a4648fd2", + "salesChannel": null, }, }, }, diff --git a/packages/api/test/integration/mutations.test.ts b/packages/api/test/integration/mutations.test.ts index 13aa30cf07..bd0060c1e0 100644 --- a/packages/api/test/integration/mutations.test.ts +++ b/packages/api/test/integration/mutations.test.ts @@ -7,6 +7,7 @@ import { ValidateCartMutation, checkoutOrderFormCustomDataInvalidFetch, checkoutOrderFormCustomDataStaleFetch, + checkoutOrderFormCustomDataValidFetch, checkoutOrderFormInvalidFetch, checkoutOrderFormItemsInvalidFetch, checkoutOrderFormStaleFetch, @@ -164,3 +165,134 @@ test('`validateCart` mutation should return new cart when etag is stale', async expect(response).toMatchSnapshot() }) + +const withOrderFormSalesChannel = < + T extends { result: { salesChannel?: string } }, +>( + fetchMock: T, + salesChannel: string +): T => ({ + ...fetchMock, + result: { + ...fetchMock.result, + salesChannel, + }, +}) + +const salesChannelFetch = (salesChannel: string) => ({ + ...salesChannelStaleFetch, + info: salesChannelStaleFetch.info.replace( + '/saleschannel/1', + `/saleschannel/${salesChannel}` + ), + result: { + ...salesChannelStaleFetch.result, + Id: Number(salesChannel), + }, +}) + +/** + * Non-stale orderForm (valid etag) + divergent browser cart → item update path. + * Session channel remains SC1 via apiOptions; orderForm is on SC2. + */ +test('`validateCart` updates items with orderForm SC when session SC diverges', async () => { + const run = await createRunner() + const orderFormOnSc2 = withOrderFormSalesChannel( + checkoutOrderFormValidFetch, + '2' + ) + const customDataOnSc2 = withOrderFormSalesChannel( + checkoutOrderFormCustomDataValidFetch, + '2' + ) + + mockedFetch.mockImplementation((info, init, options) => { + const url = String(info) + + if (url.includes('/items?')) { + expect(url).toContain('sc=2') + expect(url).not.toContain('sc=1') + return { + ...checkoutOrderFormItemsInvalidFetch.result, + salesChannel: '2', + } + } + + if (url.includes('/customData/faststore/cartEtag')) { + return customDataOnSc2.result + } + + return pickFetchAPICallResult(info, init, [ + orderFormOnSc2, + productSearchPage1Count1Fetch, + salesChannelFetch('2'), + ]) + }) + + const response = await run(ValidateCartMutation, { cart: InvalidCart }) + + const getOrderFormUrl = mockedFetch.mock.calls + .map(([info]) => String(info)) + .find( + (url) => + /\/orderForm\/[^/?]+(\?|$)/.test(url) && + !url.includes('/items') && + !url.includes('/customData') + ) + const itemsUrl = mockedFetch.mock.calls + .map(([info]) => String(info)) + .find((url) => url.includes('/items?')) + + expect(getOrderFormUrl).toBeDefined() + expect(getOrderFormUrl).not.toContain('sc=') + expect(itemsUrl).toBeDefined() + expect(itemsUrl).toContain('sc=2') + expect( + mockedFetch.mock.calls.some(([info]) => String(info).includes('sc=1')) + ).toBe(false) + expect(response.errors).toBeUndefined() + expect(response.data?.validateCart).not.toBeNull() + expect(response.data?.validateCart?.order?.salesChannel).toBe('2') +}) + +test('`validateCart` adopts orderForm SC on stale etag without refetching session SC', async () => { + const run = await createRunner() + const staleOnSc2 = withOrderFormSalesChannel(checkoutOrderFormStaleFetch, '2') + const customDataOnSc2 = withOrderFormSalesChannel( + checkoutOrderFormCustomDataStaleFetch, + '2' + ) + + mockedFetch.mockImplementation((info, init) => + pickFetchAPICallResult(info, init, [ + staleOnSc2, + customDataOnSc2, + productSearchPage1Count1Fetch, + salesChannelFetch('2'), + ]) + ) + + const response = await run(ValidateCartMutation, { cart: InvalidCart }) + + const checkoutUrls = mockedFetch.mock.calls + .map(([info]) => String(info)) + .filter((url) => url.includes('/api/checkout/pub/orderForm')) + const getOrderFormUrl = checkoutUrls.find( + (url) => + /\/orderForm\/[^/?]+(\?|$)/.test(url) && + !url.includes('/items') && + !url.includes('/customData') + ) + + expect(getOrderFormUrl).toBeDefined() + expect(getOrderFormUrl).not.toContain('sc=') + expect(checkoutUrls.some((url) => url.includes('sc=1'))).toBe(false) + expect( + mockedFetch.mock.calls.some(([info]) => + String(info).includes('/saleschannel/2') + ) + ).toBe(true) + expect(response.errors).toBeUndefined() + expect(response.data?.validateCart).not.toBeNull() + expect(response.data?.validateCart?.order?.salesChannel).toBe('2') +}) diff --git a/packages/api/test/mocks/ValidateCartMutation.ts b/packages/api/test/mocks/ValidateCartMutation.ts index 4a4672583e..3a54fe2e70 100644 --- a/packages/api/test/mocks/ValidateCartMutation.ts +++ b/packages/api/test/mocks/ValidateCartMutation.ts @@ -7,6 +7,7 @@ export const ValidateCartMutation = `mutation ValidateCartMutation($cart: IStore } order { orderNumber + salesChannel acceptedOffer { availability itemCondition diff --git a/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts b/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts index eded3709e2..f8900e8768 100644 --- a/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts +++ b/packages/api/test/unit/platforms/vtex/utils/cartSalesChannel.test.ts @@ -1,8 +1,5 @@ import { describe, expect, it } from 'vitest' -import { - channelAfterExternalOrderFormSync, - channelWhenSessionDivergesFromOrderForm, -} from '../../../../../src/platforms/vtex/utils/cartSalesChannel' +import { channelWhenSessionDivergesFromOrderForm } from '../../../../../src/platforms/vtex/utils/cartSalesChannel' import type { Channel } from '../../../../../src/platforms/vtex/utils/channel' const baseChannel = (salesChannel: string): Required => ({ @@ -12,46 +9,6 @@ const baseChannel = (salesChannel: string): Required => ({ hasOnlyDefaultSalesChannel: true, }) -describe('channelAfterExternalOrderFormSync', () => { - it('returns null when the orderForm is not stale', () => { - expect( - channelAfterExternalOrderFormSync(baseChannel('1'), '4', false) - ).toBeNull() - }) - - it('returns null when orderForm SC matches session SC', () => { - expect( - channelAfterExternalOrderFormSync(baseChannel('4'), '4', true) - ).toBeNull() - }) - - it('returns null when orderForm SC is missing', () => { - expect( - channelAfterExternalOrderFormSync(baseChannel('1'), null, true) - ).toBeNull() - expect( - channelAfterExternalOrderFormSync(baseChannel('1'), '', true) - ).toBeNull() - }) - - it('adopts orderForm SC when stale and divergent (Quick Order case)', () => { - const result = channelAfterExternalOrderFormSync( - baseChannel('1'), - '4', - true - ) - - if (result === null) { - throw new Error('expected channel string after adopting orderForm SC') - } - - expect(JSON.parse(result)).toMatchObject({ - salesChannel: '4', - hasOnlyDefaultSalesChannel: false, - }) - }) -}) - describe('channelWhenSessionDivergesFromOrderForm', () => { it('adopts orderForm SC when session lags behind the cart', () => { const result = channelWhenSessionDivergesFromOrderForm( @@ -74,4 +31,13 @@ describe('channelWhenSessionDivergesFromOrderForm', () => { channelWhenSessionDivergesFromOrderForm(baseChannel('2'), '2') ).toBeNull() }) + + it('returns null when orderForm SC is missing', () => { + expect( + channelWhenSessionDivergesFromOrderForm(baseChannel('1'), null) + ).toBeNull() + expect( + channelWhenSessionDivergesFromOrderForm(baseChannel('1'), '') + ).toBeNull() + }) }) diff --git a/packages/core/@generated/gql.ts b/packages/core/@generated/gql.ts index c18bc3146c..9b13e3ea62 100644 --- a/packages/core/@generated/gql.ts +++ b/packages/core/@generated/gql.ts @@ -45,7 +45,7 @@ type Documents = { "\n mutation ProcessOrderAuthorizationMutation($data: IProcessOrderAuthorization!) {\n processOrderAuthorization(data: $data) {\n isPendingForOtherAuthorizer\n ruleForAuthorization {\n orderAuthorizationId\n dimensionId\n rule {\n id\n name\n status\n doId\n authorizedEmails\n priority\n trigger {\n condition {\n conditionType\n description\n lessThan\n greatherThan\n expression\n }\n effect {\n description\n effectType\n funcPath\n }\n }\n timeout\n notification\n scoreInterval {\n accept\n deny\n }\n authorizationData {\n requireAllApprovals\n authorizers {\n id\n email\n type\n authorizationDate\n }\n }\n isUserAuthorized\n isUserNextAuthorizer\n }\n }\n }\n }\n": typeof types.ProcessOrderAuthorizationMutationDocument, "\n query ValidateUser {\n validateUser {\n isValid\n }\n }\n": typeof types.ValidateUserDocument, "\n mutation StartRecommendationSession {\n startRecommendationSession\n }\n": typeof types.StartRecommendationSessionDocument, - "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n": typeof types.ValidateCartMutationDocument, + "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n salesChannel\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n": typeof types.ValidateCartMutationDocument, "\n query ClientPickupPointsQuery(\n $geoCoordinates: IStoreGeoCoordinates\n ) {\n pickupPoints(geoCoordinates: $geoCoordinates) {\n pickupPointDistances {\n pickupId\n distance\n pickupName\n isActive\n address {\n city\n state\n number\n postalCode\n street\n }\n }\n }\n }\n": typeof types.ClientPickupPointsQueryDocument, "\n mutation SubscribeToNewsletter($data: IPersonNewsletter!) {\n subscribeToNewsletter(data: $data) {\n id\n }\n }\n": typeof types.SubscribeToNewsletterDocument, "\n mutation StartOrderEntryOperationMutation($data: IOrderEntryOperation!) {\n startOrderEntryOperation(data: $data) {\n operationId\n }\n }\n": typeof types.StartOrderEntryOperationMutationDocument, @@ -97,7 +97,7 @@ const documents: Documents = { "\n mutation ProcessOrderAuthorizationMutation($data: IProcessOrderAuthorization!) {\n processOrderAuthorization(data: $data) {\n isPendingForOtherAuthorizer\n ruleForAuthorization {\n orderAuthorizationId\n dimensionId\n rule {\n id\n name\n status\n doId\n authorizedEmails\n priority\n trigger {\n condition {\n conditionType\n description\n lessThan\n greatherThan\n expression\n }\n effect {\n description\n effectType\n funcPath\n }\n }\n timeout\n notification\n scoreInterval {\n accept\n deny\n }\n authorizationData {\n requireAllApprovals\n authorizers {\n id\n email\n type\n authorizationDate\n }\n }\n isUserAuthorized\n isUserNextAuthorizer\n }\n }\n }\n }\n": types.ProcessOrderAuthorizationMutationDocument, "\n query ValidateUser {\n validateUser {\n isValid\n }\n }\n": types.ValidateUserDocument, "\n mutation StartRecommendationSession {\n startRecommendationSession\n }\n": types.StartRecommendationSessionDocument, - "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n": types.ValidateCartMutationDocument, + "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n salesChannel\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n": types.ValidateCartMutationDocument, "\n query ClientPickupPointsQuery(\n $geoCoordinates: IStoreGeoCoordinates\n ) {\n pickupPoints(geoCoordinates: $geoCoordinates) {\n pickupPointDistances {\n pickupId\n distance\n pickupName\n isActive\n address {\n city\n state\n number\n postalCode\n street\n }\n }\n }\n }\n": types.ClientPickupPointsQueryDocument, "\n mutation SubscribeToNewsletter($data: IPersonNewsletter!) {\n subscribeToNewsletter(data: $data) {\n id\n }\n }\n": types.SubscribeToNewsletterDocument, "\n mutation StartOrderEntryOperationMutation($data: IOrderEntryOperation!) {\n startOrderEntryOperation(data: $data) {\n operationId\n }\n }\n": types.StartOrderEntryOperationMutationDocument, @@ -242,7 +242,7 @@ export function gql(source: "\n mutation StartRecommendationSession {\n star /** * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function gql(source: "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n"): typeof import('./graphql').ValidateCartMutationDocument; +export function gql(source: "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n salesChannel\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n"): typeof import('./graphql').ValidateCartMutationDocument; /** * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ diff --git a/packages/core/@generated/graphql.ts b/packages/core/@generated/graphql.ts index 37932311d4..f39891dc5a 100644 --- a/packages/core/@generated/graphql.ts +++ b/packages/core/@generated/graphql.ts @@ -1539,9 +1539,9 @@ export type StoreOrder = { /** ID of the order in [VTEX order management](https://help.vtex.com/en/tutorial/license-manager-resources-oms--60QcBsvWeum02cFi3GjBzg#). */ orderNumber: Scalars['String']['output']; /** - * Sales channel of the underlying orderForm when FastStore adopted it after an - * external cart change (e.g. Quick Order). Clients should align `session.channel` - * to this value so later validations do not force a stale session SC. + * Sales channel of the underlying orderForm when FastStore adopted it because + * the browser session was stale (e.g. after Quick Order). Clients should align + * `session.channel` to this value. Null when no SC adoption happened. */ salesChannel: Maybe; /** Indicates whether or not items with attachments should be split. */ @@ -2869,7 +2869,7 @@ export type ValidateCartMutationMutationVariables = Exact<{ }>; -export type ValidateCartMutationMutation = { validateCart: { order: { orderNumber: string, shouldSplitItem: boolean | null, acceptedOffer: Array<{ quantity: number, price: number, priceWithTaxes: number, listPrice: number, listPriceWithTaxes: number, isGift: boolean | null, priceToken: string | null, seller: { identifier: string }, itemOffered: { sku: string, name: string, unitMultiplier: number | null, gtin: string, image: Array<{ url: string, alternateName: string }>, brand: { name: string }, isVariantOf: { productGroupID: string, name: string, skuVariants: { activeVariations: any | null, slugsMap: any | null, availableVariations: any | null } | null }, additionalProperty: Array<{ propertyID: string, name: string, value: any, valueReference: any }> } }> }, messages: Array<{ text: string, status: StoreStatus }> } | null }; +export type ValidateCartMutationMutation = { validateCart: { order: { orderNumber: string, salesChannel: string | null, shouldSplitItem: boolean | null, acceptedOffer: Array<{ quantity: number, price: number, priceWithTaxes: number, listPrice: number, listPriceWithTaxes: number, isGift: boolean | null, priceToken: string | null, seller: { identifier: string }, itemOffered: { sku: string, name: string, unitMultiplier: number | null, gtin: string, image: Array<{ url: string, alternateName: string }>, brand: { name: string }, isVariantOf: { productGroupID: string, name: string, skuVariants: { activeVariations: any | null, slugsMap: any | null, availableVariations: any | null } | null }, additionalProperty: Array<{ propertyID: string, name: string, value: any, valueReference: any }> } }> }, messages: Array<{ text: string, status: StoreStatus }> } | null }; export type CartMessageFragment = { text: string, status: StoreStatus }; @@ -3571,7 +3571,7 @@ export const CancelOrderMutationDocument = {"__meta__":{"operationName":"CancelO export const ProcessOrderAuthorizationMutationDocument = {"__meta__":{"operationName":"ProcessOrderAuthorizationMutation","operationHash":"8c25d37c8d6e7c20ab21bb8a4f4e6a2fe320ea8d"}} as unknown as TypedDocumentString; export const ValidateUserDocument = {"__meta__":{"operationName":"ValidateUser","operationHash":"32f99c73c3de958b64d6bece1afe800469f54548"}} as unknown as TypedDocumentString; export const StartRecommendationSessionDocument = {"__meta__":{"operationName":"StartRecommendationSession","operationHash":"1def6438c0cd87b85002411ac7326c221f192583"}} as unknown as TypedDocumentString; -export const ValidateCartMutationDocument = {"__meta__":{"operationName":"ValidateCartMutation","operationHash":"8199d03debb0a6751ec53d8ee8987b78d0292acb"}} as unknown as TypedDocumentString; +export const ValidateCartMutationDocument = {"__meta__":{"operationName":"ValidateCartMutation","operationHash":"3c71b0d3fc2bade14df68abfa271858beb361b12"}} as unknown as TypedDocumentString; export const ClientPickupPointsQueryDocument = {"__meta__":{"operationName":"ClientPickupPointsQuery","operationHash":"3fa04e88c811fcb5ece7206fd5aa745bdbc143a8"}} as unknown as TypedDocumentString; export const SubscribeToNewsletterDocument = {"__meta__":{"operationName":"SubscribeToNewsletter","operationHash":"feb7005103a859e2bc8cf2360d568806fd88deba"}} as unknown as TypedDocumentString; export const StartOrderEntryOperationMutationDocument = {"__meta__":{"operationName":"StartOrderEntryOperationMutation","operationHash":"78c50fbf9b85d03dbeac9b05b06405217f2ec440"}} as unknown as TypedDocumentString; diff --git a/packages/core/src/sdk/cart/index.ts b/packages/core/src/sdk/cart/index.ts index 09c2ce1c6a..797da04a2e 100644 --- a/packages/core/src/sdk/cart/index.ts +++ b/packages/core/src/sdk/cart/index.ts @@ -14,6 +14,7 @@ import type { import storeConfig from '../../../discovery.config' import { request } from '../graphql/request' import { hasValidatedSessionStore, sessionStore } from '../session' +import { syncSalesChannelFromOrderForm } from '../session/syncSalesChannelFromOrderForm' import { createValidationStore, useStore } from '../useStore' import { waitForSessionValidated } from './waitForSessionValidated' @@ -34,6 +35,7 @@ export const ValidateCartMutation = gql(` validateCart(cart: $cart, session: $session) { order { orderNumber + salesChannel acceptedOffer { ...CartItem } @@ -154,6 +156,15 @@ const validateCart = async (cart: Cart): Promise => { }, }) + const adoptedSalesChannel = validated?.order?.salesChannel + if (adoptedSalesChannel) { + syncSalesChannelFromOrderForm( + adoptedSalesChannel, + () => sessionStore.read(), + (session) => sessionStore.setSilent(session) + ) + } + return ( validated && { id: validated.order.orderNumber, diff --git a/packages/core/src/sdk/cart/waitForSessionValidated.ts b/packages/core/src/sdk/cart/waitForSessionValidated.ts index f632b892ea..338ddb5b77 100644 --- a/packages/core/src/sdk/cart/waitForSessionValidated.ts +++ b/packages/core/src/sdk/cart/waitForSessionValidated.ts @@ -4,9 +4,10 @@ import type { Store } from '@faststore/sdk' export const SESSION_VALIDATION_WAIT_MS = 3_000 /** - * Defers cart validation until session has been validated at least once, so - * `session.channel` (sales channel) is less likely to be stale relative to - * Session Manager / external flows like Quick Order. + * Defers cart validation until session has been validated at least once. + * This reduces first-paint races between Session and Cart; sales-channel + * correctness after external flows (e.g. Quick Order) is enforced in the API + * by preserving/adopting the orderForm SC. */ export const waitForSessionValidated = async ( hasValidatedSessionStore: Store, diff --git a/packages/core/src/sdk/session/index.ts b/packages/core/src/sdk/session/index.ts index fd49575d9d..72568346a3 100644 --- a/packages/core/src/sdk/session/index.ts +++ b/packages/core/src/sdk/session/index.ts @@ -217,6 +217,17 @@ export const sessionStore = { // Trigger cart revalidation when session changes cartStore.set(cartStore.read()) }, + /** + * Updates session without revalidating the cart. Used when aligning + * `channel.salesChannel` to an orderForm SC adopted by `validateCart`. + * Still runs `validateSession` via the store's optimistic validator; that + * path keeps an explicit (non-default) client SC. + */ + setSilent: (val: Session) => { + if (deepEqual(val, defaultStore.read()) === true) return + + defaultStore.set(val) + }, } export async function logoutAndClearSession(session: Session) { diff --git a/packages/core/src/sdk/session/syncSalesChannelFromOrderForm.ts b/packages/core/src/sdk/session/syncSalesChannelFromOrderForm.ts new file mode 100644 index 0000000000..2aaedb0497 --- /dev/null +++ b/packages/core/src/sdk/session/syncSalesChannelFromOrderForm.ts @@ -0,0 +1,43 @@ +import type { Session } from '@faststore/sdk' + +/** + * Aligns `fs::session.channel` with a sales channel adopted from the orderForm + * (e.g. after Quick Order) without revalidating the cart. + * + * Uses `sessionStore.setSilent` so we do not trigger `cartStore.set` mid-flight + * (that race previously wiped SC-exclusive items). Marks the channel as + * explicit (`hasOnlyDefaultSalesChannel: false`) so `validateSession` keeps it. + */ +export function syncSalesChannelFromOrderForm( + salesChannel: string | null | undefined, + readSession: () => Session, + setSilent: (session: Session) => void +): boolean { + if (salesChannel == null || salesChannel === '') { + return false + } + + const session = readSession() + let channel: Record = {} + + try { + channel = JSON.parse(session.channel || '{}') as Record + } catch { + channel = {} + } + + if (String(channel.salesChannel ?? '') === String(salesChannel)) { + return false + } + + setSilent({ + ...session, + channel: JSON.stringify({ + ...channel, + salesChannel: String(salesChannel), + hasOnlyDefaultSalesChannel: false, + }), + }) + + return true +} diff --git a/packages/core/test/sdk/session/syncSalesChannelFromOrderForm.test.ts b/packages/core/test/sdk/session/syncSalesChannelFromOrderForm.test.ts new file mode 100644 index 0000000000..af7cb2961f --- /dev/null +++ b/packages/core/test/sdk/session/syncSalesChannelFromOrderForm.test.ts @@ -0,0 +1,58 @@ +import { describe, expect, it, vi } from 'vitest' +import type { Session } from '@faststore/sdk' +import { syncSalesChannelFromOrderForm } from '../../../src/sdk/session/syncSalesChannelFromOrderForm' + +const baseSession = (salesChannel: string, explicit = true): Session => + ({ + currency: { code: 'BRL', symbol: 'R$' }, + locale: 'pt-BR', + country: 'BRA', + channel: JSON.stringify({ + salesChannel, + regionId: '', + hasOnlyDefaultSalesChannel: !explicit, + }), + person: null, + }) as Session + +describe('syncSalesChannelFromOrderForm', () => { + it('updates session channel silently when SC diverges', () => { + const setSilent = vi.fn() + const synced = syncSalesChannelFromOrderForm( + '2', + () => baseSession('1', false), + setSilent + ) + + expect(synced).toBe(true) + expect(setSilent).toHaveBeenCalledTimes(1) + const next = setSilent.mock.calls[0][0] as Session + expect(JSON.parse(next.channel ?? '{}')).toMatchObject({ + salesChannel: '2', + hasOnlyDefaultSalesChannel: false, + }) + }) + + it('is a no-op when SC already matches', () => { + const setSilent = vi.fn() + const synced = syncSalesChannelFromOrderForm( + '2', + () => baseSession('2'), + setSilent + ) + + expect(synced).toBe(false) + expect(setSilent).not.toHaveBeenCalled() + }) + + it('is a no-op when adopted SC is missing', () => { + const setSilent = vi.fn() + expect( + syncSalesChannelFromOrderForm(null, () => baseSession('1'), setSilent) + ).toBe(false) + expect( + syncSalesChannelFromOrderForm('', () => baseSession('1'), setSilent) + ).toBe(false) + expect(setSilent).not.toHaveBeenCalled() + }) +}) From 5f6e8e909def75f60c24cdaffae9303ed2c0a052 Mon Sep 17 00:00:00 2001 From: eduardoformiga Date: Tue, 11 Aug 2026 23:27:25 -0300 Subject: [PATCH 09/10] fix(api): address Sonar and harden session sales-channel sync Lower validateCart/validateSession cognitive complexity, guard non-object channel JSON before syncing adopted SC, and add coverage for the new paths. --- .../platforms/vtex/resolvers/validateCart.ts | 46 +-- .../vtex/resolvers/validateSession.ts | 311 ++++++++++++------ .../platforms/vtex/utils/sessionChannel.ts | 32 ++ .../api/test/integration/mutations.test.ts | 2 +- .../vtex/utils/sessionChannel.test.ts | 56 ++++ .../session/syncSalesChannelFromOrderForm.ts | 43 ++- .../syncSalesChannelFromOrderForm.test.ts | 91 ++++- 7 files changed, 435 insertions(+), 146 deletions(-) create mode 100644 packages/api/src/platforms/vtex/utils/sessionChannel.ts create mode 100644 packages/api/test/unit/platforms/vtex/utils/sessionChannel.test.ts diff --git a/packages/api/src/platforms/vtex/resolvers/validateCart.ts b/packages/api/src/platforms/vtex/resolvers/validateCart.ts index ff573332d7..105deedb27 100644 --- a/packages/api/src/platforms/vtex/resolvers/validateCart.ts +++ b/packages/api/src/platforms/vtex/resolvers/validateCart.ts @@ -357,6 +357,20 @@ const adoptOrderFormSalesChannelWhenSessionDiverges = ( return null } +/** Return a cart only when an SC was adopted (so the client can sync session). */ +const cartWhenSalesChannelAdoptedOrNull = ( + form: OrderForm, + skuLoader: GraphqlContext['loaders']['skuLoader'], + shouldSplitItem: boolean | null | undefined, + adoptedSalesChannel: string | null +) => { + if (!adoptedSalesChannel) { + return null + } + + return orderFormToCart(form, skuLoader, shouldSplitItem, adoptedSalesChannel) +} + /** * This resolver implements the optimistic cart behavior. The main idea in here * is that we receive a cart from the UI (as query params) and we validate it with @@ -521,16 +535,12 @@ export const validateCart = async ( // If there are no item/shipping changes: still return the cart when we // adopted the orderForm SC so the client can align `fs::session`. if (changes.length === 0 && !updateShipping) { - if (adoptedSalesChannel) { - return orderFormToCart( - orderForm, - skuLoader, - shouldSplitItem, - adoptedSalesChannel - ) - } - - return null + return cartWhenSalesChannelAdoptedOrNull( + orderForm, + skuLoader, + shouldSplitItem, + adoptedSalesChannel + ) } // Step4: Apply delta changes to order form @@ -599,16 +609,12 @@ export const validateCart = async ( // Step5: If no changes detected before/after updating orderForm, the order is validated if (equals(order, updatedOrderForm) && equalMessages) { - if (adoptedSalesChannel) { - return orderFormToCart( - updatedOrderForm, - skuLoader, - shouldSplitItem, - adoptedSalesChannel - ) - } - - return null + return cartWhenSalesChannelAdoptedOrNull( + updatedOrderForm, + skuLoader, + shouldSplitItem, + adoptedSalesChannel + ) } // Step6: There were changes, convert orderForm to StoreCart diff --git a/packages/api/src/platforms/vtex/resolvers/validateSession.ts b/packages/api/src/platforms/vtex/resolvers/validateSession.ts index fc0a74f096..f8ac9ed99b 100644 --- a/packages/api/src/platforms/vtex/resolvers/validateSession.ts +++ b/packages/api/src/platforms/vtex/resolvers/validateSession.ts @@ -6,9 +6,22 @@ import type { StoreMarketingData, StoreSession, } from '../../../__generated__/schema' +import type { Channel } from '../utils/channel' import ChannelMarshal from '../utils/channel' import { resolveActiveContractDisplayName } from '../utils/contract' import { getAuthCookie, parseJwt } from '../utils/cookies' +import { channelAfterSessionManager } from '../utils/sessionChannel' + +type SessionStoreNamespace = { + channel?: { value?: string | null } | null + currencyCode?: { value?: string | null } | null + currencySymbol?: { value?: string | null } | null + countryCode?: { value?: string | null } | null +} + +type SessionCheckoutNamespace = { + regionId?: { value?: string | null } | null +} async function getPreciseLocationData( clients: GraphqlContext['clients'], @@ -38,52 +51,32 @@ async function getPreciseLocationData( } } -export const validateSession = async ( - _: any, - { session: oldSession, search }: MutationValidateSessionArgs, - { clients, headers, account }: GraphqlContext -): Promise => { - const channel = ChannelMarshal.parse(oldSession.channel ?? '') - const postalCode = String(oldSession.postalCode ?? '') - const country = oldSession.country ?? '' - let city = oldSession.city ?? null - let geoCoordinates = oldSession.geoCoordinates ?? null - - // Update location data if postal code and country are provided - const shouldGetPreciseLocation = !city || !geoCoordinates - if (shouldGetPreciseLocation && postalCode !== '' && country !== '') { - const preciseLocation = await getPreciseLocationData( - clients, - country, - postalCode - ) - city = preciseLocation.city - geoCoordinates = preciseLocation.geoCoordinates - } - - /** - * The Session Manager API (https://developers.vtex.com/docs/api-reference/session-manager-api#patch-/api/sessions) adds the query params to the session public namespace. - * This is used by Checkout (checkout-session) and Intelligent Search (search-session) - */ +function buildSessionSearchParams( + search: string, + channel: Required, + postalCode: string, + country: string, + geoCoordinates: StoreSession['geoCoordinates'], + locale: string +) { const params = new URLSearchParams(search) - // Remove facets parameter if it exists so that it does not interfere with session data and prioritize vtex_segment + // Remove facets so they do not interfere with session data / vtex_segment if (params.has('facets')) { params.delete('facets') } - const salesChannel = params.get('sc') ?? channel.salesChannel - params.set('sc', salesChannel) + params.set('sc', params.get('sc') ?? channel.salesChannel) - if (!!postalCode) { + if (postalCode) { params.set('postalCode', postalCode) } - if (!!country) { + if (country) { params.set('country', country) } - if (!!geoCoordinates) { + if (geoCoordinates) { params.set( 'geoCoordinates', `${geoCoordinates.longitude},${geoCoordinates.latitude}` // long,lat is the format expected @@ -91,11 +84,16 @@ export const validateSession = async ( } // Sending the locale to the session, the store-session app will update cultureInfo - params.set('locale', oldSession.locale) + params.set('locale', locale) - const { marketingData: oldMarketingData } = oldSession + return params +} - const marketingData: StoreMarketingData = { +function buildMarketingData( + params: URLSearchParams, + oldMarketingData: StoreSession['marketingData'] +): StoreMarketingData { + return { utmCampaign: params.get('utm_campaign') ?? oldMarketingData?.utmCampaign ?? '', utmMedium: params.get('utm_medium') ?? oldMarketingData?.utmMedium ?? '', @@ -104,11 +102,16 @@ export const validateSession = async ( utmiPage: params.get('utmi_p') ?? oldMarketingData?.utmiPage ?? '', utmiPart: params.get('utmi_pc') ?? oldMarketingData?.utmiPart ?? '', } +} - const jwt = parseJwt(getAuthCookie(headers?.cookie ?? '', account)) - - // Validate JWT token if it exists +async function resolveJwtClaims( + clients: GraphqlContext['clients'], + cookie: string | undefined, + account: string +) { + const jwt = parseJwt(getAuthCookie(cookie ?? '', account)) let isValidJwt = false + if (jwt) { try { const vtexIdResponse = await clients.commerce.vtexid.validate() @@ -119,10 +122,141 @@ export const validateSession = async ( } } - // Only use JWT data if the token is valid - const isRepresentative = isValidJwt ? jwt?.isRepresentative : false - const customerId = isValidJwt ? jwt?.customerId : undefined - const unitId = isValidJwt ? jwt?.unitId : undefined + return { + isRepresentative: isValidJwt ? Boolean(jwt?.isRepresentative) : false, + customerId: isValidJwt ? jwt?.customerId : undefined, + unitId: isValidJwt ? jwt?.unitId : undefined, + } +} + +async function resolveSellerInRegion( + clients: GraphqlContext['clients'], + channel: Required, + postalCode: string, + geoCoordinates: StoreSession['geoCoordinates'], + country: string, + salesChannel: string +) { + if (!channel.seller || !(postalCode || geoCoordinates)) { + return undefined + } + + const regionData = await clients.commerce.checkout.region({ + postalCode, + geoCoordinates, + country, + salesChannel, + }) + const region = regionData?.[0] + + return region?.sellers.find((seller) => channel.seller === seller.id)?.id +} + +function shopperString(value: { value?: unknown } | null | undefined): string { + return typeof value?.value === 'string' ? value.value : '' +} + +function buildB2bSession(args: { + isRepresentative: boolean + authentication: { + customerId?: { value?: string | null } | null + unitName?: { value?: string | null } | null + unitId?: { value?: string | null } | null + storeUserEmail?: { value?: string | null } | null + } | null + shopper: { + firstName?: { value?: unknown } | null + lastName?: { value?: unknown } | null + organizationManager?: { value?: boolean | null } | null + } | null + publicData: { postalCode?: { value?: string | null } | null } | null + profile: Parameters[1] + contract: Parameters[0] + customerId?: string + unitId?: string +}) { + if (!args.isRepresentative) { + return null + } + + const firstName = shopperString(args.shopper?.firstName) + const lastName = shopperString(args.shopper?.lastName) + + return { + isRepresentative: true, + customerId: args.authentication?.customerId?.value ?? args.customerId ?? '', + unitName: args.authentication?.unitName?.value ?? '', + unitId: args.authentication?.unitId?.value ?? args.unitId ?? '', + firstName, + lastName, + userName: `${firstName} ${lastName}`.trim(), + userEmail: args.authentication?.storeUserEmail?.value ?? '', + savedPostalCode: args.publicData?.postalCode?.value ?? '', + contractName: resolveActiveContractDisplayName(args.contract, args.profile), + organizationManager: args.shopper?.organizationManager?.value ?? false, + } +} + +function buildPersonFromProfile( + profile: { + id?: { value?: string | null } | null + email?: { value?: string | null } | null + firstName?: { value?: string | null } | null + lastName?: { value?: string | null } | null + } | null +) { + if (!profile?.id) { + return null + } + + return { + id: profile.id?.value ?? '', + email: profile.email?.value ?? '', + givenName: profile.firstName?.value ?? '', + familyName: profile.lastName?.value ?? '', + } +} + +export const validateSession = async ( + _: any, + { session: oldSession, search }: MutationValidateSessionArgs, + { clients, headers, account }: GraphqlContext +): Promise => { + const channel = ChannelMarshal.parse(oldSession.channel ?? '') + const postalCode = String(oldSession.postalCode ?? '') + const country = oldSession.country ?? '' + let city = oldSession.city ?? null + let geoCoordinates = oldSession.geoCoordinates ?? null + + const shouldGetPreciseLocation = !city || !geoCoordinates + if (shouldGetPreciseLocation && postalCode !== '' && country !== '') { + const preciseLocation = await getPreciseLocationData( + clients, + country, + postalCode + ) + city = preciseLocation.city + geoCoordinates = preciseLocation.geoCoordinates + } + + /** + * The Session Manager API (https://developers.vtex.com/docs/api-reference/session-manager-api#patch-/api/sessions) adds the query params to the session public namespace. + * This is used by Checkout (checkout-session) and Intelligent Search (search-session) + */ + const params = buildSessionSearchParams( + search, + channel, + postalCode, + country, + geoCoordinates, + oldSession.locale + ) + const marketingData = buildMarketingData(params, oldSession.marketingData) + const { isRepresentative, customerId, unitId } = await resolveJwtClaims( + clients, + headers?.cookie, + account + ) const sessionData = await clients.commerce .session(params.toString()) @@ -130,37 +264,34 @@ export const validateSession = async ( const profile = sessionData?.namespaces.profile ?? null const shopper = sessionData?.namespaces.shopper ?? null - const store = sessionData?.namespaces.store ?? null + const store = (sessionData?.namespaces.store ?? + null) as SessionStoreNamespace | null const authentication = sessionData?.namespaces.authentication ?? null - const checkout = sessionData?.namespaces.checkout ?? null + const checkout = (sessionData?.namespaces.checkout ?? + null) as SessionCheckoutNamespace | null const publicData = sessionData?.namespaces.public ?? null - // Fetch contract data for B2B representatives let contract = null if (isRepresentative && profile?.id?.value) { try { contract = await clients.commerce.masterData.getContractById({ contractId: profile.id.value, }) - } catch (err) { + } catch { console.error( `Error while getting contract data for profile ID (${profile.id.value}).\n` ) } } - // Set seller only if it's inside a region - let seller - if (!!channel.seller && (postalCode || geoCoordinates)) { - const regionData = await clients.commerce.checkout.region({ - postalCode, - geoCoordinates, - country, - salesChannel, - }) - const region = regionData?.[0] - seller = region?.sellers.find((seller) => channel.seller === seller.id) - } + const sellerId = await resolveSellerInRegion( + clients, + channel, + postalCode, + geoCoordinates, + country, + params.get('sc') ?? channel.salesChannel + ) const newSession = { ...oldSession, @@ -169,58 +300,30 @@ export const validateSession = async ( symbol: store?.currencySymbol?.value ?? oldSession.currency.symbol, }, country: store?.countryCode?.value ?? country, - channel: ChannelMarshal.stringify({ - // When the client already pinned an explicit SC (e.g. adopted from the - // orderForm after Quick Order), keep it. Session Manager often still - // reports the default SC and would otherwise overwrite the adoption. - salesChannel: - channel.hasOnlyDefaultSalesChannel === false - ? channel.salesChannel || store?.channel?.value - : (store?.channel?.value ?? channel.salesChannel), - regionId: checkout?.regionId?.value ?? channel.regionId, - seller: seller?.id, - hasOnlyDefaultSalesChannel: - channel.hasOnlyDefaultSalesChannel === false - ? false - : !store?.channel?.value, - }), + channel: channelAfterSessionManager( + channel, + store?.channel?.value, + checkout?.regionId?.value, + sellerId + ), /** * B2B data structure in Session: * - Logged user data (shopper): `shopper` namespace * - Unit data: `authentication` namespace * - Contract data: `profile` namespace (those info will be available inside Faststore's Session `person` object) */ - b2b: isRepresentative - ? { - isRepresentative: isRepresentative ?? false, - customerId: authentication?.customerId?.value ?? customerId ?? '', - unitName: authentication?.unitName?.value ?? '', - unitId: authentication?.unitId?.value ?? unitId ?? '', - firstName: - typeof shopper?.firstName?.value === 'string' - ? shopper.firstName.value - : '', - lastName: - typeof shopper?.lastName?.value === 'string' - ? shopper.lastName.value - : '', - userName: - `${typeof shopper?.firstName?.value === 'string' ? shopper.firstName.value : ''} ${typeof shopper?.lastName?.value === 'string' ? shopper.lastName.value : ''}`.trim(), - userEmail: authentication?.storeUserEmail.value ?? '', - savedPostalCode: publicData?.postalCode?.value ?? '', - contractName: resolveActiveContractDisplayName(contract, profile), - organizationManager: shopper?.organizationManager?.value ?? false, - } - : null, + b2b: buildB2bSession({ + isRepresentative, + authentication, + shopper, + publicData, + profile, + contract, + customerId, + unitId, + }), marketingData, - person: profile?.id - ? { - id: profile.id?.value ?? '', - email: profile.email?.value ?? '', - givenName: profile.firstName?.value ?? '', - familyName: profile.lastName?.value ?? '', - } - : null, + person: buildPersonFromProfile(profile), geoCoordinates: (geoCoordinates?.latitude && geoCoordinates?.longitude && diff --git a/packages/api/src/platforms/vtex/utils/sessionChannel.ts b/packages/api/src/platforms/vtex/utils/sessionChannel.ts new file mode 100644 index 0000000000..eaae4d9d94 --- /dev/null +++ b/packages/api/src/platforms/vtex/utils/sessionChannel.ts @@ -0,0 +1,32 @@ +import type { Channel } from './channel' +import ChannelMarshal from './channel' + +/** + * Builds the session `channel` string after Session Manager responds. + * + * When the client already pinned an explicit SC (e.g. adopted from the + * orderForm after Quick Order), keep it. Session Manager often still reports + * the default SC and would otherwise overwrite the adoption. + */ +export function channelAfterSessionManager( + channel: Required, + storeChannelValue: string | null | undefined, + regionId: string | null | undefined, + sellerId: string | undefined +): string { + const hasExplicitSalesChannel = channel.hasOnlyDefaultSalesChannel === false + + const storeSalesChannel = storeChannelValue ?? undefined + const resolvedRegionId = regionId ?? channel.regionId + + return ChannelMarshal.stringify({ + salesChannel: hasExplicitSalesChannel + ? channel.salesChannel || storeSalesChannel + : (storeSalesChannel ?? channel.salesChannel), + regionId: resolvedRegionId ?? undefined, + seller: sellerId, + hasOnlyDefaultSalesChannel: hasExplicitSalesChannel + ? false + : !storeSalesChannel, + }) +} diff --git a/packages/api/test/integration/mutations.test.ts b/packages/api/test/integration/mutations.test.ts index 9355e11833..9878c4284e 100644 --- a/packages/api/test/integration/mutations.test.ts +++ b/packages/api/test/integration/mutations.test.ts @@ -172,7 +172,7 @@ const withOrderFormSalesChannel = < >( fetchMock: T, salesChannel: string -): T => ({ +) => ({ ...fetchMock, result: { ...fetchMock.result, diff --git a/packages/api/test/unit/platforms/vtex/utils/sessionChannel.test.ts b/packages/api/test/unit/platforms/vtex/utils/sessionChannel.test.ts new file mode 100644 index 0000000000..4abbc2dab2 --- /dev/null +++ b/packages/api/test/unit/platforms/vtex/utils/sessionChannel.test.ts @@ -0,0 +1,56 @@ +import { describe, expect, it } from 'vitest' +import { channelAfterSessionManager } from '../../../../../src/platforms/vtex/utils/sessionChannel' +import type { Channel } from '../../../../../src/platforms/vtex/utils/channel' + +const baseChannel = ( + salesChannel: string, + hasOnlyDefaultSalesChannel = true +): Required => ({ + salesChannel, + regionId: 'r1', + seller: '', + hasOnlyDefaultSalesChannel, +}) + +describe('channelAfterSessionManager', () => { + it('keeps an explicit client SC when Session Manager reports another', () => { + expect( + JSON.parse( + channelAfterSessionManager(baseChannel('2', false), '1', 'r2', 's1') + ) + ).toMatchObject({ + salesChannel: '2', + regionId: 'r2', + seller: 's1', + hasOnlyDefaultSalesChannel: false, + }) + }) + + it('prefers Session Manager SC when the client still has the default', () => { + expect( + JSON.parse( + channelAfterSessionManager(baseChannel('1', true), '4', null, undefined) + ) + ).toMatchObject({ + salesChannel: '4', + regionId: 'r1', + hasOnlyDefaultSalesChannel: false, + }) + }) + + it('falls back to the client SC when Session Manager has none', () => { + expect( + JSON.parse( + channelAfterSessionManager( + baseChannel('1', true), + null, + undefined, + undefined + ) + ) + ).toMatchObject({ + salesChannel: '1', + hasOnlyDefaultSalesChannel: true, + }) + }) +}) diff --git a/packages/core/src/sdk/session/syncSalesChannelFromOrderForm.ts b/packages/core/src/sdk/session/syncSalesChannelFromOrderForm.ts index 2aaedb0497..ba86ec9fad 100644 --- a/packages/core/src/sdk/session/syncSalesChannelFromOrderForm.ts +++ b/packages/core/src/sdk/session/syncSalesChannelFromOrderForm.ts @@ -1,5 +1,35 @@ import type { Session } from '@faststore/sdk' +function parseChannelRecord( + raw: string | null | undefined +): Record { + try { + const parsed: unknown = JSON.parse(raw || '{}') + + if ( + parsed !== null && + typeof parsed === 'object' && + !Array.isArray(parsed) + ) { + return parsed as Record + } + } catch { + // Malformed channel — reset below. + } + + return {} +} + +function readSalesChannel(channel: Record): string { + const value = channel.salesChannel + + if (typeof value === 'string' || typeof value === 'number') { + return String(value) + } + + return '' +} + /** * Aligns `fs::session.channel` with a sales channel adopted from the orderForm * (e.g. after Quick Order) without revalidating the cart. @@ -18,15 +48,10 @@ export function syncSalesChannelFromOrderForm( } const session = readSession() - let channel: Record = {} - - try { - channel = JSON.parse(session.channel || '{}') as Record - } catch { - channel = {} - } + const channel = parseChannelRecord(session.channel) + const nextSalesChannel = String(salesChannel) - if (String(channel.salesChannel ?? '') === String(salesChannel)) { + if (readSalesChannel(channel) === nextSalesChannel) { return false } @@ -34,7 +59,7 @@ export function syncSalesChannelFromOrderForm( ...session, channel: JSON.stringify({ ...channel, - salesChannel: String(salesChannel), + salesChannel: nextSalesChannel, hasOnlyDefaultSalesChannel: false, }), }) diff --git a/packages/core/test/sdk/session/syncSalesChannelFromOrderForm.test.ts b/packages/core/test/sdk/session/syncSalesChannelFromOrderForm.test.ts index af7cb2961f..7b325f4116 100644 --- a/packages/core/test/sdk/session/syncSalesChannelFromOrderForm.test.ts +++ b/packages/core/test/sdk/session/syncSalesChannelFromOrderForm.test.ts @@ -2,18 +2,32 @@ import { describe, expect, it, vi } from 'vitest' import type { Session } from '@faststore/sdk' import { syncSalesChannelFromOrderForm } from '../../../src/sdk/session/syncSalesChannelFromOrderForm' -const baseSession = (salesChannel: string, explicit = true): Session => - ({ - currency: { code: 'BRL', symbol: 'R$' }, - locale: 'pt-BR', - country: 'BRA', - channel: JSON.stringify({ - salesChannel, - regionId: '', - hasOnlyDefaultSalesChannel: !explicit, - }), - person: null, - }) as Session +const baseSession = ( + salesChannel: string, + explicit = true, + channelOverride?: string | null +): Session => ({ + currency: { code: 'BRL', symbol: 'R$' }, + locale: 'pt-BR', + country: 'BRA', + channel: + channelOverride !== undefined + ? channelOverride + : JSON.stringify({ + salesChannel, + regionId: '', + hasOnlyDefaultSalesChannel: !explicit, + }), + deliveryMode: null, + addressType: null, + city: null, + postalCode: null, + geoCoordinates: null, + person: null, + b2b: null, + marketingData: null, + refreshAfter: null, +}) describe('syncSalesChannelFromOrderForm', () => { it('updates session channel silently when SC diverges', () => { @@ -55,4 +69,57 @@ describe('syncSalesChannelFromOrderForm', () => { ).toBe(false) expect(setSilent).not.toHaveBeenCalled() }) + + it('resets non-object channel JSON before adopting SC', () => { + const setSilent = vi.fn() + + for (const invalid of ['null', '[]', '"text"', '0', 'false']) { + setSilent.mockClear() + const synced = syncSalesChannelFromOrderForm( + '2', + () => baseSession('1', true, invalid), + setSilent + ) + + expect(synced).toBe(true) + expect(JSON.parse(setSilent.mock.calls[0][0].channel)).toMatchObject({ + salesChannel: '2', + hasOnlyDefaultSalesChannel: false, + }) + } + }) + + it('resets malformed channel JSON before adopting SC', () => { + const setSilent = vi.fn() + const synced = syncSalesChannelFromOrderForm( + '2', + () => baseSession('1', true, '{'), + setSilent + ) + + expect(synced).toBe(true) + expect(JSON.parse(setSilent.mock.calls[0][0].channel)).toMatchObject({ + salesChannel: '2', + hasOnlyDefaultSalesChannel: false, + }) + }) + + it('ignores object-valued salesChannel when comparing', () => { + const setSilent = vi.fn() + const synced = syncSalesChannelFromOrderForm( + '2', + () => + baseSession( + '1', + true, + JSON.stringify({ salesChannel: { nested: true } }) + ), + setSilent + ) + + expect(synced).toBe(true) + expect(JSON.parse(setSilent.mock.calls[0][0].channel).salesChannel).toBe( + '2' + ) + }) }) From 5726ef58ce6471bc31379b4f1693041a238e76d9 Mon Sep 17 00:00:00 2001 From: eduardoformiga Date: Tue, 11 Aug 2026 23:40:35 -0300 Subject: [PATCH 10/10] test(api): cover validateSession helpers for Sonar new-code gate Extract session helpers into a dedicated util and add unit tests so the validateSession refactor no longer tanks Coverage on New Code. --- .../vtex/resolvers/validateSession.ts | 207 +--------- .../vtex/utils/validateSessionHelpers.ts | 202 ++++++++++ .../vtex/resolvers/validateSession.test.ts | 222 +++++++++++ .../vtex/utils/validateSessionHelpers.test.ts | 359 ++++++++++++++++++ 4 files changed, 792 insertions(+), 198 deletions(-) create mode 100644 packages/api/src/platforms/vtex/utils/validateSessionHelpers.ts create mode 100644 packages/api/test/unit/platforms/vtex/resolvers/validateSession.test.ts create mode 100644 packages/api/test/unit/platforms/vtex/utils/validateSessionHelpers.test.ts diff --git a/packages/api/src/platforms/vtex/resolvers/validateSession.ts b/packages/api/src/platforms/vtex/resolvers/validateSession.ts index f8ac9ed99b..150a7c5ad6 100644 --- a/packages/api/src/platforms/vtex/resolvers/validateSession.ts +++ b/packages/api/src/platforms/vtex/resolvers/validateSession.ts @@ -3,14 +3,19 @@ import deepEquals from 'fast-deep-equal' import type { GraphqlContext } from '..' import type { MutationValidateSessionArgs, - StoreMarketingData, StoreSession, } from '../../../__generated__/schema' -import type { Channel } from '../utils/channel' import ChannelMarshal from '../utils/channel' -import { resolveActiveContractDisplayName } from '../utils/contract' -import { getAuthCookie, parseJwt } from '../utils/cookies' import { channelAfterSessionManager } from '../utils/sessionChannel' +import { + buildB2bSession, + buildMarketingData, + buildPersonFromProfile, + buildSessionSearchParams, + getPreciseLocationData, + resolveJwtClaims, + resolveSellerInRegion, +} from '../utils/validateSessionHelpers' type SessionStoreNamespace = { channel?: { value?: string | null } | null @@ -23,200 +28,6 @@ type SessionCheckoutNamespace = { regionId?: { value?: string | null } | null } -async function getPreciseLocationData( - clients: GraphqlContext['clients'], - country: string, - postalCode: string -) { - try { - const address = await clients.commerce.checkout.address({ - postalCode, - country, - }) - - const geoCoordinates = address.geoCoordinates - ? { - latitude: address.geoCoordinates[1], - longitude: address.geoCoordinates[0], - } - : null - - return { city: address.city, geoCoordinates } - } catch (err) { - console.error( - `Error while getting geo coordinates for the current postal code (${postalCode}) and country (${country}).\n` - ) - - throw err - } -} - -function buildSessionSearchParams( - search: string, - channel: Required, - postalCode: string, - country: string, - geoCoordinates: StoreSession['geoCoordinates'], - locale: string -) { - const params = new URLSearchParams(search) - - // Remove facets so they do not interfere with session data / vtex_segment - if (params.has('facets')) { - params.delete('facets') - } - - params.set('sc', params.get('sc') ?? channel.salesChannel) - - if (postalCode) { - params.set('postalCode', postalCode) - } - - if (country) { - params.set('country', country) - } - - if (geoCoordinates) { - params.set( - 'geoCoordinates', - `${geoCoordinates.longitude},${geoCoordinates.latitude}` // long,lat is the format expected - ) - } - - // Sending the locale to the session, the store-session app will update cultureInfo - params.set('locale', locale) - - return params -} - -function buildMarketingData( - params: URLSearchParams, - oldMarketingData: StoreSession['marketingData'] -): StoreMarketingData { - return { - utmCampaign: - params.get('utm_campaign') ?? oldMarketingData?.utmCampaign ?? '', - utmMedium: params.get('utm_medium') ?? oldMarketingData?.utmMedium ?? '', - utmSource: params.get('utm_source') ?? oldMarketingData?.utmSource ?? '', - utmiCampaign: params.get('utmi_cp') ?? oldMarketingData?.utmiCampaign ?? '', - utmiPage: params.get('utmi_p') ?? oldMarketingData?.utmiPage ?? '', - utmiPart: params.get('utmi_pc') ?? oldMarketingData?.utmiPart ?? '', - } -} - -async function resolveJwtClaims( - clients: GraphqlContext['clients'], - cookie: string | undefined, - account: string -) { - const jwt = parseJwt(getAuthCookie(cookie ?? '', account)) - let isValidJwt = false - - if (jwt) { - try { - const vtexIdResponse = await clients.commerce.vtexid.validate() - isValidJwt = vtexIdResponse?.authStatus?.toLowerCase() === 'success' - } catch (error) { - console.warn('JWT validation failed:', error) - isValidJwt = false - } - } - - return { - isRepresentative: isValidJwt ? Boolean(jwt?.isRepresentative) : false, - customerId: isValidJwt ? jwt?.customerId : undefined, - unitId: isValidJwt ? jwt?.unitId : undefined, - } -} - -async function resolveSellerInRegion( - clients: GraphqlContext['clients'], - channel: Required, - postalCode: string, - geoCoordinates: StoreSession['geoCoordinates'], - country: string, - salesChannel: string -) { - if (!channel.seller || !(postalCode || geoCoordinates)) { - return undefined - } - - const regionData = await clients.commerce.checkout.region({ - postalCode, - geoCoordinates, - country, - salesChannel, - }) - const region = regionData?.[0] - - return region?.sellers.find((seller) => channel.seller === seller.id)?.id -} - -function shopperString(value: { value?: unknown } | null | undefined): string { - return typeof value?.value === 'string' ? value.value : '' -} - -function buildB2bSession(args: { - isRepresentative: boolean - authentication: { - customerId?: { value?: string | null } | null - unitName?: { value?: string | null } | null - unitId?: { value?: string | null } | null - storeUserEmail?: { value?: string | null } | null - } | null - shopper: { - firstName?: { value?: unknown } | null - lastName?: { value?: unknown } | null - organizationManager?: { value?: boolean | null } | null - } | null - publicData: { postalCode?: { value?: string | null } | null } | null - profile: Parameters[1] - contract: Parameters[0] - customerId?: string - unitId?: string -}) { - if (!args.isRepresentative) { - return null - } - - const firstName = shopperString(args.shopper?.firstName) - const lastName = shopperString(args.shopper?.lastName) - - return { - isRepresentative: true, - customerId: args.authentication?.customerId?.value ?? args.customerId ?? '', - unitName: args.authentication?.unitName?.value ?? '', - unitId: args.authentication?.unitId?.value ?? args.unitId ?? '', - firstName, - lastName, - userName: `${firstName} ${lastName}`.trim(), - userEmail: args.authentication?.storeUserEmail?.value ?? '', - savedPostalCode: args.publicData?.postalCode?.value ?? '', - contractName: resolveActiveContractDisplayName(args.contract, args.profile), - organizationManager: args.shopper?.organizationManager?.value ?? false, - } -} - -function buildPersonFromProfile( - profile: { - id?: { value?: string | null } | null - email?: { value?: string | null } | null - firstName?: { value?: string | null } | null - lastName?: { value?: string | null } | null - } | null -) { - if (!profile?.id) { - return null - } - - return { - id: profile.id?.value ?? '', - email: profile.email?.value ?? '', - givenName: profile.firstName?.value ?? '', - familyName: profile.lastName?.value ?? '', - } -} - export const validateSession = async ( _: any, { session: oldSession, search }: MutationValidateSessionArgs, diff --git a/packages/api/src/platforms/vtex/utils/validateSessionHelpers.ts b/packages/api/src/platforms/vtex/utils/validateSessionHelpers.ts new file mode 100644 index 0000000000..eaa9995da8 --- /dev/null +++ b/packages/api/src/platforms/vtex/utils/validateSessionHelpers.ts @@ -0,0 +1,202 @@ +import type { GraphqlContext } from '..' +import type { + StoreMarketingData, + StoreSession, +} from '../../../__generated__/schema' +import type { Channel } from './channel' +import { resolveActiveContractDisplayName } from './contract' +import { getAuthCookie, parseJwt } from './cookies' + +export async function getPreciseLocationData( + clients: GraphqlContext['clients'], + country: string, + postalCode: string +) { + try { + const address = await clients.commerce.checkout.address({ + postalCode, + country, + }) + + const geoCoordinates = address.geoCoordinates + ? { + latitude: address.geoCoordinates[1], + longitude: address.geoCoordinates[0], + } + : null + + return { city: address.city, geoCoordinates } + } catch (err) { + console.error( + `Error while getting geo coordinates for the current postal code (${postalCode}) and country (${country}).\n` + ) + + throw err + } +} + +export function buildSessionSearchParams( + search: string, + channel: Required, + postalCode: string, + country: string, + geoCoordinates: StoreSession['geoCoordinates'], + locale: string +) { + const params = new URLSearchParams(search) + + // Remove facets so they do not interfere with session data / vtex_segment + if (params.has('facets')) { + params.delete('facets') + } + + params.set('sc', params.get('sc') ?? channel.salesChannel) + + if (postalCode) { + params.set('postalCode', postalCode) + } + + if (country) { + params.set('country', country) + } + + if (geoCoordinates) { + params.set( + 'geoCoordinates', + `${geoCoordinates.longitude},${geoCoordinates.latitude}` // long,lat is the format expected + ) + } + + // Sending the locale to the session, the store-session app will update cultureInfo + params.set('locale', locale) + + return params +} + +export function buildMarketingData( + params: URLSearchParams, + oldMarketingData: StoreSession['marketingData'] +): StoreMarketingData { + return { + utmCampaign: + params.get('utm_campaign') ?? oldMarketingData?.utmCampaign ?? '', + utmMedium: params.get('utm_medium') ?? oldMarketingData?.utmMedium ?? '', + utmSource: params.get('utm_source') ?? oldMarketingData?.utmSource ?? '', + utmiCampaign: params.get('utmi_cp') ?? oldMarketingData?.utmiCampaign ?? '', + utmiPage: params.get('utmi_p') ?? oldMarketingData?.utmiPage ?? '', + utmiPart: params.get('utmi_pc') ?? oldMarketingData?.utmiPart ?? '', + } +} + +export async function resolveJwtClaims( + clients: GraphqlContext['clients'], + cookie: string | undefined, + account: string +) { + const jwt = parseJwt(getAuthCookie(cookie ?? '', account)) + let isValidJwt = false + + if (jwt) { + try { + const vtexIdResponse = await clients.commerce.vtexid.validate() + isValidJwt = vtexIdResponse?.authStatus?.toLowerCase() === 'success' + } catch (error) { + console.warn('JWT validation failed:', error) + isValidJwt = false + } + } + + return { + isRepresentative: isValidJwt ? Boolean(jwt?.isRepresentative) : false, + customerId: isValidJwt ? jwt?.customerId : undefined, + unitId: isValidJwt ? jwt?.unitId : undefined, + } +} + +export async function resolveSellerInRegion( + clients: GraphqlContext['clients'], + channel: Required, + postalCode: string, + geoCoordinates: StoreSession['geoCoordinates'], + country: string, + salesChannel: string +) { + if (!channel.seller || !(postalCode || geoCoordinates)) { + return undefined + } + + const regionData = await clients.commerce.checkout.region({ + postalCode, + geoCoordinates, + country, + salesChannel, + }) + const region = regionData?.[0] + + return region?.sellers.find((seller) => channel.seller === seller.id)?.id +} + +function shopperString(value: { value?: unknown } | null | undefined): string { + return typeof value?.value === 'string' ? value.value : '' +} + +export function buildB2bSession(args: { + isRepresentative: boolean + authentication: { + customerId?: { value?: string | null } | null + unitName?: { value?: string | null } | null + unitId?: { value?: string | null } | null + storeUserEmail?: { value?: string | null } | null + } | null + shopper: { + firstName?: { value?: unknown } | null + lastName?: { value?: unknown } | null + organizationManager?: { value?: boolean | null } | null + } | null + publicData: { postalCode?: { value?: string | null } | null } | null + profile: Parameters[1] + contract: Parameters[0] + customerId?: string + unitId?: string +}) { + if (!args.isRepresentative) { + return null + } + + const firstName = shopperString(args.shopper?.firstName) + const lastName = shopperString(args.shopper?.lastName) + + return { + isRepresentative: true, + customerId: args.authentication?.customerId?.value ?? args.customerId ?? '', + unitName: args.authentication?.unitName?.value ?? '', + unitId: args.authentication?.unitId?.value ?? args.unitId ?? '', + firstName, + lastName, + userName: `${firstName} ${lastName}`.trim(), + userEmail: args.authentication?.storeUserEmail?.value ?? '', + savedPostalCode: args.publicData?.postalCode?.value ?? '', + contractName: resolveActiveContractDisplayName(args.contract, args.profile), + organizationManager: args.shopper?.organizationManager?.value ?? false, + } +} + +export function buildPersonFromProfile( + profile: { + id?: { value?: string | null } | null + email?: { value?: string | null } | null + firstName?: { value?: string | null } | null + lastName?: { value?: string | null } | null + } | null +) { + if (!profile?.id) { + return null + } + + return { + id: profile.id?.value ?? '', + email: profile.email?.value ?? '', + givenName: profile.firstName?.value ?? '', + familyName: profile.lastName?.value ?? '', + } +} diff --git a/packages/api/test/unit/platforms/vtex/resolvers/validateSession.test.ts b/packages/api/test/unit/platforms/vtex/resolvers/validateSession.test.ts new file mode 100644 index 0000000000..a13276e57a --- /dev/null +++ b/packages/api/test/unit/platforms/vtex/resolvers/validateSession.test.ts @@ -0,0 +1,222 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +import { validateSession } from '../../../../../src/platforms/vtex/resolvers/validateSession' +import ChannelMarshal from '../../../../../src/platforms/vtex/utils/channel' + +const baseSession = { + locale: 'pt-BR', + currency: { code: 'BRL', symbol: 'R$' }, + country: 'BRA', + channel: ChannelMarshal.stringify({ + salesChannel: '1', + regionId: '', + seller: '', + hasOnlyDefaultSalesChannel: true, + }), + deliveryMode: null, + addressType: null, + city: 'São Paulo', + postalCode: null, + geoCoordinates: { latitude: -23.5, longitude: -46.6 }, + person: null, + b2b: null, + marketingData: { + utmCampaign: '', + utmMedium: '', + utmSource: '', + utmiCampaign: '', + utmiPage: '', + utmiPart: '', + }, + refreshAfter: null, +} + +const makeContext = (sessionNamespaces: Record = {}) => { + const session = vi.fn().mockResolvedValue({ + namespaces: { + store: { + channel: { value: '1' }, + currencyCode: { value: 'BRL' }, + currencySymbol: { value: 'R$' }, + countryCode: { value: 'BRA' }, + }, + checkout: { regionId: { value: '' } }, + profile: null, + shopper: null, + authentication: null, + public: null, + ...sessionNamespaces, + }, + }) + + return { + clients: { + commerce: { + session, + checkout: { + address: vi.fn(), + region: vi.fn(), + }, + vtexid: { validate: vi.fn() }, + masterData: { getContractById: vi.fn() }, + }, + }, + headers: { cookie: '' }, + account: 'sabrinastore', + } as any +} + +describe('validateSession', () => { + beforeEach(() => { + vi.restoreAllMocks() + }) + + it('keeps an explicit client sales channel when Session Manager diverges', async () => { + const ctx = makeContext({ + store: { + channel: { value: '1' }, + currencyCode: { value: 'BRL' }, + currencySymbol: { value: 'R$' }, + countryCode: { value: 'BRA' }, + }, + }) + const oldSession = { + ...baseSession, + channel: ChannelMarshal.stringify({ + salesChannel: '2', + regionId: '', + seller: '', + hasOnlyDefaultSalesChannel: false, + }), + } + + const result = await validateSession( + null, + { session: oldSession, search: '' }, + ctx + ) + + expect(result).not.toBeNull() + expect(JSON.parse(result!.channel!)).toMatchObject({ + salesChannel: '2', + hasOnlyDefaultSalesChannel: false, + }) + }) + + it('adopts Session Manager sales channel for the default client channel', async () => { + const ctx = makeContext({ + store: { + channel: { value: '4' }, + currencyCode: { value: 'BRL' }, + currencySymbol: { value: 'R$' }, + countryCode: { value: 'BRA' }, + }, + }) + + const result = await validateSession( + null, + { session: baseSession, search: '' }, + ctx + ) + + expect(JSON.parse(result!.channel!)).toMatchObject({ + salesChannel: '4', + hasOnlyDefaultSalesChannel: false, + }) + }) + + it('survives Session Manager failures', async () => { + const ctx = makeContext() + ctx.clients.commerce.session.mockRejectedValue(new Error('session down')) + + const result = await validateSession( + null, + { session: baseSession, search: '' }, + ctx + ) + + expect(result).not.toBeNull() + expect(JSON.parse(result!.channel!).salesChannel).toBe('1') + }) + + it('loads precise location when city/geo are missing', async () => { + const ctx = makeContext() + ctx.clients.commerce.checkout.address.mockResolvedValue({ + city: 'Curitiba', + geoCoordinates: [-49.2, -25.4], + }) + + const result = await validateSession( + null, + { + session: { + ...baseSession, + city: null, + geoCoordinates: null, + postalCode: '80010-000', + }, + search: '', + }, + ctx + ) + + expect(ctx.clients.commerce.checkout.address).toHaveBeenCalled() + expect(result?.city).toBe('Curitiba') + expect(result?.geoCoordinates).toEqual({ + latitude: -25.4, + longitude: -49.2, + }) + }) + + it('maps profile into person when Session Manager returns one', async () => { + const ctx = makeContext({ + profile: { + id: { value: 'p1' }, + email: { value: 'a@b.com' }, + firstName: { value: 'Ada' }, + lastName: { value: 'Lovelace' }, + }, + }) + + const result = await validateSession( + null, + { session: baseSession, search: '' }, + ctx + ) + + expect(result?.person).toEqual({ + id: 'p1', + email: 'a@b.com', + givenName: 'Ada', + familyName: 'Lovelace', + }) + }) + + it('resolves a seller when channel has one and postal code is set', async () => { + const ctx = makeContext() + ctx.clients.commerce.checkout.region.mockResolvedValue([ + { sellers: [{ id: 'seller-a' }] }, + ]) + + const result = await validateSession( + null, + { + session: { + ...baseSession, + postalCode: '01310-100', + channel: ChannelMarshal.stringify({ + salesChannel: '1', + regionId: '', + seller: 'seller-a', + hasOnlyDefaultSalesChannel: true, + }), + }, + search: '', + }, + ctx + ) + + expect(ctx.clients.commerce.checkout.region).toHaveBeenCalled() + expect(JSON.parse(result!.channel!).seller).toBe('seller-a') + }) +}) diff --git a/packages/api/test/unit/platforms/vtex/utils/validateSessionHelpers.test.ts b/packages/api/test/unit/platforms/vtex/utils/validateSessionHelpers.test.ts new file mode 100644 index 0000000000..ab24a41978 --- /dev/null +++ b/packages/api/test/unit/platforms/vtex/utils/validateSessionHelpers.test.ts @@ -0,0 +1,359 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import type { Channel } from '../../../../../src/platforms/vtex/utils/channel' + +const getAuthCookie = vi.fn(() => '') +const parseJwt = vi.fn(() => null as any) + +vi.mock('../../../../../src/platforms/vtex/utils/cookies', async () => { + const actual = await vi.importActual< + typeof import('../../../../../src/platforms/vtex/utils/cookies') + >('../../../../../src/platforms/vtex/utils/cookies') + + return { + ...actual, + getAuthCookie: (...args: unknown[]) => getAuthCookie(...args), + parseJwt: (...args: unknown[]) => parseJwt(...args), + } +}) + +const { + buildB2bSession, + buildMarketingData, + buildPersonFromProfile, + buildSessionSearchParams, + getPreciseLocationData, + resolveJwtClaims, + resolveSellerInRegion, +} = await import( + '../../../../../src/platforms/vtex/utils/validateSessionHelpers' +) + +const baseChannel = (salesChannel = '1', seller = ''): Required => ({ + salesChannel, + regionId: '', + seller, + hasOnlyDefaultSalesChannel: true, +}) + +describe('buildSessionSearchParams', () => { + it('sets sc from search or falls back to channel', () => { + const fromSearch = buildSessionSearchParams( + '?sc=4', + baseChannel('1'), + '', + '', + null, + 'pt-BR' + ) + expect(fromSearch.get('sc')).toBe('4') + expect(fromSearch.get('locale')).toBe('pt-BR') + + const fromChannel = buildSessionSearchParams( + '', + baseChannel('2'), + '', + '', + null, + 'en-US' + ) + expect(fromChannel.get('sc')).toBe('2') + }) + + it('drops facets and sets location params', () => { + const params = buildSessionSearchParams( + '?facets=category-1&utm_source=ads', + baseChannel(), + '01310-100', + 'BRA', + { latitude: -23.5, longitude: -46.6 }, + 'pt-BR' + ) + + expect(params.has('facets')).toBe(false) + expect(params.get('postalCode')).toBe('01310-100') + expect(params.get('country')).toBe('BRA') + expect(params.get('geoCoordinates')).toBe('-46.6,-23.5') + expect(params.get('utm_source')).toBe('ads') + }) +}) + +describe('buildMarketingData', () => { + it('prefers query params over the previous session values', () => { + const params = new URLSearchParams( + 'utm_campaign=c&utm_medium=m&utm_source=s&utmi_cp=cp&utmi_p=p&utmi_pc=pc' + ) + + expect( + buildMarketingData(params, { + utmCampaign: 'old', + utmMedium: 'old', + utmSource: 'old', + utmiCampaign: 'old', + utmiPage: 'old', + utmiPart: 'old', + }) + ).toEqual({ + utmCampaign: 'c', + utmMedium: 'm', + utmSource: 's', + utmiCampaign: 'cp', + utmiPage: 'p', + utmiPart: 'pc', + }) + }) + + it('falls back to empty strings when nothing is set', () => { + expect(buildMarketingData(new URLSearchParams(), null)).toEqual({ + utmCampaign: '', + utmMedium: '', + utmSource: '', + utmiCampaign: '', + utmiPage: '', + utmiPart: '', + }) + }) +}) + +describe('buildPersonFromProfile', () => { + it('returns null without a profile id', () => { + expect(buildPersonFromProfile(null)).toBeNull() + expect(buildPersonFromProfile({})).toBeNull() + }) + + it('maps profile fields into a Store person', () => { + expect( + buildPersonFromProfile({ + id: { value: 'p1' }, + email: { value: 'a@b.com' }, + firstName: { value: 'Ada' }, + lastName: { value: 'Lovelace' }, + }) + ).toEqual({ + id: 'p1', + email: 'a@b.com', + givenName: 'Ada', + familyName: 'Lovelace', + }) + }) +}) + +describe('buildB2bSession', () => { + it('returns null when the shopper is not a representative', () => { + expect( + buildB2bSession({ + isRepresentative: false, + authentication: null, + shopper: null, + publicData: null, + profile: null, + contract: null, + }) + ).toBeNull() + }) + + it('builds B2B fields from authentication and shopper namespaces', () => { + expect( + buildB2bSession({ + isRepresentative: true, + authentication: { + customerId: { value: 'cust' }, + unitName: { value: 'Unit' }, + unitId: { value: 'u1' }, + storeUserEmail: { value: 'rep@vtex.com' }, + }, + shopper: { + firstName: { value: 'Jane' }, + lastName: { value: 'Doe' }, + organizationManager: { value: true }, + }, + publicData: { postalCode: { value: '12345' } }, + profile: { id: { value: 'p1' } }, + contract: { corporateName: 'Acme' }, + customerId: 'fallback-cust', + unitId: 'fallback-unit', + }) + ).toMatchObject({ + isRepresentative: true, + customerId: 'cust', + unitName: 'Unit', + unitId: 'u1', + firstName: 'Jane', + lastName: 'Doe', + userName: 'Jane Doe', + userEmail: 'rep@vtex.com', + savedPostalCode: '12345', + contractName: 'Acme', + organizationManager: true, + }) + }) + + it('ignores non-string shopper name values', () => { + const result = buildB2bSession({ + isRepresentative: true, + authentication: null, + shopper: { + firstName: { value: 123 }, + lastName: { value: null }, + }, + publicData: null, + profile: null, + contract: null, + customerId: 'c', + unitId: 'u', + }) + + expect(result).toMatchObject({ + firstName: '', + lastName: '', + userName: '', + customerId: 'c', + unitId: 'u', + }) + }) +}) + +describe('getPreciseLocationData', () => { + it('maps checkout address geoCoordinates', async () => { + const address = vi.fn().mockResolvedValue({ + city: 'São Paulo', + geoCoordinates: [-46.6, -23.5], + }) + const clients = { commerce: { checkout: { address } } } as any + + await expect( + getPreciseLocationData(clients, 'BRA', '01310-100') + ).resolves.toEqual({ + city: 'São Paulo', + geoCoordinates: { latitude: -23.5, longitude: -46.6 }, + }) + }) + + it('returns null geoCoordinates when the address has none', async () => { + const clients = { + commerce: { + checkout: { + address: vi + .fn() + .mockResolvedValue({ city: 'X', geoCoordinates: null }), + }, + }, + } as any + + await expect(getPreciseLocationData(clients, 'BRA', '1')).resolves.toEqual({ + city: 'X', + geoCoordinates: null, + }) + }) + + it('rethrows after logging when address lookup fails', async () => { + const error = new Error('boom') + const clients = { + commerce: { + checkout: { address: vi.fn().mockRejectedValue(error) }, + }, + } as any + const spy = vi.spyOn(console, 'error').mockImplementation(() => {}) + + await expect(getPreciseLocationData(clients, 'BRA', '1')).rejects.toThrow( + 'boom' + ) + expect(spy).toHaveBeenCalled() + spy.mockRestore() + }) +}) + +describe('resolveSellerInRegion', () => { + it('skips the region lookup without a seller or location', async () => { + const region = vi.fn() + const clients = { commerce: { checkout: { region } } } as any + + await expect( + resolveSellerInRegion(clients, baseChannel(), '', null, 'BRA', '1') + ).resolves.toBeUndefined() + expect(region).not.toHaveBeenCalled() + }) + + it('returns the matching seller id from region data', async () => { + const region = vi.fn().mockResolvedValue([ + { + sellers: [{ id: '1' }, { id: 'seller-a' }], + }, + ]) + const clients = { commerce: { checkout: { region } } } as any + + await expect( + resolveSellerInRegion( + clients, + baseChannel('1', 'seller-a'), + '01310-100', + null, + 'BRA', + '1' + ) + ).resolves.toBe('seller-a') + }) +}) + +describe('resolveJwtClaims', () => { + beforeEach(() => { + getAuthCookie.mockReset() + parseJwt.mockReset() + getAuthCookie.mockReturnValue('') + parseJwt.mockReturnValue(null) + }) + + it('returns empty claims when there is no auth cookie', async () => { + const validate = vi.fn() + const clients = { commerce: { vtexid: { validate } } } as any + + await expect( + resolveJwtClaims(clients, undefined, 'storeframework') + ).resolves.toEqual({ + isRepresentative: false, + customerId: undefined, + unitId: undefined, + }) + expect(validate).not.toHaveBeenCalled() + }) + + it('reads claims when VTEX ID validates the JWT', async () => { + getAuthCookie.mockReturnValue('jwt-token') + parseJwt.mockReturnValue({ + isRepresentative: true, + customerId: 'cust-1', + unitId: 'unit-1', + }) + const validate = vi.fn().mockResolvedValue({ authStatus: 'Success' }) + const clients = { commerce: { vtexid: { validate } } } as any + + await expect( + resolveJwtClaims(clients, 'cookie', 'storeframework') + ).resolves.toEqual({ + isRepresentative: true, + customerId: 'cust-1', + unitId: 'unit-1', + }) + }) + + it('clears claims when VTEX ID validation throws', async () => { + getAuthCookie.mockReturnValue('jwt-token') + parseJwt.mockReturnValue({ + isRepresentative: true, + customerId: 'cust-1', + unitId: 'unit-1', + }) + const validate = vi.fn().mockRejectedValue(new Error('invalid')) + const clients = { commerce: { vtexid: { validate } } } as any + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + + await expect( + resolveJwtClaims(clients, 'cookie', 'storeframework') + ).resolves.toEqual({ + isRepresentative: false, + customerId: undefined, + unitId: undefined, + }) + expect(warn).toHaveBeenCalled() + warn.mockRestore() + }) +})