cards/apps/api
Till JS ff00c7d961
Some checks are pending
CI / validate (push) Waiting to run
feat(marketplace): Deck-Report + Author-Block + me/decks-Endpoints
Cardecky-Marketplace bekommt die App-Store-Guideline-5.1.1(v)-
Pflicht-Komponenten für User-Generated-Content: User können einzelne
Decks melden und Authors blockieren. Plus `GET /me/decks` für den
Native-Re-Publish-Flow.

Schema (Migration 0003)
- Neue Tabelle `marketplace.author_blocks (blocker_user_id,
  blocked_user_id, created_at)` mit Unique-Index auf dem Tupel
- `deckReports` lag schon im Schema, jetzt erstmals durch Routes
  erreichbar

Routes
- POST /api/v1/marketplace/decks/:slug/report — auth, 10/min Rate-
  Limit, Kategorie-Enum (spam, copyright, nsfw, misinformation, hate,
  other), optional `body` ≤ 1000 Zeichen. Idempotent pro (deck,
  reporter, category): doppeltes Melden liefert `already_reported:
  true` ohne Fehler. Owner darf eigenes Deck nicht melden.
- POST /api/v1/marketplace/authors/:slug/block — idempotent
  (onConflictDoNothing). Self-Block geht 422.
- DELETE /api/v1/marketplace/authors/:slug/block
- GET /api/v1/marketplace/me/blocks — eigene Block-Liste mit
  display_name + blocked_at
- GET /api/v1/marketplace/me/decks — eigene Marketplace-Decks mit
  latest_version (semver, card_count, published_at). Native nutzt das
  für die „Neue Version"-Auswahl im Publish-Flow

Listing-Filter
- explore.ts: `browseImpl` nimmt `signedInUserId?` und filtert
  blockierte Author-Decks per `NOT EXISTS`. Wirkt auf /explore +
  /decks (Browse mit Filtern)
- decks.ts: `GET /:slug` returnt 404 wenn der Viewer den Author
  blockiert hat — bewusst 404 statt 403, UGC-Block soll ohne Hinweis
  auf den Block wirken

Mount: zwei neue Router auf /api/v1/marketplace (moderation) und
/api/v1/marketplace/me. 104/104 Vitest-Tests grün.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 02:04:54 +02:00
..
scripts db(cards): baseline migration + drizzle-tracking bootstrap script 2026-05-12 18:53:52 +02:00
src feat(marketplace): Deck-Report + Author-Block + me/decks-Endpoints 2026-05-14 02:04:54 +02:00
tests security(cards): fail-secure dev-stub, headers, rate-limit, dsgvo audit 2026-05-12 16:56:03 +02:00
Dockerfile fix(api Dockerfile): COPY app-manifest.json (runtime-import) 2026-05-08 20:14:20 +02:00
drizzle.config.ts Phase 12 R0+R1: Marketplace-Restore-Plan + Schema in marketplace-pgSchema 2026-05-09 15:05:22 +02:00
package.json db(cards): baseline migration + drizzle-tracking bootstrap script 2026-05-12 18:53:52 +02:00
tsconfig.json Phase 3 follow-up: type-check + tests grün, ts-fsrs v5 API 2026-05-08 14:41:04 +02:00
vitest.config.ts security(cards): fail-secure dev-stub, headers, rate-limit, dsgvo audit 2026-05-12 16:56:03 +02:00