2.5 KiB
Manual Recent Furni Resync Design
Goal
Add a safe manual command to the existing Admin Import Furni screen for refreshing furniture imported during the last seven days. The command must update the live FurnitureData metadata and emulator caches without deleting database rows or regenerating existing asset bundles.
User interface
Add Update imported furni to the existing Tools dropdown on
/admin/import/furni.
Selecting it opens a confirmation dialog that states the fixed scope: furniture recorded by the admin audit log as imported during the last seven days. While the operation is running, the action and confirmation button are disabled and a loading state is shown to prevent duplicate requests.
After completion, show a result panel containing:
- examined item count;
- successfully resynced item count;
- failed item count;
- emulator RCON refresh status;
- returned per-item errors, when present.
Data flow
The client sends an authenticated, CSRF-protected POST request through
adminFetch to the existing endpoint:
/api/admin/import/furni/resync?days=7
The endpoint remains authoritative for selecting the targets. It reads only
ItemsBase IDs referenced by admin_audit_log entries whose action is
furni_import, target is ItemsBase, and timestamp falls within the last seven
days.
For each target, the existing resync logic rebuilds its FurnitureData entry,
enriches it from the configured habbo_gamedata_hotel, and upserts it into the
live FurnitureData.json. It then requests updateCatalog and updateItems
through RCON.
Safety and permissions
- Reuse the endpoint's
ASSETS_IMPORTpermission check and admin CSRF guard. - Do not expose a UI option for
all=1. - Do not delete or recreate
items_baseor catalog rows. - Do not regenerate
.nitro, SWF, or icon files. - Keep returned errors visible without treating an RCON failure as a successful refresh.
Error handling
Network or non-JSON failures produce an error toast and leave the command available for retry. A successful API response is rendered even when individual items failed, so the administrator can distinguish partial completion from a request failure.
The result panel is dismissible. Running the command again replaces the prior result.
Verification
- Unit-test the result normalization used by the UI, including partial failures and RCON status.
- Verify that the client calls exactly
resync?days=7throughadminFetch. - Run focused tests, Biome, TypeScript, the full test suite, and a production build.