Skip to content

Commit c007109

Browse files
Merge pull request #938 from sourabhsaini11/draft-TRV14-2.0.0
fix:add validation for payload
2 parents 60d6d11 + d1385bd commit c007109

File tree

9 files changed

+382
-53
lines changed

9 files changed

+382
-53
lines changed

mock-service/src/config/mock-config/TRV14/2.0.0/on_select/class.ts

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,30 +28,72 @@ export class MockOnSelectClass extends MockAction {
2828
generator(existingPayload: any, sessionData: SessionData): Promise<any> {
2929
return onSelectDefaultGenerator(existingPayload, sessionData);
3030
}
31-
async validate(targetPayload: any): Promise<MockOutput> {
31+
async validate(targetPayload: any, sessionData: SessionData): Promise<MockOutput> {
32+
const order = targetPayload?.message?.order;
33+
if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" };
34+
35+
const provider = order.provider;
36+
if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" };
37+
38+
if (sessionData.selected_provider && provider.id !== sessionData.selected_provider.id)
39+
return { valid: false, message: `Provider ID mismatch with selected provider: ${sessionData.selected_provider.id}`, code: "ID_MISMATCH" };
40+
41+
const fulfillments = order.fulfillments;
42+
if (sessionData.selected_fulfillments && fulfillments) {
43+
const validFulfillmentIds = new Set(sessionData.selected_fulfillments.map((f: any) => f.id));
44+
const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id);
45+
if (invalidFulfillmentIds.length) {
46+
return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in selected fulfillments`, code: "FULFILLMENT_ID_MISMATCH" };
47+
}
48+
}
49+
50+
const items = order.items;
51+
if (items) {
52+
const prevCats = sessionData.category_ids;
53+
if (prevCats?.length) {
54+
const currCats = new Set(items.flatMap((i: any) => i.category_ids || []));
55+
const missing = prevCats.filter(id => !currCats.has(id));
56+
if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" };
57+
}
58+
59+
if (sessionData.selected_items) {
60+
const selectedIds = sessionData.selected_items.map((i: any) => i.id);
61+
const parentIds = (sessionData.items || [])
62+
.filter((item: any) => selectedIds.includes(item.id) && item.parent_item_id)
63+
.map((item: any) => item.parent_item_id);
64+
65+
const validItemIds = new Set([...selectedIds, ...parentIds]);
66+
const invalidItemIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id);
67+
68+
if (invalidItemIds.length) {
69+
return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in selected items or their parents`, code: "ITEM_ID_MISMATCH" };
70+
}
71+
}
72+
}
73+
3274
return { valid: true };
3375
}
3476
async meetRequirements(sessionData: SessionData): Promise<MockOutput> {
3577
// Validate required session data for on_select
3678
if (!sessionData.items || !Array.isArray(sessionData.items)) {
37-
return {
38-
valid: false,
79+
return {
80+
valid: false,
3981
message: "No items available in session data",
4082
code: "MISSING_ITEMS"
4183
};
4284
}
43-
85+
4486
if (!sessionData.selected_items || !Array.isArray(sessionData.selected_items)) {
45-
return {
46-
valid: false,
87+
return {
88+
valid: false,
4789
message: "No selected_items available in session data",
4890
code: "MISSING_SELECTED_ITEMS"
4991
};
5092
}
51-
93+
5294
if (sessionData.selected_items.length === 0) {
53-
return {
54-
valid: false,
95+
return {
96+
valid: false,
5597
message: "selected_items array is empty",
5698
code: "EMPTY_SELECTED_ITEMS"
5799
};
@@ -72,7 +114,7 @@ export class MockOnSelectClass extends MockAction {
72114
code: "MISSING_SELECTED_FULFILLMENTS"
73115
};
74116
}
75-
117+
76118
return { valid: true };
77119
}
78120
}

mock-service/src/config/mock-config/TRV14/2.0.0/on_select_cultural/class.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,42 @@ export class MockOnSelectPurchaseCultFormClass extends MockAction {
2828
generator(existingPayload: any, sessionData: SessionData): Promise<any> {
2929
return onSelectDefaultGenerator(existingPayload, sessionData);
3030
}
31-
async validate(targetPayload: any): Promise<MockOutput> {
31+
async validate(targetPayload: any, sessionData: SessionData): Promise<MockOutput> {
32+
const order = targetPayload?.message?.order;
33+
if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" };
34+
35+
const provider = order.provider;
36+
if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" };
37+
38+
if (sessionData.selected_provider && provider.id !== sessionData.selected_provider.id)
39+
return { valid: false, message: `Provider ID mismatch with selected provider: ${sessionData.selected_provider.id}`, code: "ID_MISMATCH" };
40+
41+
const fulfillments = order.fulfillments;
42+
if (sessionData.selected_fulfillments && fulfillments) {
43+
const validFulfillmentIds = new Set(sessionData.selected_fulfillments.map((f: any) => f.id));
44+
const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id);
45+
if (invalidFulfillmentIds.length) {
46+
return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in selected fulfillments`, code: "FULFILLMENT_ID_MISMATCH" };
47+
}
48+
}
49+
50+
const items = order.items;
51+
if (items) {
52+
if (sessionData.selected_items) {
53+
const selectedIds = sessionData.selected_items.map((i: any) => i.id);
54+
const parentIds = (sessionData.items || [])
55+
.filter((item: any) => selectedIds.includes(item.id) && item.parent_item_id)
56+
.map((item: any) => item.parent_item_id);
57+
58+
const validItemIds = new Set([...selectedIds, ...parentIds]);
59+
const invalidItemIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id);
60+
61+
if (invalidItemIds.length) {
62+
return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in selected items or their parents`, code: "ITEM_ID_MISMATCH" };
63+
}
64+
}
65+
}
66+
3267
return { valid: true };
3368
}
3469
async meetRequirements(sessionData: SessionData): Promise<MockOutput> {

mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission/class.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,49 @@ export class MockOnSelect2Class extends MockAction {
2828
generator(existingPayload: any, sessionData: SessionData): Promise<any> {
2929
return onSelect2Generator(existingPayload, sessionData);
3030
}
31-
async validate(targetPayload: any): Promise<MockOutput> {
31+
async validate(targetPayload: any, sessionData: SessionData): Promise<MockOutput> {
32+
const order = targetPayload?.message?.order;
33+
if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" };
34+
35+
const provider = order.provider;
36+
if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" };
37+
38+
if (sessionData.selected_provider && provider.id !== sessionData.selected_provider.id)
39+
return { valid: false, message: `Provider ID mismatch with selected provider: ${sessionData.selected_provider.id}`, code: "ID_MISMATCH" };
40+
41+
const fulfillments = order.fulfillments;
42+
if (sessionData.selected_fulfillments && fulfillments) {
43+
const validFulfillmentIds = new Set(sessionData.selected_fulfillments.map((f: any) => f.id));
44+
const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id);
45+
if (invalidFulfillmentIds.length) {
46+
return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in selected fulfillments`, code: "FULFILLMENT_ID_MISMATCH" };
47+
}
48+
}
49+
50+
const items = order.items;
51+
if (items) {
52+
const prevCats = sessionData.category_ids;
53+
if (prevCats?.length) {
54+
const currCats = new Set(items.flatMap((i: any) => i.category_ids || []));
55+
const missing = prevCats.filter(id => !currCats.has(id));
56+
if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" };
57+
}
58+
59+
if (sessionData.selected_items) {
60+
const selectedIds = sessionData.selected_items.map((i: any) => i.id);
61+
const parentIds = (sessionData.items || [])
62+
.filter((item: any) => selectedIds.includes(item.id) && item.parent_item_id)
63+
.map((item: any) => item.parent_item_id);
64+
65+
const validItemIds = new Set([...selectedIds, ...parentIds]);
66+
const invalidItemIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id);
67+
68+
if (invalidItemIds.length) {
69+
return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in selected items or their parents`, code: "ITEM_ID_MISMATCH" };
70+
}
71+
}
72+
}
73+
3274
return { valid: true };
3375
}
3476
async meetRequirements(sessionData: SessionData): Promise<MockOutput> {

mock-service/src/config/mock-config/TRV14/2.0.0/on_select_form_submission_culture/class.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,42 @@ export class MockOnSelectPurchaseCultureClass extends MockAction {
2828
generator(existingPayload: any, sessionData: SessionData): Promise<any> {
2929
return onSelect2Generator(existingPayload, sessionData);
3030
}
31-
async validate(targetPayload: any): Promise<MockOutput> {
31+
async validate(targetPayload: any, sessionData: SessionData): Promise<MockOutput> {
32+
const order = targetPayload?.message?.order;
33+
if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" };
34+
35+
const provider = order.provider;
36+
if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" };
37+
38+
if (sessionData.selected_provider && provider.id !== sessionData.selected_provider.id)
39+
return { valid: false, message: `Provider ID mismatch with selected provider: ${sessionData.selected_provider.id}`, code: "ID_MISMATCH" };
40+
41+
const fulfillments = order.fulfillments;
42+
if (sessionData.selected_fulfillments && fulfillments) {
43+
const validFulfillmentIds = new Set(sessionData.selected_fulfillments.map((f: any) => f.id));
44+
const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id);
45+
if (invalidFulfillmentIds.length) {
46+
return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in selected fulfillments`, code: "FULFILLMENT_ID_MISMATCH" };
47+
}
48+
}
49+
50+
const items = order.items;
51+
if (items) {
52+
if (sessionData.selected_items) {
53+
const selectedIds = sessionData.selected_items.map((i: any) => i.id);
54+
const parentIds = (sessionData.items || [])
55+
.filter((item: any) => selectedIds.includes(item.id) && item.parent_item_id)
56+
.map((item: any) => item.parent_item_id);
57+
58+
const validItemIds = new Set([...selectedIds, ...parentIds]);
59+
const invalidItemIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id);
60+
61+
if (invalidItemIds.length) {
62+
return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in selected items or their parents`, code: "ITEM_ID_MISMATCH" };
63+
}
64+
}
65+
}
66+
3267
return { valid: true };
3368
}
3469
async meetRequirements(sessionData: SessionData): Promise<MockOutput> {

mock-service/src/config/mock-config/TRV14/2.0.0/on_select_without_form/class.ts

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,30 +28,72 @@ export class MockOnSelectWithoutFormClass extends MockAction {
2828
generator(existingPayload: any, sessionData: SessionData): Promise<any> {
2929
return onSelectWithoutFormGenerator(existingPayload, sessionData);
3030
}
31-
async validate(targetPayload: any): Promise<MockOutput> {
31+
async validate(targetPayload: any, sessionData: SessionData): Promise<MockOutput> {
32+
const order = targetPayload?.message?.order;
33+
if (!order) return { valid: false, message: "Order not found in message", code: "MISSING_ORDER" };
34+
35+
const provider = order.provider;
36+
if (!provider) return { valid: false, message: "Provider not found in order", code: "MISSING_PROVIDER" };
37+
38+
if (sessionData.selected_provider && provider.id !== sessionData.selected_provider.id)
39+
return { valid: false, message: `Provider ID mismatch with selected provider: ${sessionData.selected_provider.id}`, code: "ID_MISMATCH" };
40+
41+
const fulfillments = order.fulfillments;
42+
if (sessionData.selected_fulfillments && fulfillments) {
43+
const validFulfillmentIds = new Set(sessionData.selected_fulfillments.map((f: any) => f.id));
44+
const invalidFulfillmentIds = fulfillments.filter((f: any) => !validFulfillmentIds.has(f.id)).map((f: any) => f.id);
45+
if (invalidFulfillmentIds.length) {
46+
return { valid: false, message: `Fulfillment IDs [${invalidFulfillmentIds.join(", ")}] not found in selected fulfillments`, code: "FULFILLMENT_ID_MISMATCH" };
47+
}
48+
}
49+
50+
const items = order.items;
51+
if (items) {
52+
const prevCats = sessionData.category_ids;
53+
if (prevCats?.length) {
54+
const currCats = new Set(items.flatMap((i: any) => i.category_ids || []));
55+
const missing = prevCats.filter(id => !currCats.has(id));
56+
if (missing.length) return { valid: false, message: `Missing categories: ${missing}`, code: "CATEGORY_MISMATCH" };
57+
}
58+
59+
if (sessionData.selected_items) {
60+
const selectedIds = sessionData.selected_items.map((i: any) => i.id);
61+
const parentIds = (sessionData.items || [])
62+
.filter((item: any) => selectedIds.includes(item.id) && item.parent_item_id)
63+
.map((item: any) => item.parent_item_id);
64+
65+
const validItemIds = new Set([...selectedIds, ...parentIds]);
66+
const invalidItemIds = items.filter((i: any) => !validItemIds.has(i.id)).map((i: any) => i.id);
67+
68+
if (invalidItemIds.length) {
69+
return { valid: false, message: `Item IDs [${invalidItemIds.join(", ")}] not found in selected items or their parents`, code: "ITEM_ID_MISMATCH" };
70+
}
71+
}
72+
}
73+
3274
return { valid: true };
3375
}
3476
async meetRequirements(sessionData: SessionData): Promise<MockOutput> {
3577
// Validate required session data for on_select
3678
if (!sessionData.items || !Array.isArray(sessionData.items)) {
37-
return {
38-
valid: false,
79+
return {
80+
valid: false,
3981
message: "No items available in session data",
4082
code: "MISSING_ITEMS"
4183
};
4284
}
43-
85+
4486
if (!sessionData.selected_items || !Array.isArray(sessionData.selected_items)) {
45-
return {
46-
valid: false,
87+
return {
88+
valid: false,
4789
message: "No selected_items available in session data",
4890
code: "MISSING_SELECTED_ITEMS"
4991
};
5092
}
51-
93+
5294
if (sessionData.selected_items.length === 0) {
53-
return {
54-
valid: false,
95+
return {
96+
valid: false,
5597
message: "selected_items array is empty",
5698
code: "EMPTY_SELECTED_ITEMS"
5799
};
@@ -72,7 +114,7 @@ export class MockOnSelectWithoutFormClass extends MockAction {
72114
code: "MISSING_SELECTED_FULFILLMENTS"
73115
};
74116
}
75-
117+
76118
return { valid: true };
77119
}
78120
}

0 commit comments

Comments
 (0)