From d1385bdd64dd23b162a3c77e6b2013fb12c3284c Mon Sep 17 00:00:00 2001 From: sourabhsaini11 Date: Wed, 25 Feb 2026 13:48:31 +0530 Subject: [PATCH 1/2] fix:add validation for payload --- .../TRV14/2.0.0/on_select/class.ts | 62 ++++++++++++++++--- .../TRV14/2.0.0/on_select_cultural/class.ts | 37 ++++++++++- .../2.0.0/on_select_form_submission/class.ts | 44 ++++++++++++- .../class.ts | 37 ++++++++++- .../2.0.0/on_select_without_form/class.ts | 62 ++++++++++++++++--- .../mock-config/TRV14/2.0.0/select/class.ts | 55 ++++++++++++---- .../select_for_partial_cancellation/class.ts | 61 +++++++++++++----- .../2.0.0/select_form_submission/class.ts | 39 +++++++++++- .../select_form_submission_cultural/class.ts | 38 +++++++++++- 9 files changed, 382 insertions(+), 53 deletions(-) diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select/class.ts index df6d7112..4e729ab1 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select/class.ts @@ -28,30 +28,72 @@ export class MockOnSelectClass extends MockAction { generator(existingPayload: any, sessionData: SessionData): Promise { return onSelectDefaultGenerator(existingPayload, sessionData); } - async validate(targetPayload: any): Promise { + async validate(targetPayload: any, sessionData: SessionData): Promise { + const order = targetPayload?.message?.order; + if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" }; + + const provider = order.provider; + if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" }; + + if (sessionData.selected_provider && provider.id !== sessionData.selected_provider.id) + return { valid: false, message: `Provider ID mismatch with selected provider: ${sessionData.selected_provider.id}`, code: "ID_MISMATCH" }; + + const fulfillments = order.fulfillments; + if (sessionData.selected_fulfillments && fulfillments) { + const validFulfillmentIds = new Set(sessionData.selected_fulfillments.map((f: any) => f.id)); + const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id); + if (invalidFulfillmentIds.length) { + return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in selected fulfillments`, code: "FULFILLMENT_ID_MISMATCH" }; + } + } + + const items = order.items; + if (items) { + const prevCats = sessionData.category_ids; + if (prevCats?.length) { + const currCats = new Set(items.flatMap((i: any) => i.category_ids || [])); + const missing = prevCats.filter(id => !currCats.has(id)); + if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" }; + } + + if (sessionData.selected_items) { + const selectedIds = sessionData.selected_items.map((i: any) => i.id); + const parentIds = (sessionData.items || []) + .filter((item: any) => selectedIds.includes(item.id) && item.parent_item_id) + .map((item: any) => item.parent_item_id); + + const validItemIds = new Set([...selectedIds, ...parentIds]); + const invalidItemIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id); + + if (invalidItemIds.length) { + return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in selected items or their parents`, code: "ITEM_ID_MISMATCH" }; + } + } + } + return { valid: true }; } async meetRequirements(sessionData: SessionData): Promise { // Validate required session data for on_select if (!sessionData.items || !Array.isArray(sessionData.items)) { - return { - valid: false, + return { + valid: false, message: "No items available in session data", code: "MISSING_ITEMS" }; } - + if (!sessionData.selected_items || !Array.isArray(sessionData.selected_items)) { - return { - valid: false, + return { + valid: false, message: "No selected_items available in session data", code: "MISSING_SELECTED_ITEMS" }; } - + if (sessionData.selected_items.length === 0) { - return { - valid: false, + return { + valid: false, message: "selected_items array is empty", code: "EMPTY_SELECTED_ITEMS" }; @@ -72,7 +114,7 @@ export class MockOnSelectClass extends MockAction { code: "MISSING_SELECTED_FULFILLMENTS" }; } - + return { valid: true }; } } \ No newline at end of file diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_cultural/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_cultural/class.ts index fd71b7ad..83837b8c 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_cultural/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_cultural/class.ts @@ -28,7 +28,42 @@ export class MockOnSelectPurchaseCultFormClass extends MockAction { generator(existingPayload: any, sessionData: SessionData): Promise { return onSelectDefaultGenerator(existingPayload, sessionData); } - async validate(targetPayload: any): Promise { + async validate(targetPayload: any, sessionData: SessionData): Promise { + const order = targetPayload?.message?.order; + if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" }; + + const provider = order.provider; + if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" }; + + if (sessionData.selected_provider && provider.id !== sessionData.selected_provider.id) + return { valid: false, message: `Provider ID mismatch with selected provider: ${sessionData.selected_provider.id}`, code: "ID_MISMATCH" }; + + const fulfillments = order.fulfillments; + if (sessionData.selected_fulfillments && fulfillments) { + const validFulfillmentIds = new Set(sessionData.selected_fulfillments.map((f: any) => f.id)); + const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id); + if (invalidFulfillmentIds.length) { + return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in selected fulfillments`, code: "FULFILLMENT_ID_MISMATCH" }; + } + } + + const items = order.items; + if (items) { + if (sessionData.selected_items) { + const selectedIds = sessionData.selected_items.map((i: any) => i.id); + const parentIds = (sessionData.items || []) + .filter((item: any) => selectedIds.includes(item.id) && item.parent_item_id) + .map((item: any) => item.parent_item_id); + + const validItemIds = new Set([...selectedIds, ...parentIds]); + const invalidItemIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id); + + if (invalidItemIds.length) { + return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in selected items or their parents`, code: "ITEM_ID_MISMATCH" }; + } + } + } + return { valid: true }; } async meetRequirements(sessionData: SessionData): Promise { diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission/class.ts index c37d942a..7acfbf7e 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission/class.ts @@ -28,7 +28,49 @@ export class MockOnSelect2Class extends MockAction { generator(existingPayload: any, sessionData: SessionData): Promise { return onSelect2Generator(existingPayload, sessionData); } - async validate(targetPayload: any): Promise { + async validate(targetPayload: any, sessionData: SessionData): Promise { + const order = targetPayload?.message?.order; + if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" }; + + const provider = order.provider; + if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" }; + + if (sessionData.selected_provider && provider.id !== sessionData.selected_provider.id) + return { valid: false, message: `Provider ID mismatch with selected provider: ${sessionData.selected_provider.id}`, code: "ID_MISMATCH" }; + + const fulfillments = order.fulfillments; + if (sessionData.selected_fulfillments && fulfillments) { + const validFulfillmentIds = new Set(sessionData.selected_fulfillments.map((f: any) => f.id)); + const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id); + if (invalidFulfillmentIds.length) { + return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in selected fulfillments`, code: "FULFILLMENT_ID_MISMATCH" }; + } + } + + const items = order.items; + if (items) { + const prevCats = sessionData.category_ids; + if (prevCats?.length) { + const currCats = new Set(items.flatMap((i: any) => i.category_ids || [])); + const missing = prevCats.filter(id => !currCats.has(id)); + if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" }; + } + + if (sessionData.selected_items) { + const selectedIds = sessionData.selected_items.map((i: any) => i.id); + const parentIds = (sessionData.items || []) + .filter((item: any) => selectedIds.includes(item.id) && item.parent_item_id) + .map((item: any) => item.parent_item_id); + + const validItemIds = new Set([...selectedIds, ...parentIds]); + const invalidItemIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id); + + if (invalidItemIds.length) { + return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in selected items or their parents`, code: "ITEM_ID_MISMATCH" }; + } + } + } + return { valid: true }; } async meetRequirements(sessionData: SessionData): Promise { diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission_culture/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission_culture/class.ts index ed916d0e..25f8dbb1 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission_culture/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission_culture/class.ts @@ -28,7 +28,42 @@ export class MockOnSelectPurchaseCultureClass extends MockAction { generator(existingPayload: any, sessionData: SessionData): Promise { return onSelect2Generator(existingPayload, sessionData); } - async validate(targetPayload: any): Promise { + async validate(targetPayload: any, sessionData: SessionData): Promise { + const order = targetPayload?.message?.order; + if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" }; + + const provider = order.provider; + if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" }; + + if (sessionData.selected_provider && provider.id !== sessionData.selected_provider.id) + return { valid: false, message: `Provider ID mismatch with selected provider: ${sessionData.selected_provider.id}`, code: "ID_MISMATCH" }; + + const fulfillments = order.fulfillments; + if (sessionData.selected_fulfillments && fulfillments) { + const validFulfillmentIds = new Set(sessionData.selected_fulfillments.map((f: any) => f.id)); + const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id); + if (invalidFulfillmentIds.length) { + return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in selected fulfillments`, code: "FULFILLMENT_ID_MISMATCH" }; + } + } + + const items = order.items; + if (items) { + if (sessionData.selected_items) { + const selectedIds = sessionData.selected_items.map((i: any) => i.id); + const parentIds = (sessionData.items || []) + .filter((item: any) => selectedIds.includes(item.id) && item.parent_item_id) + .map((item: any) => item.parent_item_id); + + const validItemIds = new Set([...selectedIds, ...parentIds]); + const invalidItemIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id); + + if (invalidItemIds.length) { + return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in selected items or their parents`, code: "ITEM_ID_MISMATCH" }; + } + } + } + return { valid: true }; } async meetRequirements(sessionData: SessionData): Promise { diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_without_form/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_without_form/class.ts index 3426e1d3..b52ec5f0 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_without_form/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_without_form/class.ts @@ -28,30 +28,72 @@ export class MockOnSelectWithoutFormClass extends MockAction { generator(existingPayload: any, sessionData: SessionData): Promise { return onSelectWithoutFormGenerator(existingPayload, sessionData); } - async validate(targetPayload: any): Promise { + async validate(targetPayload: any, sessionData: SessionData): Promise { + const order = targetPayload?.message?.order; + if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" }; + + const provider = order.provider; + if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" }; + + if (sessionData.selected_provider && provider.id !== sessionData.selected_provider.id) + return { valid: false, message: `Provider ID mismatch with selected provider: ${sessionData.selected_provider.id}`, code: "ID_MISMATCH" }; + + const fulfillments = order.fulfillments; + if (sessionData.selected_fulfillments && fulfillments) { + const validFulfillmentIds = new Set(sessionData.selected_fulfillments.map((f: any) => f.id)); + const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id); + if (invalidFulfillmentIds.length) { + return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in selected fulfillments`, code: "FULFILLMENT_ID_MISMATCH" }; + } + } + + const items = order.items; + if (items) { + const prevCats = sessionData.category_ids; + if (prevCats?.length) { + const currCats = new Set(items.flatMap((i: any) => i.category_ids || [])); + const missing = prevCats.filter(id => !currCats.has(id)); + if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" }; + } + + if (sessionData.selected_items) { + const selectedIds = sessionData.selected_items.map((i: any) => i.id); + const parentIds = (sessionData.items || []) + .filter((item: any) => selectedIds.includes(item.id) && item.parent_item_id) + .map((item: any) => item.parent_item_id); + + const validItemIds = new Set([...selectedIds, ...parentIds]); + const invalidItemIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id); + + if (invalidItemIds.length) { + return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in selected items or their parents`, code: "ITEM_ID_MISMATCH" }; + } + } + } + return { valid: true }; } async meetRequirements(sessionData: SessionData): Promise { // Validate required session data for on_select if (!sessionData.items || !Array.isArray(sessionData.items)) { - return { - valid: false, + return { + valid: false, message: "No items available in session data", code: "MISSING_ITEMS" }; } - + if (!sessionData.selected_items || !Array.isArray(sessionData.selected_items)) { - return { - valid: false, + return { + valid: false, message: "No selected_items available in session data", code: "MISSING_SELECTED_ITEMS" }; } - + if (sessionData.selected_items.length === 0) { - return { - valid: false, + return { + valid: false, message: "selected_items array is empty", code: "EMPTY_SELECTED_ITEMS" }; @@ -72,7 +114,7 @@ export class MockOnSelectWithoutFormClass extends MockAction { code: "MISSING_SELECTED_FULFILLMENTS" }; } - + return { valid: true }; } } \ No newline at end of file diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/select/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/select/class.ts index 51724622..e4fd685c 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/select/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/select/class.ts @@ -28,25 +28,54 @@ export class MockSelectClass extends MockAction { generator(existingPayload: any, sessionData: SessionData): Promise { return selectDefaultGenerator(existingPayload, sessionData); } - async validate(targetPayload: any): Promise { + async validate(targetPayload: any, sessionData: SessionData): Promise { + const order = targetPayload?.message?.order; + const provider = order?.provider; + if (!provider) return { valid: false, message: "Provider not found", code: "MISSING_PROVIDER" }; + + if (sessionData.provider_id && provider.id !== sessionData.provider_id) + return { valid: false, message: `Provider ID mismatch with session: ${sessionData.provider_id}`, code: "ID_MISMATCH" }; + + const fulfillments = order?.fulfillments; + if (sessionData.fulfillments && fulfillments) { + const validFulfillmentIds = new Set(sessionData.fulfillments.map((f: any) => f.id)); + const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id); + if (invalidFulfillmentIds.length) { + return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in previous search results`, code: "FULFILLMENT_ID_MISMATCH" }; + } + } + + if (order?.items) { + const selecteditems = order.items; + const itemsOnsearch = sessionData.items; + + if (itemsOnsearch) { + const validItemIds = new Set(itemsOnsearch.map((i: any) => i.id)); + const invalidItemIds = selecteditems.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id); + if (invalidItemIds.length) { + return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in previous search results`, code: "ITEM_ID_MISMATCH" }; + } + } + } + return { valid: true }; } async meetRequirements(sessionData: SessionData): Promise { // Validate user_inputs structure exists if (!sessionData.user_inputs) { - return { - valid: false, + return { + valid: false, message: "user_inputs not found in session data", code: "MISSING_USER_INPUTS" }; } - const userInputs : any = sessionData.user_inputs; + const userInputs: any = sessionData.user_inputs; // Validate provider if (!userInputs.provider) { - return { - valid: false, + return { + valid: false, message: "provider is required in user_inputs", code: "MISSING_PROVIDER" }; @@ -54,8 +83,8 @@ export class MockSelectClass extends MockAction { // Validate fulfillment if (!userInputs.fulfillment) { - return { - valid: false, + return { + valid: false, message: "fulfillment is required in user_inputs", code: "MISSING_FULFILLMENT" }; @@ -63,8 +92,8 @@ export class MockSelectClass extends MockAction { // Validate items array if (!userInputs.items || !Array.isArray(userInputs.items) || userInputs.items.length === 0) { - return { - valid: false, + return { + valid: false, message: "items array is required and must not be empty in user_inputs", code: "MISSING_OR_EMPTY_ITEMS" }; @@ -74,14 +103,14 @@ export class MockSelectClass extends MockAction { for (let i = 0; i < userInputs.items.length; i++) { const item = userInputs.items[i]; if (!item.itemId) { - return { - valid: false, + return { + valid: false, message: `itemId is required for item at index ${i}`, code: "MISSING_ITEM_ID" }; } } - + return { valid: true }; } } \ No newline at end of file diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/select_for_partial_cancellation/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/select_for_partial_cancellation/class.ts index 76040f0f..dacc3f45 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/select_for_partial_cancellation/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/select_for_partial_cancellation/class.ts @@ -28,25 +28,56 @@ export class MockSelectForPartialCancellationClass extends MockAction { generator(existingPayload: any, sessionData: SessionData): Promise { return selectForPartialCancellationGenerator(existingPayload, sessionData); } - async validate(targetPayload: any): Promise { + async validate(targetPayload: any, sessionData: SessionData): Promise { + const order = targetPayload?.message?.order; + if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" }; + + const provider = order.provider; + if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" }; + + if (sessionData.provider_id && provider.id !== sessionData.provider_id) + return { valid: false, message: `Provider ID mismatch with session: ${sessionData.provider_id}`, code: "ID_MISMATCH" }; + + const fulfillments = order.fulfillments; + if (sessionData.fulfillments && fulfillments) { + const validFulfillmentIds = new Set(sessionData.fulfillments.map((f: any) => f.id)); + const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id); + if (invalidFulfillmentIds.length) { + return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in previous search results`, code: "FULFILLMENT_ID_MISMATCH" }; + } + } + + if (order.items) { + const selectedItems = order.items; + const itemsOnsearch = sessionData.items; + + if (itemsOnsearch) { + const validItemIds = new Set(itemsOnsearch.map((i: any) => i.id)); + const invalidItemIds = selectedItems.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id); + if (invalidItemIds.length) { + return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in previous search results`, code: "ITEM_ID_MISMATCH" }; + } + } + } + return { valid: true }; } async meetRequirements(sessionData: SessionData): Promise { // Validate user_inputs structure exists if (!sessionData.user_inputs) { - return { - valid: false, + return { + valid: false, message: "user_inputs not found in session data", code: "MISSING_USER_INPUTS" }; } - const userInputs : any = sessionData.user_inputs; + const userInputs: any = sessionData.user_inputs; // Validate provider if (!userInputs.provider) { - return { - valid: false, + return { + valid: false, message: "provider is required in user_inputs", code: "MISSING_PROVIDER" }; @@ -54,8 +85,8 @@ export class MockSelectForPartialCancellationClass extends MockAction { // Validate fulfillment if (!userInputs.fulfillment) { - return { - valid: false, + return { + valid: false, message: "fulfillment is required in user_inputs", code: "MISSING_FULFILLMENT" }; @@ -63,8 +94,8 @@ export class MockSelectForPartialCancellationClass extends MockAction { // Validate items array if (!userInputs.items || !Array.isArray(userInputs.items) || userInputs.items.length === 0) { - return { - valid: false, + return { + valid: false, message: "items array is required and must not be empty in user_inputs", code: "MISSING_OR_EMPTY_ITEMS" }; @@ -74,8 +105,8 @@ export class MockSelectForPartialCancellationClass extends MockAction { for (let i = 0; i < userInputs.items.length; i++) { const item = userInputs.items[i]; if (!item.itemId) { - return { - valid: false, + return { + valid: false, message: `itemId is required for item at index ${i}`, code: "MISSING_ITEM_ID" }; @@ -85,13 +116,13 @@ export class MockSelectForPartialCancellationClass extends MockAction { // IMPORTANT: Validate first item has quantity > 1 for partial cancellation const firstItem = userInputs.items[0]; if (!firstItem.count || typeof firstItem.count !== 'number' || firstItem.count <= 1) { - return { - valid: false, + return { + valid: false, message: "First item must have quantity > 1 for partial cancellation flow (found: " + (firstItem.count || 0) + ")", code: "INSUFFICIENT_QUANTITY_FOR_PARTIAL_CANCELLATION" }; } - + return { valid: true }; } } \ No newline at end of file diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission/class.ts index 30c2f14a..0dceb5ac 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission/class.ts @@ -28,7 +28,44 @@ export class MockSelect2Class extends MockAction { generator(existingPayload: any, sessionData: SessionData): Promise { return select2Generator(existingPayload, sessionData); } - async validate(targetPayload: any): Promise { + async validate(targetPayload: any, sessionData: SessionData): Promise { + const order = targetPayload?.message?.order; + if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" }; + + const provider = order.provider; + if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" }; + + if (sessionData.provider_id && provider.id !== sessionData.provider_id) + return { valid: false, message: `Provider ID mismatch with session: ${sessionData.provider_id}`, code: "ID_MISMATCH" }; + + const fulfillments = order.fulfillments; + if (sessionData.fulfillments && fulfillments) { + const validFulfillmentIds = new Set(sessionData.fulfillments.map((f: any) => f.id)); + const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id); + if (invalidFulfillmentIds.length) { + return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in previous search results`, code: "FULFILLMENT_ID_MISMATCH" }; + } + } + + const items = order.items; + if (items) { + const prevCats = sessionData.category_ids; + if (prevCats?.length) { + const currCats = new Set(items.flatMap((i: any) => i.category_ids || [])); + const missing = prevCats.filter(id => !currCats.has(id)); + if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" }; + } + + // Check against session search results + if (sessionData.items) { + const validItemIds = new Set(sessionData.items.map((i: any) => i.id)); + const invalidIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id); + if (invalidIds.length) { + return { valid: false, message: `Item IDs [${invalidIds.join(", ")}] not found in previous search results`, code: "ITEM_ID_MISMATCH" }; + } + } + } + return { valid: true }; } async meetRequirements(sessionData: SessionData): Promise { diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission_cultural/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission_cultural/class.ts index 3aac3757..23ca6460 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission_cultural/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission_cultural/class.ts @@ -28,7 +28,43 @@ export class MockSelectPurchaseCultureClass extends MockAction { generator(existingPayload: any, sessionData: SessionData): Promise { return selectPurchaseCultureGenerator(existingPayload, sessionData); } - async validate(targetPayload: any): Promise { + async validate(targetPayload: any, sessionData: SessionData): Promise { + const order = targetPayload?.message?.order; + if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" }; + + const provider = order.provider; + if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" }; + + if (sessionData.provider_id && provider.id !== sessionData.provider_id) + return { valid: false, message: `Provider ID mismatch with session: ${sessionData.provider_id}`, code: "ID_MISMATCH" }; + + const fulfillments = order.fulfillments; + if (sessionData.fulfillments && fulfillments) { + const validFulfillmentIds = new Set(sessionData.fulfillments.map((f: any) => f.id)); + const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id); + if (invalidFulfillmentIds.length) { + return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in previous search results`, code: "FULFILLMENT_ID_MISMATCH" }; + } + } + + const items = order.items; + if (items) { + const prevCats = sessionData.category_ids; + if (prevCats?.length) { + const currCats = new Set(items.flatMap((i: any) => i.category_ids || [])); + const missing = prevCats.filter(id => !currCats.has(id)); + if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" }; + } + + if (sessionData.items) { + const validItemIds = new Set(sessionData.items.map((i: any) => i.id)); + const invalidIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id); + if (invalidIds.length) { + return { valid: false, message: `Item IDs [${invalidIds.join(", ")}] not found in previous search results`, code: "ITEM_ID_MISMATCH" }; + } + } + } + return { valid: true }; } async meetRequirements(sessionData: SessionData): Promise { From 06ae54244811667a8e77f97f4534cd9c73fcdc26 Mon Sep 17 00:00:00 2001 From: sourabhsaini11 Date: Wed, 25 Feb 2026 14:21:42 +0530 Subject: [PATCH 2/2] fix:fix category_id --- .../src/config/mock-config/TRV14/2.0.0/on_select/class.ts | 7 ------- .../TRV14/2.0.0/on_select_form_submission/class.ts | 7 ------- .../TRV14/2.0.0/on_select_without_form/class.ts | 7 +------ .../TRV14/2.0.0/select_form_submission/class.ts | 7 ------- .../TRV14/2.0.0/select_form_submission_cultural/class.ts | 7 ------- 5 files changed, 1 insertion(+), 34 deletions(-) diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select/class.ts index 4e729ab1..6225ac74 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select/class.ts @@ -49,13 +49,6 @@ export class MockOnSelectClass extends MockAction { const items = order.items; if (items) { - const prevCats = sessionData.category_ids; - if (prevCats?.length) { - const currCats = new Set(items.flatMap((i: any) => i.category_ids || [])); - const missing = prevCats.filter(id => !currCats.has(id)); - if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" }; - } - if (sessionData.selected_items) { const selectedIds = sessionData.selected_items.map((i: any) => i.id); const parentIds = (sessionData.items || []) diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission/class.ts index 7acfbf7e..358ff819 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission/class.ts @@ -49,13 +49,6 @@ export class MockOnSelect2Class extends MockAction { const items = order.items; if (items) { - const prevCats = sessionData.category_ids; - if (prevCats?.length) { - const currCats = new Set(items.flatMap((i: any) => i.category_ids || [])); - const missing = prevCats.filter(id => !currCats.has(id)); - if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" }; - } - if (sessionData.selected_items) { const selectedIds = sessionData.selected_items.map((i: any) => i.id); const parentIds = (sessionData.items || []) diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_without_form/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_without_form/class.ts index b52ec5f0..37fc09c2 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_without_form/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/on_select_without_form/class.ts @@ -49,12 +49,7 @@ export class MockOnSelectWithoutFormClass extends MockAction { const items = order.items; if (items) { - const prevCats = sessionData.category_ids; - if (prevCats?.length) { - const currCats = new Set(items.flatMap((i: any) => i.category_ids || [])); - const missing = prevCats.filter(id => !currCats.has(id)); - if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" }; - } + if (sessionData.selected_items) { const selectedIds = sessionData.selected_items.map((i: any) => i.id); diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission/class.ts index 0dceb5ac..afabc29c 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission/class.ts @@ -49,14 +49,7 @@ export class MockSelect2Class extends MockAction { const items = order.items; if (items) { - const prevCats = sessionData.category_ids; - if (prevCats?.length) { - const currCats = new Set(items.flatMap((i: any) => i.category_ids || [])); - const missing = prevCats.filter(id => !currCats.has(id)); - if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" }; - } - // Check against session search results if (sessionData.items) { const validItemIds = new Set(sessionData.items.map((i: any) => i.id)); const invalidIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id); diff --git a/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission_cultural/class.ts b/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission_cultural/class.ts index 23ca6460..7a52b417 100644 --- a/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission_cultural/class.ts +++ b/mock-service/src/config/mock-config/TRV14/2.0.0/select_form_submission_cultural/class.ts @@ -49,13 +49,6 @@ export class MockSelectPurchaseCultureClass extends MockAction { const items = order.items; if (items) { - const prevCats = sessionData.category_ids; - if (prevCats?.length) { - const currCats = new Set(items.flatMap((i: any) => i.category_ids || [])); - const missing = prevCats.filter(id => !currCats.has(id)); - if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" }; - } - if (sessionData.items) { const validItemIds = new Set(sessionData.items.map((i: any) => i.id)); const invalidIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id);