feat(import): run catalog synchronizations as durable jobs
CI / check (push) Successful in 57s
CI / deploy (push) Successful in 18s
CI / publish-container (push) Successful in 1m18s

This commit is contained in:
Simo committed 2026-09-11 00:36:22 +02:00
1 parent a2954e4408
commit 76f0420d64
14 files changed
+559 -801

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
import { eq } from "drizzle-orm";
import { db, ItemsBase } from "@/lib/db";
import type { ImportJobItem } from "@/lib/furni/import-job";
import { cloneSingleFurni } from "./clone-import";
import { getSource } from "./clone-sources";
import { importSingleFurni } from "./furni-import";
/** Called only inside the shared import lease and catalog export lock. */
export async function runSyncJobItem(item: ImportJobItem) {
const [existing] = await db
.select({ id: ItemsBase.id })
.from(ItemsBase)
.where(eq(ItemsBase.itemName, item.classname))
.limit(1);
if (existing)
return {
ok: true,
itemId: existing.id,
warnings: ["Already present; synchronization skipped this item."],
};
if (item.cloneSourceId) {
const source = await getSource(item.cloneSourceId);
if (!source || !item.cloneEntry)
throw Error("Synchronization source no longer available");
const result = await cloneSingleFurni({ source, entry: item.cloneEntry });
const [created] = result.ok
? await db
.select({ id: ItemsBase.id })
.from(ItemsBase)
.where(eq(ItemsBase.itemName, item.classname))
.limit(1)
: [];
return { ...result, itemId: created?.id };
}
return importSingleFurni({ ...item, repairExisting: false });
}