4.8 KiB
Furni Import Hotel Source Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Make the furni import visibly and consistently use the CMS habbo_gamedata_hotel setting without Italy-specific names or messages.
Architecture: Keep locale selection centralized in getHabboGamedataHotel() and expose normalized display metadata to the server-rendered import page. Rename the furnidata cache contract to generic official-Habbo terminology, and keep asset downloads on the global images.habbo.com CDN.
Tech Stack: TypeScript 7, React 19, Next.js 16, Vitest 4.
Global Constraints
habbo_gamedata_hotelremains the single source of truth.- Furnidata and external texts use
www.habbo.<hotel>. - SWF and icon downloads remain on
images.habbo.com. - Cache entries must never leak across two configured hotels.
- Existing import behavior and permissions remain unchanged.
Task 1: Generic official-Habbo furnidata contract
Files:
- Create:
src/lib/services/habbo-furnidata-cache.test.ts - Modify:
src/types/furni.ts - Modify:
src/lib/services/habbo-furnidata-cache.ts - Modify:
src/lib/services/habbofurni.ts - Modify:
src/lib/services/furni-data.ts - Modify:
src/lib/services/furni-import.ts - Modify:
src/actions/admin-settings.ts - Modify:
src/app/api/admin/import/furni/route.ts - Modify:
src/app/api/admin/import/furni/resync/route.ts - Modify:
src/app/api/admin/import/furni/batch-regen/route.ts
Interfaces:
-
Produces:
OfficialHabboFurniEntry. -
Produces:
getOfficialHabboFurnidata(),lookupOfficialHabboFurni(), andclearOfficialHabboFurnidataCache(). -
Consumes:
getHabboGamedataHotel()andhabboFurnidataUrl(hotel). -
Step 1: Write a failing cache-isolation test
Mock the selected hotel as it for the first request and nl for the second. Return distinct fixtures from fetch and assert that the second call returns the Dutch fixture and requests https://www.habbo.nl/gamedata/furnidata_json/1.
- Step 2: Run the cache test and verify RED
Run: pnpm exec vitest run --coverage=false src/lib/services/habbo-furnidata-cache.test.ts
Expected: FAIL because the generic official-Habbo API is not exported yet.
- Step 3: Rename the cache contract and consumers
Rename the Italy-specific type and functions throughout the import pipeline. Keep the existing hotel-keyed cache behavior and update comments to say “configured official Habbo hotel”.
- Step 4: Run the cache test and verify GREEN
Run: pnpm exec vitest run --coverage=false src/lib/services/habbo-furnidata-cache.test.ts
Expected: PASS with separate it and nl fetches.
Task 2: Display and report the configured source
Files:
- Create:
src/app/admin/import/furni/import-source.test.ts - Create:
src/app/admin/import/furni/import-source.ts - Modify:
src/app/admin/import/furni/page.tsx - Modify:
src/app/admin/import/furni/import-furni-client.tsx - Modify:
src/lib/services/furni-import.ts - Modify:
src/lib/services/furni-import.test.ts
Interfaces:
-
Produces:
FurniImportSource { hotel, label, host, furnidataUrl }. -
Produces:
getFurniImportSource()for the server page. -
Produces:
formatOfficialHabboEnrichmentWarning(hotel, name). -
Step 1: Write failing source and message tests
Assert that an nl setting becomes { hotel: "nl", label: "Netherlands (habbo.nl)", host: "habbo.nl", furnidataUrl: "https://www.habbo.nl/gamedata/furnidata_json/1" } and that enrichment reports Enriched from habbo.nl.
- Step 2: Run the tests and verify RED
Run: pnpm exec vitest run --coverage=false src/app/admin/import/furni/import-source.test.ts src/lib/services/furni-import.test.ts
Expected: FAIL because source metadata and the dynamic warning formatter do not exist.
- Step 3: Implement source metadata and UI
Read the normalized hotel on the server page, pass source metadata into ImportFurniClient, and render a compact source badge/link above the furni controls. Replace literal habbo.it enrichment wording with the resolved host.
- Step 4: Run focused verification
Run: pnpm exec vitest run --coverage=false src/lib/services/habbo-furnidata-cache.test.ts src/app/admin/import/furni/import-source.test.ts src/lib/services/furni-import.test.ts
Expected: PASS.
- Step 5: Run repository verification
Run:
pnpm typecheck
pnpm test
pnpm build
Expected: all commands exit with status 0 using the same non-secret production validation environment as CI where required.
- Step 6: Commit the implementation
fix: use configured Habbo hotel in furni import