Public Center-Website API — Lückenanalyse & Prioritäten
Stand: Analyse gegen den Code in apps/center-website (v. a. lib/server-data-loader.ts) und apps/dashboard/src/app/api. Ziel: externes Frontend (z. B. v0 + Vercel) kann alle relevanten Reads über https://dashboard.cockpit-os.de (oder konfigurierte DASHBOARD_API_URL) beziehen — ohne Prisma auf der Client-App und ohne Daten-Duplikat.
Legende
| Symbol | Bedeutung |
|---|---|
| CORS * | Access-Control-Allow-Origin: * (und typisch OPTIONS) auf GET-Antworten |
| Kein CORS | JSON wird geliefert, Browser-Cross-Origin-Requests von z. B. *.vercel.app schlagen ohne Proxy fehl |
| Auth | Endpunkt erwartet Session / nicht für anonymes Publikum |
| Prisma CW | Center-Website lädt heute direkt aus der DB oder über eigene /api-Routen derselben App (nicht Dashboard-URL) |
Hinweis: Server-Side Rendering auf Vercel (nur fetch vom Node aus) braucht kein CORS. Sobald die Kollegin Client Components oder Browser-fetch nutzt, sind CORS + OPTIONS auf dem Dashboard nötig.
Quelle der Wahrheit: server-data-loader.ts
| Daten / Feature | Heutiger Pfad im Loader | Dashboard-Pendant (falls vorhanden) |
|---|---|---|
| Shop-Kategorien | GET eigene App → /api/categories | GET /api/categories |
| Page Content (u. a. Öffnungszeiten) | Prisma pageContent | GET /api/centers/[centerId]/page-content |
| Services | Prisma service | GET /api/centers/[centerId]/services |
| Büros | GET eigene App → /api/offices | GET /api/offices |
| Homepage-Tiles | Dashboard …/homepage-tiles | ✅ |
| Category-Themes | GET eigene App → /api/category-themes | GET /api/centers/[centerId]/category-themes |
| Office-Themes | GET eigene App → /api/office-themes | GET /api/centers/[centerId]/office-themes |
| Gastronomie-Themes | Dashboard …/gastronomy-themes | ✅ |
| Shops | GET eigene App → /api/shops | GET /api/centers/[centerId]/shops |
| Aktuelles (News, Events, Offers, Jobs) | Prisma parallel | GET …/news, …/events, …/offers, …/jobs |
| Baustellen-Tagebuch | GET eigene App → /api/construction-diary | Kein dediziertes Dashboard-Äquivalent (siehe P1) |
| Einzel-Angebot | GET eigene App → /api/offers/[id] | Nur Listen-Route unter …/offers (siehe P1) |
| Centerplan / Floors | GET eigene App → /api/centers/centerplan (proxy) | GET /api/wayfinding/centerplan, GET /api/wayfinding/floors |
Zugehörige Dateien (Center-Website):
apps/center-website/lib/server-data-loader.ts— Haupt-Loaderapps/center-website/app/api/categories/route.tsapps/center-website/app/api/shops/route.tsapps/center-website/app/api/aktuelles/route.ts(Client/BFF; Loader nutzt Prisma)apps/center-website/app/api/construction-diary/route.tsapps/center-website/app/api/offers/[id]/route.tsapps/center-website/app/api/centers/centerplan/route.tsapps/center-website/middleware.ts— u. a.GET …/api/centers/by-domain
P0 — Blocker für „nur Dashboard, öffentlich, v0-tauglich“
| Thema | Dashboard-Datei | Problem | Empfehlung |
|---|---|---|---|
| Website-/Template-Konfiguration | apps/dashboard/src/app/api/centers/[centerId]/website-config/route.ts | GET ist auth-pflichtig (getServerSession, 401 ohne Login) | Neuen read-only, öffentlichen Endpunkt definieren (nur feldsicheres Payload für die Besucherseite), oder dokumentiertes Bündel aus vorhandenen öffentlichen Routen (by-slug, theme-config, …), falls ausreichend |
| Page Content | apps/dashboard/src/app/api/centers/[centerId]/page-content/route.ts | GET ohne CORS | corsHeaders + OPTIONS wie bei …/shops ergänzen |
| Shop-Kategorien | apps/dashboard/src/app/api/categories/route.ts | Kein CORS auf GET | CORS + OPTIONS ergänzen |
| Gastronomie-Themes | apps/dashboard/src/app/api/centers/[centerId]/gastronomy-themes/route.ts | Kein CORS | CORS + OPTIONS ergänzen |
| Category-Themes | apps/dashboard/src/app/api/centers/[centerId]/category-themes/route.ts | Kein CORS | CORS + OPTIONS ergänzen |
| Office-Themes | apps/dashboard/src/app/api/centers/[centerId]/office-themes/route.ts | Kein CORS | CORS + OPTIONS ergänzen |
| Wayfinding: Centerplan | apps/dashboard/src/app/api/wayfinding/centerplan/route.ts | Kein CORS | CORS + OPTIONS auf GET ergänzen |
| Wayfinding: Floors (GET) | apps/dashboard/src/app/api/wayfinding/floors/route.ts | GET ohne CORS | CORS + OPTIONS auf GET ergänzen |
| Wayfinding: Routing | apps/dashboard/src/app/api/wayfinding/routing/route.ts | POST ohne CORS | Wenn vom Browser: CORS + OPTIONS für POST |
| Eingänge (Centerplan) | apps/dashboard/src/app/api/centers/[centerId]/entrances/route.ts | Kein CORS | Ergänzen, falls Client-seitig genutzt |
Bereits mit CORS * (Referenz): u. a. …/[centerId]/shops, news, events, offers, jobs, services, homepage-tiles, by-slug/[slug], by-slug/[slug]/theme-config, by-domain, offices — jeweils route.ts unter apps/dashboard/src/app/api/….
P1 — Fehlende Parität oder Filter (Backend + Doku)
| Thema | Center-Website | Dashboard | Lücke |
|---|---|---|---|
| Baustellen-Tagebuch | app/api/construction-diary/route.ts — isConstructionDiary: true, Datumsfilter | …/news mit ?category= | Kein Query für isConstructionDiary; ggf. neuer Query-Parameter constructionDiary=true oder eigene schlanke GET-Route unter …/centers/[id]/construction-diary |
| Einzel-Angebot | app/api/offers/[id]/route.ts | …/[centerId]/offers nur Liste | GET für ein Angebot nach id + centerId am Dashboard ergänzen oder ?id= auf Listen-Route |
| Aktuelles als ein Call | Loader: 4× Prisma | 4× HTTP möglich | Optional ein aggregierender Endpunkt (weniger Roundtrips, klarer Vertrag für v0) |
| Response-Shapes | Eigene /api-JSON kann von Dashboard-JSON abweichen | — | API-Kurzdoku (Markdown/OpenAPI): URLs, Query-Parameter, Beispiel-JSON |
P2 — Qualität, Dogfooding, Betrieb
| Thema | Datei / Ort | Empfehlung |
|---|---|---|
| Loader nur noch über HTTP | apps/center-website/lib/server-data-loader.ts | Schrittweise Prisma-Reads und Self-fetch auf Dashboard-URLs umstellen (gleiches Verhalten wie externes Frontend) |
| Rate Limiting / Abuse | Dashboard Edge/Middleware | Für neue öffentliche Endpunkte prüfen |
| Medien-URLs | Loader resolveMediaUrl | Externes Frontend: gleiche URL-Auflösung dokumentieren oder Dashboard liefert konsistent absolute URLs |
| SEO / Revalidate | apps/center-website/app/api/revalidate/route.ts | Externe Sites: eigenes Cache-/Invalidierungskonzept |
Kurz-Checkliste für den Product-/Tech-Entscheid
- P0: Öffentliche Read-Konfiguration (ohne Session) + CORS auf allen Endpunkten, die der Browser von einer anderen Origin trifft.
- P1: Baustellen-Tagebuch + Angebots-Detail + ggf. Aggregat + geschriebener API-Vertrag.
- P2: Center-Website auf dieselben URLs umstellen und Betrieb absichern.
Verwandte Pakete / Konfiguration
packages/dashboard-api/src/index.ts—getDashboardApiUrl()(Env:DASHBOARD_API_URL,NEXT_PUBLIC_DASHBOARD_URL,NEXT_PUBLIC_API_URL)
Verwandte Doku
- Public Center-Website API — Vertrag (Read) — URLs, Parameter, Beispiel-JSON, v0-Prompt
Nutzungsstatistik: Seitenaufrufe werden anonymisiert erfasst. Im Umami-Dashboard nach diesem Pfad filtern: /en/developer-guide/public-center-website-api-gap-analyse