Fix: Handle designJson as string in checkout API

The designJson field can be either a parsed object or a JSON string
depending on how it was stored. The checkout API was assuming it was
always an object and casting it, which caused 'Cannot read properties
of undefined' error when trying to access .length on front/back arrays.

Now properly parses the string if needed and safely accesses array
properties with optional chaining.
This commit is contained in:
Andymick
2026-07-18 19:54:53 +01:00
parent 60cb73f8a4
commit fae1ce04c2
2 changed files with 4 additions and 3 deletions
+2 -1
View File
@@ -64,7 +64,8 @@
"Bash(git status *)", "Bash(git status *)",
"Bash(git revert *)", "Bash(git revert *)",
"Bash(git commit -m 'Fix price display issues and layout in design review page *)", "Bash(git commit -m 'Fix price display issues and layout in design review page *)",
"Bash(git commit -m 'Fix: Calculate effectivePrice in design API endpoints *)" "Bash(git commit -m 'Fix: Calculate effectivePrice in design API endpoints *)",
"Bash(git commit -m 'Fix: Handle designJson as string in checkout API *)"
] ]
} }
} }
+2 -2
View File
@@ -78,8 +78,8 @@ export async function POST(req: Request) {
const activePromotions = await fetchActivePromotions(); const activePromotions = await fetchActivePromotions();
const pricedItems = items.map((i) => { const pricedItems = items.map((i) => {
const design = i.designJson as { front: unknown[]; back: unknown[] }; const design = typeof i.designJson === 'string' ? JSON.parse(i.designJson) : i.designJson;
const isPersonalised = design.front.length > 0 || design.back.length > 0; const isPersonalised = (design.front?.length ?? 0) > 0 || (design.back?.length ?? 0) > 0;
return { return {
...i, ...i,
unitPrice: getEffectivePrice(productsById.get(i.productId)!, activePromotions, new Date(), isPersonalised).price, unitPrice: getEffectivePrice(productsById.get(i.productId)!, activePromotions, new Date(), isPersonalised).price,