feat(catalog): prevent and repair Arcturus emulator data errors
CI / check (push) Failing after 26s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped

Block invalid catalog_items writes at the API level (points currency
allowlist, non-negative prices, positive amount, limited stack >= sold
count, unique sibling order numbers) and auto-assign unique order numbers
on bulk create. Add a catalog-maintenance scan + transactional repair that
fixes pre-existing rows: resets unsupported points_type, clamps negative
costs, sets amount to 1, raises limited_stack, renumbers duplicate orders
and deletes offers with missing page/item references. Surface the issue
count and a fix button in the admin maintenance panel.

Also: add enabled/retired flag to clone sources, classify poster and
currency furniture in item-kind, and remove the obsolete update-Nitrov3.sh.
This commit is contained in:
openhands committed 2026-09-10 11:29:28 +02:00
1 parent ad65d80d41
commit 3e69b72513
26 files changed
+17651 -3844

No files matched your search

@@ -6,6 +6,7 @@ import { toast } from "sonner";
import {
applyAlignIdsAction,
fixCatalogOffersAction,
fixEmulatorIssuesAction,
fixEverythingAction,
fixSpriteIdsAction,
getFurniHealthAction,
@@ -33,6 +34,7 @@ interface Health {
catalogDuplicates: number;
catalogBcDuplicates: number;
catalogPageDuplicates: number;
emulatorIssues: number;
}
export function CatalogMaintenancePanel() {
@@ -175,6 +177,11 @@ export function CatalogMaintenancePanel() {
value={health.catalogPageDuplicates}
hint="same caption under the same parent (double links)"
/>
<Stat
label="Emulator catalog issues"
value={health.emulatorIssues}
hint="points currency, prices, stack, orphans, order numbers"
/>
</>
)}
</CardContent>
@@ -221,6 +228,19 @@ export function CatalogMaintenancePanel() {
>
Reconcile FurnitureData ↔ DB
</Button>
<Button
variant="secondary"
disabled={busy !== null}
onClick={() =>
void run(
"emulator",
fixEmulatorIssuesAction,
"Emulator catalog constraints fixed",
)
}
>
Fix emulator constraints
</Button>
</div>
<Card>