Phase 12 R5: Marketplace-Frontend — /explore + /d + /u + /me/{published,subscribed,forks}
Routes: - /explore — Featured + Trending side-by-side, Browse mit Suche (Title/Description ILIKE), Sprachfilter, Sort (recent/popular/ trending), load-more-Pagination - /d/[slug] — Public-Deck-Detail mit Star/Subscribe/Fork-Buttons (Star + Subscribe sind toggle, Fork erstellt private cards.decks- Kopie und navigiert dorthin), Karten-Liste mit Discussion-Counts + Click-to-expand-Thread + Suggest-Edit-Modal, PR-Liste mit Owner-Merge/Reject + PR-Author-Close, Publish-Modal für Owner - /u/[slug] — Author-Profil mit Verified-Badges (Mana/Community), Follow-Button, Decks-Liste - /me/published — Author-Profil-CRUD (Slug + Display-Name + Bio + Pseudonym-Toggle), Liste eigener veröffentlichter Decks - /me/subscribed — Abos mit prominentem update_available-Banner - /me/forks — Geforkte Decks mit „Update ziehen"-Button → Smart-Merge-Pull (FSRS-State unveränderter Karten bleibt erhalten) Components (apps/web/src/lib/components/marketplace/, eigener Namespace ohne Konflikt zu Tills WIP-DeckGrid.svelte/DeckFan/ DeckStack): - AuthorBadge — Display-Name + Verified-Symbole + Link aufs Profil - DeckListGrid — 3-spalt Grid mit Author-Badge, Karten-/Star-/ Subscriber-Counts, Sprache, Featured-Tag - PublishVersionModal — SemVer-Eingabe (Default-Bump 1.0.0→1.1.0), Changelog, Karten als JSON-Array - SuggestEditModal — Modify- oder Remove-Mode pro Karte, ergibt einen Pull-Request via /api/v1/marketplace/.../pull-requests - DiscussionThread — Liste sichtbarer Comments inkl. Reply-Threading (parent_id), Hide-Button für Author oder Deck-Owner, Post-Form - PullRequestList — Status-Filter, Diff-Summary +N ~M −R, per-PR Merge/Reject/Close-Buttons je nach Owner/Author-Permission API-Client (apps/web/src/lib/api/marketplace.ts, ~440 Z.): - Authors (CRUD + public lookup) - Discovery (explore + browse + tags) - Public Deck-Read + Init/Publish/Patch - Engagement (Stars + Follows mit own-state-Endpoints) - Subscribe + Fork + Pull-Update - Pull-Requests (Lifecycle + List + Detail) - Card-Discussions (Post + List + Counts + Hide) Verifikation: - svelte-check: 4017 Files, 0 errors, 5 Svelte-5-rune-Warnings (benigne — Modals capturen Init-Values von Props bewusst, weil sie pro Klick frisch gemountet werden; nicht-reactive ist gewollt) - SSR-Smoke: /explore, /d/r5-stoa-grundlagen, /u/cardecky, /me/published liefern alle 200 — Routes mounten, Pages rendern initial mit Titles + Containern; API-Calls laufen client-side beim Mount - Live-Daten: Test-Decks r5-stoa-grundlagen (Stoische Grundbegriffe, 4 Karten v1.0.0) + r5-deutsche-historie (2 Karten) bewusst in lokaler cards-DB liegen gelassen, damit Browser sofort Inhalt hat Bewusst nicht angefasst: - Header.svelte ist in Tills uncommitted WIP — Header-Nav-Link auf /explore wird beim Theming-WIP-Commit nachgezogen. Marketplace- URLs sind aktuell direkt erreichbar via URL-Bar. - type-check-Warnings nicht silencet — die 5 sind benign und das Refactoren auf $derived würde keine Verhaltens-Änderung bringen. Verbleibend: R6 voller UI-E2E gegen das ganze System (Cardecky- Deck-Publish + Till-Subscribe + Till-Fork + Till-Suggest-PR + Cardecky-Merge + Till-Pull-Update — alles im Browser, manuell oder Playwright). Polish (Empty-States, Loading-Skeletons, Pagination- Edge-Cases) sammelt sich auf für eine separate Welle. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
92a1d5804f
commit
40861710bf
14 changed files with 2310 additions and 1 deletions
|
|
@ -98,7 +98,7 @@ Vollständiger Plan: [`mana/docs/playbooks/CARDS_GREENFIELD.md`](../mana/docs/pl
|
|||
| 9 | Polish (DSGVO-UI, Settings, Account, Statistik, i18n, A11y, Media, Image-Occlusion) | 🟡 weit | Card-Edit + Cloze-Editor + Inbox-Banner + Account/DSGVO + Statistik + Pre-Flight-Swap + i18n DE/EN + A11y-Pass + Cloze-Hint-Anzeige + Anki-Re-Import-Dedupe + MinIO-Media-Upload + Image-Occlusion durch (9a–9l). Verbleibend: type-in, audio, multiple-choice (Schema vorbereitet) |
|
||||
| 10 | Production-Deploy (Mac Mini, Cloudflare-Tunnel) | ✅ live 2026-05-08 | cardecky.mana.how + cardecky-api.mana.how, alte cards.* via nginx-301-Redirect |
|
||||
| 11 | Decommission Cards-Modul aus mana-monorepo | ✅ 2026-05-08 | apps/cards, services/cards-server, packages/cards-core, mana-app cards-Modul + cross-refs entfernt (4 Commits, type-check 0 errors) |
|
||||
| 12 | Marketplace-Restore (R0–R6) | 🟡 R0+R1+R2+R3+R4 durch | Plan: [`docs/playbooks/MARKETPLACE_RESTORE.md`](docs/playbooks/MARKETPLACE_RESTORE.md). R0 (Doku): ✅. R1 (Schema): ✅. R2 (α+β Authors + Publish): ✅. R3 (γ+δ Discovery + Engagement + Subscribe + Smart-Merge mit FSRS-State-Erhalt): ✅. **R4 (ε Pull-Requests + Card-Discussions): ✅** — `POST/GET /decks/:slug/pull-requests` (PR-Erstellung mit add/modify/remove-Diff, public List), `GET /pull-requests/:id`, `POST /pull-requests/:id/{close,reject,merge}` mit Lifecycle-Enforcement (open→merged|closed|rejected), Merge ist Owner-only und erzeugt atomar eine neue Version mit semver-minor-Bump (1.0.0→1.1.0 default), bumpt `latest_version_id`, schreibt PR-Resolution. Card-Discussions: `POST /decks/:slug/cards/:hash/discussions` (auth, Threads keyed auf `card_content_hash` damit sie Versions-Bumps überleben), `GET /cards/:hash/discussions` (public read, hidden filtered), `GET /decks/:slug/discussions/counts` (Bulk pro Karte), `POST /discussions/:id/hide` (Author oder Deck-Owner). 11 neue Semver-Unit-Tests, 89 gesamt grün. **E2E-Smoke**: Cardecky publisht v1.0.0 (Apatheia, Eudaimonia, Logos) → Till submitted PR (modify Eudaimonia-Back, remove Logos, add Tugendlehre) → Till's Merge-Versuch wird mit 403 abgelehnt (deck_owner_only) → Cardecky merged → v1.1.0 entsteht atomar mit korrektem Karten-Mix in Ord-Reihenfolge → re-merge wird mit 409 abgelehnt → Till postet Frage zur Apatheia-Karte → Cardecky antwortet mit parent_id (Threading) → Cross-Card-Parent wird mit 422 abgelehnt → Hide-Operation versteckt vom Read aus → Bulk-Counts korrekt → Smart-Merge-Pull gegen v1.0.0→v1.1.0 zeigt 2 changed (Eudaimonia + Logos↔Tugendlehre über ord-Heuristik), 0 cards_inserted weil bereits-private-via-Fork. Bug-Fix: `r.use('*', authMiddleware)` in fork.ts wäre an dem `/api/v1/marketplace`-Mount-Punkt nachfolgende Router-Mounts (PRs, Discussions) versehentlich gefangen — Refactor auf per-route Middleware. Verbleibend: R5 Frontend-Routes, R6 voller UI-E2E. |
|
||||
| 12 | Marketplace-Restore (R0–R6) | 🟡 R0+R1+R2+R3+R4+R5 durch | Plan: [`docs/playbooks/MARKETPLACE_RESTORE.md`](docs/playbooks/MARKETPLACE_RESTORE.md). R0–R4 (Backend-Stack): ✅. **R5 (Frontend-Routes): ✅** — `apps/web/src/lib/api/marketplace.ts` (~340 Z. Client mit Authors, Discovery, Engagement, Subscribe, Fork, PR, Discussions), Components in `lib/components/marketplace/` (AuthorBadge, DeckListGrid, PublishVersionModal, SuggestEditModal, DiscussionThread, PullRequestList — eigener Namespace ohne Konflikt zu Tills WIP-DeckGrid.svelte), Routes: `/explore` (Featured + Trending + Browse mit Suche + Sortierung + Pagination), `/d/[slug]` (Public-Detail mit Star/Subscribe/Fork-Buttons + Karten-Liste mit Discussion-Counts + Suggest-Edit-Modal pro Karte + PR-Liste mit Owner-Merge/Reject + Publish-Modal für Owner), `/u/[slug]` (Author-Profil + Verified-Badges + Follow-Button + eigene Decks), `/me/published` (Author-Profil-CRUD + eigene Veröffentlichungen), `/me/subscribed` (Subs mit update_available-Banner), `/me/forks` (geforkte Decks mit „Update ziehen"-Button → Smart-Merge-Pull). svelte-check: 4017 Files, **0 errors, 5 Svelte-5-rune-Warnings** (benign — Modals capturen Init-Values von Props, gewollt). SSR-Smoke: alle 4 Marketplace-URLs (`/explore`, `/d/r5-stoa-grundlagen`, `/u/cardecky`, `/me/published`) liefern 200. Test-Decks `r5-stoa-grundlagen` (Stoische Grundbegriffe, 4 Karten v1.0.0) + `r5-deutsche-historie` (2 Karten) bewusst in der lokalen `cards`-DB liegen gelassen für Browser-Spielwiese. Header-Nav-Link auf `/explore` **nicht** gesetzt — `Header.svelte` ist in Tills uncommitted WIP, Link wird beim Theming-WIP-Commit nachgezogen. Verbleibend: R6 voller UI-E2E + ggf. Polish (Modal-Warnings, Empty-States, Loading-Skeletons). |
|
||||
|
||||
Legende: ✅ erledigt + verifiziert · 🚧 blockiert · ⏸ noch nicht begonnen
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue