diff --git a/src/app/api/admin/import/clone/batch/route.ts b/src/app/api/admin/import/clone/batch/route.ts index eb31bbe2..6c4a32a5 100644 --- a/src/app/api/admin/import/clone/batch/route.ts +++ b/src/app/api/admin/import/clone/batch/route.ts @@ -34,6 +34,7 @@ export const POST = withAdmin( const body = await request.json(); const sourceId: string = body.sourceId || ""; const rawClassnames: string[] = body.classnames || []; + const isFinal = body.final === true; if (!sourceId) return apiError("Missing sourceId", 400); if (rawClassnames.length === 0) @@ -65,8 +66,8 @@ export const POST = withAdmin( } } - if (items.length > 500) - return apiError("Too many classnames (max 500)", 400); + if (items.length > 5000) + return apiError("Too many classnames (max 5000)", 400); // FurnitureData entries for successfully cloned items are appended once // at the end (single read-modify-write instead of one per item), which @@ -138,6 +139,8 @@ export const POST = withAdmin( ); } + if (!isFinal) return; + // Post-import consolidation, mirroring the furni batch route: // force offer_id to mirror its catalog row id, keep the // FurnitureData in sync with the new local sprite ids, verify diff --git a/src/components/admin/studio/studio-client.tsx b/src/components/admin/studio/studio-client.tsx index 72603031..e28497a2 100644 --- a/src/components/admin/studio/studio-client.tsx +++ b/src/components/admin/studio/studio-client.tsx @@ -444,6 +444,7 @@ export function StudioClient({ for (let i = 0; i < classnames.length; i += CHUNK) { if (abort.signal.aborted) break; const chunk = classnames.slice(i, i + CHUNK); + const isLast = i + CHUNK >= classnames.length; const res = await adminFetch("/api/admin/import/clone/batch", { method: "POST", @@ -452,6 +453,7 @@ export function StudioClient({ sourceId: activeSource, classnames: chunk, concurrency: 10, + final: isLast, }), signal: abort.signal, }); @@ -853,6 +855,7 @@ export function StudioClient({ sourceId: activeSource, classnames: failed, concurrency: 10, + final: true, }), signal: abort.signal, });