Skip to content

User-visible behavior ​

Sealed detail opens the explicit Cardmarket product URL stored in the catalogue. It preserves the supplied website locale/path, including German pages, and selects offers in the displayed product language. A missing or unusable mapping keeps the existing text search. No product slug is invented. The eBay action remains its existing sold-listings search; no eBay product URL is inferred or filled.

In the admin Sealed list, the Cardmarket link appears separately from historical names, tags and image paths. Active ADMIN/SUPER_ADMIN staff can edit it inline or clear the field. Wrong hosts/games, searches, raw Singles, query strings and fragments are rejected by the database setter. Stale saves require a reload. Marketing users have no edit control and their writes are refused. Every actual change is audited without granting direct table writes.

API and database contract ​

GET /sealed-products, including bounded ids lookups used by collection and binder detail, projects sealed_products.cardmarket_url. Clearing this column does not revive old JSON mappings. The API validates HTTPS, the Cardmarket host, product-path shape and the same game, then removes query strings/fragments. It retains the stored FR/EN/DE/ES/IT/PT website locale rather than rewriting the slug. This is not an HTTP availability check.

The approved prior import populated 1,850 candidate URLs across 3,069 products; 1,219 excluded/unmapped products were preserved. Cardmarket returned 403 during the audit, so imported URLs are operator-approved candidates, not live-verified product pages. eBay remained NULL. No URLs are fetched automatically when saving.

Backend migration 0050_sealed_product_marketplace_urls.sql idempotently creates the two nullable URL columns for fresh databases. The API's compatible row projection also tolerates absent URL columns. No backfill is part of that migration.

Before deploying the admin, back up the schema/catalogue and explicitly apply admin migration 022-sealed-product-cardmarket-url.sql, after its existing catalogue/label/subtitle migrations. It extends the restricted read view and installs admin_console.set_sealed_product_cardmarket_url plus admin_console.sealed_product_url_audit. Runtime boot never applies it. The setter updates only cardmarket_url, never names/tags/paths or eBay.

This delivery only prepares PRs. It applies no VPS migration, performs no new production write or deployment, and does not start the emulator or change any account or collection.

Verification ​

  • API suite on Node 22.23.4: 1,606 passed, 21 skipped; the optional embedded PostgreSQL-compatible URL/publication test passed separately. It exercises repeated migration application, stored-URL retrieval by ID, null eBay and preserved holdings.
  • Ingest suite on Node 22.23.4: 556 passed.
  • Admin suite on Node 22.23.4: 189 passed. Nine focused sealed tests cover edits, clearing, conflicting changes, no-op audit behavior, inactive/Marketing staff, URL validation and preserved product provenance.
  • Admin browser checks passed against a disposable local database: save, reload, invalid URL, clearing, narrow viewport, unchanged provenance and Marketing 403.
  • Mobile: ESLint and TypeScript passed; Jest 3,049 passed, 11 skipped in 309 passing suites. The catalogue/URL/detail subset contains 75 passing tests.
  • Maestro flow sealed-cardmarket-product.yaml prepared but not executed, per the explicit request not to launch the emulator. Full Docker/PostgreSQL E2E is unavailable locally because Docker is not installed.

Observed test-first failures: the API read legacy JSON instead of the dedicated column, German URLs were rejected, the detail action opened search instead of the stored product page, and the admin URL-edit use case was initially absent. All corresponding focused regressions now pass. The URL checks do not certify Cardmarket product identity or successful HTTP loading.

Remote CI limitations ​

The app and admin validation jobs were refused before execution because of the organization's billing/spending limit. Backend extended typecheck:js reports existing errors in unchanged onepieceDisplayPolicy.test.ts (nullable display sort key) and backfillMediaKeys.test.ts (possibly undefined rows), reproduced locally. Standard builds and runtime suites above pass. Backend integration jobs cannot reach a Docker daemon on the runner; the admin release build also lacks the rootlesskit executable. These infrastructure and unrelated test-typing problems are not fixed by the URL feature. The PRs remain open, not merged.

Pull requests ​