fix(catalog): make the Builder Club catalog read and write its own offers
Gitea Actions Runner Test / test-job (push) Successful in 0s
CI / check (push) Successful in 28s
CI / tests-unit (push) Successful in 1m39s
CI / tests-integration (push) Successful in 1m42s
CI / tests-ui (push) Successful in 2m23s
CI / preflight (push) Skipped
CI / deploy (push) Successful in 2m6s
Gitea Actions Runner Test / test-job (push) Successful in 0s
CI / check (push) Successful in 28s
CI / tests-unit (push) Successful in 1m39s
CI / tests-integration (push) Successful in 1m42s
CI / tests-ui (push) Successful in 2m23s
CI / preflight (push) Skipped
CI / deploy (push) Successful in 2m6s
The previous commit taught bulk editing and delete-with-restore about the BC catalog. Neither actually worked, and one of them was destructive. `catalog_items_bc` has six columns: id, item_ids, page_id, catalog_name, order_number, extradata. There is no price, points, currency, offer_id, limit or membership column on it. The bulk path read and wrote columns that do not exist, and the UPDATE was aimed at catalog_items while the SELECT came from catalog_items_bc — so a BC category move wrote into the normal catalog. Two tests now pin that pairing: reads and writes have to stay in the same table. Underneath it the BC table was never being read at all. The inline editor fetched `/api/admin/catalog/items?pageId=N` without the catalog, so opening a BC category showed the normal catalog's offers, and the route selected BC rows directly instead of going through the loader, skipping the furni enrichment the table needs to render anything but a bare caption. Both catalogs now take the same path, and the catalog is in the fetch callback's dependencies — without that, a switch keeps reading the previous catalog's rows through a stale closure. Because a BC offer has no price, the editor no longer offers one. The server refuses price, points and currency changes with a readable message instead of letting them reach the database as an unknown-column error, and a BC bulk edit is what it can actually be: a category move. BC deletions also went through a bare DELETE, which made them the one catalog mutation with no way back. They now keep their rows and hand back a restoreId like the normal ones. The catalog is recorded in the audit target rather than in the payload, so a restore can never put a BC row into the normal offers table.
This commit is contained in:
1 parent
cebcf440c5
commit
e0efbef30d
12 files changed
+548
-218
No files matched your search
@@ -233,9 +233,10 @@ function InlineEditorSession({
|
||||
setItemsError(false);
|
||||
setItemsLoading(true);
|
||||
try {
|
||||
const res = await fetch(`/api/admin/catalog/items?pageId=${id}`, {
|
||||
signal: request.signal,
|
||||
});
|
||||
const res = await fetch(
|
||||
`/api/admin/catalog/items?pageId=${id}${catQs}`,
|
||||
{ signal: request.signal },
|
||||
);
|
||||
if (!res.ok) throw new Error();
|
||||
const data = await res.json();
|
||||
if (!request.isCurrent()) return;
|
||||
@@ -250,7 +251,10 @@ function InlineEditorSession({
|
||||
if (request.isCurrent()) setItemsLoading(false);
|
||||
}
|
||||
},
|
||||
[itemRequests],
|
||||
// `catQs` selects which catalog the offers come from, so it has to be part
|
||||
// of this callback's identity: without it a switch keeps reading the
|
||||
// previous catalog's rows.
|
||||
[itemRequests, catQs],
|
||||
);
|
||||
|
||||
const reloadItems = useCallback(() => {
|
||||
|
||||
@@ -564,15 +564,19 @@ export function CatalogItemsTable({
|
||||
if (!ok) return;
|
||||
|
||||
const ids = [...selected];
|
||||
run(() => deleteCatalogItems({ ids, requestKey: crypto.randomUUID() }), {
|
||||
successMessage: `Deleted ${ids.length} item(s).`,
|
||||
errorMessage: "Failed to delete items.",
|
||||
onSuccess: (data) => {
|
||||
setSelected(new Set());
|
||||
onRefresh();
|
||||
offerUndoDelete(Number(data.restoreId), ids.length);
|
||||
run(
|
||||
() =>
|
||||
deleteCatalogItems({ ids, requestKey: crypto.randomUUID(), catalog }),
|
||||
{
|
||||
successMessage: `Deleted ${ids.length} item(s).`,
|
||||
errorMessage: "Failed to delete items.",
|
||||
onSuccess: (data) => {
|
||||
setSelected(new Set());
|
||||
onRefresh();
|
||||
offerUndoDelete(Number(data.restoreId), ids.length);
|
||||
},
|
||||
},
|
||||
});
|
||||
);
|
||||
}
|
||||
|
||||
// ── Move selected items to another page ─────────────────────────
|
||||
|
||||
Reference in new issue
Block a user