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..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 @@ -28,30 +28,65 @@ 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) { + 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 +107,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..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 @@ -28,7 +28,42 @@ 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) { + 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..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 @@ -28,30 +28,67 @@ 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) { + + + 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 +109,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..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 @@ -28,7 +28,37 @@ 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) { + + 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..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 @@ -28,7 +28,36 @@ 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) { + 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 {