وارد کردن محصولات
Endpoint وارد کردن برای اجرای مکرر ساخته شده: بر اساس externalId
خودتان upsert میکند و محصولی که با نسخهی ذخیرهشده یکسان باشد
unchanged شمرده میشود و هزینهای پاییندست ندارد. پس سادهترین همگامسازی
این است که هر بار کل فید را دستهدسته بفرستید.
۱. فید را دستهدسته بفرستید
POST .../products/import
تا ۱٬۰۰۰ محصول در هر درخواست میگیرد.
const BASE = `https://api.plexit.ir/v1/assistants/${assistantCode}/products`;
const headers = {
Authorization: `Bearer ${process.env.PLEXIT_API_KEY}`,
"Content-Type": "application/json",
};
async function importAll(products) {
const totals = { created: 0, updated: 0, unchanged: 0 };
for (let i = 0; i < products.length; i += 500) {
const res = await fetch(`${BASE}/import`, {
method: "POST",
headers,
body: JSON.stringify({ products: products.slice(i, i + 500) }),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.response.status}: ${body.response.message}`);
for (const key of Object.keys(totals)) totals[key] += body.data[key];
}
return totals;
}هر دسته «همه یا هیچ» است و دوباره فرستادنش همیشه امن است. اگر درخواستی شکست خورد، مشکل را رفع کنید و همان دسته را دوباره بفرستید.
وقتی توضیحات طولانی است، دستهها را چند صد محصولی نگه دارید: بدنهی درخواست حداکثر ۳ مگابایت است.
۲. آنچه دیگر نمیفروشید را حذف کنید
وارد کردن هرگز چیزی حذف نمیکند. برای حذف محصولاتی که دیگر در فید نیستند،
کاتالوگ را فهرست کنید، شناسهها را مقایسه کنید و تفاوت را با POST .../products/delete پاک کنید.
async function removeMissing(feedIds) {
const keep = new Set(feedIds);
const gone = [];
let cursor;
do {
const url = `${BASE}?limit=200${cursor ? `&cursor=${cursor}` : ""}`;
const body = await (await fetch(url, { headers })).json();
for (const product of body.data.list) if (!keep.has(product.externalId)) gone.push(product.externalId);
cursor = body.data.nextCursor;
} while (cursor);
for (let i = 0; i < gone.length; i += 1000) {
await fetch(`${BASE}/delete`, { method: "POST", headers, body: JSON.stringify({ externalIds: gone.slice(i, i + 1000) }) });
}
return gone.length;
}۳. بفهمید کِی قابل جستجو شده
خواندن فوری است و جستجو در پسزمینه بهروز میشود. برای منتظر ماندن،
state=pending را فهرست کنید و ببینید خالی است:
GET .../products?state=pending&limit=1محصولی که در state=failed است خودکار دوباره تلاش میشود؛ اگر همانجا
ماند، خود محصول را بررسی کنید — محصول ناموفق تقریباً همیشه محصولی است که
سرویس جستجو آن را نپذیرفته (مثلاً مقداری که قابل ایندکس نیست).
نکتهها
- در
attributesعدد را بهصورت عدد بفرستید ("ram": 8نه"8 GB") و قیمت را درprice: همین است که فیلترهای قیمت و بازه را کار میاندازد. priceوin_stockنامهای رزرو ویژگی هستند؛ از فیلدهایpriceوinStockاستفاده کنید.- سقف پیشفرض کاتالوگ ۱۰٬۰۰۰ محصول برای هر دستیار است.