Skip to content

feat: Events module (Spec 2) — multistage timetable, pricing & homepage coupling#1

Open
mrwind-up-bird wants to merge 30 commits into
mainfrom
feat/events-module
Open

feat: Events module (Spec 2) — multistage timetable, pricing & homepage coupling#1
mrwind-up-bird wants to merge 30 commits into
mainfrom
feat/events-module

Conversation

@mrwind-up-bird

Copy link
Copy Markdown
Contributor

Summary

New tenant-scoped Events module for e-Ventschau, mirroring the shipped Artist module.

  • Data model: Event + nested Stage / Appearance / PriceTier — role-as-edge timetable, artist-link XOR free-text slots, display-only price tiers (cascade deletes, scoped @@unique([tenantId, slug])).
  • Public: /events list + /events/[slug] detail with a responsive timetable (desktop Bühne×Zeit grid + mobile agenda), line-up, prices, and MusicEvent JSON-LD. Artist "Auftritte" section wired up. /programm-2026 → 308 redirect to the canonical event. Events added to the sitemap.
  • Admin (/admin/events): list with status-checked publish/feature toggles, create, and a full edit page (Plate description, Cloudinary hero picker, SEO meta, stage manager + timetable builder via granular sub-resource endpoints, price-tier editor).
  • API security: role-gated (ADMIN/SUPER_ADMIN), fetch-then-tenant-check IDOR guards on every [id]/sub-resource, explicit PUT field-allowlists (no body spread), cross-tenant artist-link guard, price-tier replace-all in a single $transaction.
  • Homepage coupling: line-up now derives from the featured event (single source of truth); the hardcoded array is gone and the "Programm" links repoint to the canonical event.
  • Correctness: all dates/times render in Europe/Berlin. Idempotent seed of the e-Ventschau 2026 festival (2 stages, 10 appearances, 4 price tiers).
  • DRY: shared slug/URL validators extracted to src/lib/slug.ts (re-exported from artist-validation.ts, zero breakage).

Test Plan

  • npx tsc --noEmit clean
  • npm run build succeeds (54 pages)
  • Pure-validator tests pass (slug, event-validation via tsx, incl. umlaut/Nordic slug + XOR/time-order/currency invariants)
  • Seed runs and is idempotent (2/10/4 counts stable on re-seed)
  • Runtime smoke: /events, /events/e-ventschau-2026, /programm-2026 (308→canonical), homepage line-up, /kuenstler/rovar Auftritte all render
  • Adversarial review pass — fixed two data-loss bugs (timetable note, premature-save blanking) + admin load status-checks + SEO meta inputs
  • Manual admin walkthrough: create → edit → stages/slots/tiers → publish → verify public
  • Artist hero photos (follow-up, in progress)

🤖 Generated with Claude Code

mrwind-up-bird and others added 29 commits June 15, 2026 14:20
Multistage timetable, artist-or-free-text appearance slots (role-as-edge),
display-only price tiers (category + early-bird windows), and homepage
line-up coupled to the main event's appearances. Builds on Spec 1 (Artist).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rds)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
e-ventschau Ready Ready Preview, Comment Jun 17, 2026 4:03pm

Replaces the ♪ placeholder on all 7 line-up artists with their official
festival photos (hosted on e-ventschau.de, an allowed next/image host).
Set in both upsert create+update so existing rows update on re-seed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant