From c452bd9fb7d4e068bc7d60ff152c0384b4b19cef Mon Sep 17 00:00:00 2001 From: AI Assistant Date: Mon, 23 Mar 2026 02:33:30 +0200 Subject: [PATCH] fix(ancpi): use form-data multipart for saveProductMetadataForBasketItem MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Angular uses doPostAsFormMultipart — the save endpoint requires multipart/form-data, not application/x-www-form-urlencoded. Install form-data package and restore multipart upload. Co-Authored-By: Claude Opus 4.6 (1M context) --- package-lock.json | 1 + package.json | 1 + src/modules/parcel-sync/services/epay-client.ts | 14 +++++++------- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b67250..bc477b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "docx": "^9.6.0", + "form-data": "^4.0.5", "jspdf": "^4.2.0", "jszip": "^3.10.1", "lucide-react": "^0.564.0", diff --git a/package.json b/package.json index 54445c3..28f6ab1 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "docx": "^9.6.0", + "form-data": "^4.0.5", "jspdf": "^4.2.0", "jszip": "^3.10.1", "lucide-react": "^0.564.0", diff --git a/src/modules/parcel-sync/services/epay-client.ts b/src/modules/parcel-sync/services/epay-client.ts index 8674210..9e9a20b 100644 --- a/src/modules/parcel-sync/services/epay-client.ts +++ b/src/modules/parcel-sync/services/epay-client.ts @@ -19,6 +19,7 @@ import axios, { type AxiosInstance } from "axios"; import crypto from "crypto"; import { wrapper } from "axios-cookiejar-support"; import { CookieJar } from "tough-cookie"; +import FormData from "form-data"; import type { EpayCartResponse, EpaySearchResult, @@ -399,18 +400,17 @@ export class EpayClient { configurationUrl: "http://www.google.com", }; - // Use URLSearchParams instead of multipart FormData - // (axios + cookie-jar has issues with native FormData) - const form = new URLSearchParams(); - form.set("reqType", "saveProductMetadataForBasketItem"); - form.set("productMetadataJSON", JSON.stringify(metadata)); + // Must use multipart/form-data (Angular uses doPostAsFormMultipart) + const form = new FormData(); + form.append("reqType", "saveProductMetadataForBasketItem"); + form.append("productMetadataJSON", JSON.stringify(metadata)); const response = await this.client.post( `${BASE_URL}/EpayJsonInterceptor.action`, - form.toString(), + form, { headers: { - "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + ...form.getHeaders(), "X-Requested-With": "XMLHttpRequest", }, timeout: DEFAULT_TIMEOUT_MS,