RECORDGOD/RECORDGOD_STOREFRONT_PLAN.md

95 lines
6.9 KiB
Markdown

# RecordGod — public storefront + component page editor
Port WowPlatter's **customer-facing** storefront to RecordGod as a **component-based page system** with a
**page editor** (arrange the blocks). Studied: `wowplatter/public/{templates,partials,handlers}` +
`shortcodes/{entities,components,navigation,templates}`. Legend: 🟢 build · 🟡 confirm · 🔵 new (no RecordGod equiv yet).
---
## 1. The key insight — it's already component-based
WowPlatter renders public pages by composing **shortcode "blocks"**, not monolithic templates:
**Entity blocks** (`shortcodes/entities/`): `release · artist · label · genre · style · format · identifier ·
inventory · price · market · wantlist`. **Component blocks** (`shortcodes/components/`): `items (grid) · filter
(facets) · media (audio/video) · credits`. **Navigation** (`shortcodes/navigation/`): `breadcrumb · pagination ·
search`. Pages (`public/templates/*.php`) assemble these.
**So the page editor is natural:** a page = an ordered list of component blocks (each with config), stored as
JSON, editable by dragging/reordering. This is exactly "page edit style so I can arrange the components."
---
## 2. The public pages (mapped)
| Page | WowPlatter file | Components / sections | Data | Verdict |
|---|---|---|---|---|
| **Browse / Records** (the shop) | `records.php` (1378), `browse.php` | **faceted filter** (genre/style/format/year/price) + sort + **items grid** + pagination | `disc_release` mirror + `inventory` (in-stock, price) | 🟢 the core catalog page |
| **Release detail** | `release.php` (1701), `mobile-release.php` | cover, detail panels, **tracklist**, **credits**, price/inventory (buy), AI blurb, Apple/YT links, related | `disc_release` + `disc_release_track/artist/label/format/image` + `inventory` | 🟢 the hero page |
| **Artist** | `artist.php` (270) | artist header (name/bio/image) + their **releases grid** | `disc_artist` + `disc_release_artist` → releases | 🟢 |
| **Label** | `label.php` | label header + releases grid | `disc_label` + `disc_release_label` | 🟢 |
| **Genre / Style** | `genre.php` (278), style template | genre/style header + filtered releases grid | `disc_genre/style` + `disc_release_genre/style` | 🟢 |
| **Search** | `search-shortcode`, public-search | search box → results grid (reuse items grid) | inventory + `disc_release` | 🟢 (extends the admin search infra) |
| **Wantlist** | `wantlist` entity + public-wantlist partial | customer's wants + match-to-stock | `customer` + a `wantlist` table (intake-match — see audit) | 🟡 ties to the Wantlist cream item |
| **Login / Signup** | `login.php` (334), `signup.php`, forgot/reset | username/password forms, redirect, remember | **customer accounts** | 🔵 NEW — RecordGod has admin-token auth only, no customer accounts yet |
| **Profile / Loyalty** | `profile.php`, `loyalty-dashboard.php` | account info, order history, loyalty (inactive) | `customer` + `sales` | 🟡 (Loyalty inactive per audit) |
| **Listen** | `listen.php` | audio-preview player + crate map | audio previews (Audio cream) | 🟡 (ties to Audio previews) |
| Header / Footer / FAQ | `header/footer/faq.php` | chrome blocks | store_config | 🟢 fold into the builder |
---
## 3. RecordGod build — component library + page editor
**a) Component library** (RecordGod renders these; reusable across pages):
`release-card · release-detail · tracklist · credits · price-buy · items-grid · facet-filter · artist-header ·
label-header · genre-header · search-box · breadcrumb · pagination · hero/banner · text/markdown · audio-preview`.
Each is a small template + a data contract, themed by the builder tokens.
**b) Page-type layouts** (the editor's output): a page-type (`browse / release / artist / label / genre / style /
search / account`) has a **layout = ordered `[{component, config}]`** in `store_config` jsonb (already exists).
The public renderer reads the layout for the page-type + the entity data → composes the blocks.
**c) The page editor** (the ask): in `/builder`, a **per-page-type canvas**: pick a page type → see its block list →
**drag to reorder, add/remove blocks, edit each block's config** (e.g. items-grid: columns, sort default; facet-
filter: which facets; release-detail: which panels). Live preview using a sample entity. Saves the layout JSON.
(Builds on the existing `/builder` theme/brand-import + element editor — this adds the *structural* layer.)
**d) Data layer** — already mostly there:
- `disc_release` mirror (+ genre/style/label/format/artist/track/image) = all entity data, local. ✓
- `inventory` = what's in stock + price (the buyable layer). ✓
- Images = `/img/r/<release_id>` (self-hosted WebP). ✓
- Public read endpoints: extend `/shop/catalog` + add `/shop/release/<id>`, `/shop/artist/<id>`, `/shop/browse?facets…`.
**e) Routing** — pretty public URLs: `/records` (browse), `/release/<id>-<slug>`, `/artist/<id>`, `/label/<id>`,
`/genre/<g>`, `/style/<s>`, `/search`, `/account`. (WowPlatter uses rewrite rules; RecordGod adds FastAPI routes.)
**f) Customer auth** 🔵 — the one genuinely NEW piece: customer accounts (signup/login/forgot/profile) — a
`customer_auth` (email + password hash + session) layer separate from the admin token. WooCommerce currently owns
customer accounts; decide: RecordGod own accounts, or SSO/keep Woo for checkout (see §5).
---
## 4. How it connects to what exists
- **`/builder`** (theme + brand-import + element editor) → gains the **page-structure editor** (this plan's core).
- **`/shop`** (themed storefront reading `/shop/config` + `/shop/catalog`) → becomes the rendered output of the layouts.
- **disc_release mirror + inventory + /img/r** → the data + images, already built.
- **Customers + Wantlist** → power the account + wantlist pages.
---
## 5. Open questions (confirm before building)
1. **Customer accounts + checkout**: does RecordGod own customer auth + cart/checkout, or does **WooCommerce** stay
the commerce/account backend (RecordGod renders, Woo transacts)? Big architecture fork.
2. **Editor depth**: full drag-drop block canvas, or a simpler ordered list with show/hide + config per block (faster
to ship, 90% of the value)?
3. **Which pages first**: Browse + Release (the 80% — catalog + detail) before Artist/Label/Genre/Style + account?
4. **Listen/audio previews** on the storefront — in this phase or with the Audio internalization work?
## 6. Phases
- **P0 — read API + Release/Browse render** (no editor yet): `/shop/release/<id>` + `/shop/browse` rendering the
component blocks with a default layout. The 80% value, proves the data + components.
- **P1 — the page editor**: per-page-type layout editor in `/builder` (reorder/add/remove/config blocks) + live preview.
- **P2 — Artist/Label/Genre/Style** entity pages (reuse items-grid + header blocks).
- **P3 — customer accounts** (signup/login/profile) — pending the §5.1 decision.
- **P4 — Wantlist + Search + Listen** storefront pages.