Zum Hauptinhalt springen

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

SymbolBedeutung
CORS *Access-Control-Allow-Origin: * (und typisch OPTIONS) auf GET-Antworten
Kein CORSJSON wird geliefert, Browser-Cross-Origin-Requests von z. B. *.vercel.app schlagen ohne Proxy fehl
AuthEndpunkt erwartet Session / nicht für anonymes Publikum
Prisma CWCenter-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 / FeatureHeutiger Pfad im LoaderDashboard-Pendant (falls vorhanden)
Shop-KategorienGET eigene App → /api/categoriesGET /api/categories
Page Content (u. a. Öffnungszeiten)Prisma pageContentGET /api/centers/[centerId]/page-content
ServicesPrisma serviceGET /api/centers/[centerId]/services
BürosGET eigene App → /api/officesGET /api/offices
Homepage-TilesDashboard …/homepage-tiles
Category-ThemesGET eigene App → /api/category-themesGET /api/centers/[centerId]/category-themes
Office-ThemesGET eigene App → /api/office-themesGET /api/centers/[centerId]/office-themes
Gastronomie-ThemesDashboard …/gastronomy-themes
ShopsGET eigene App → /api/shopsGET /api/centers/[centerId]/shops
Aktuelles (News, Events, Offers, Jobs)Prisma parallelGET …/news, …/events, …/offers, …/jobs
Baustellen-TagebuchGET eigene App → /api/construction-diaryKein dediziertes Dashboard-Äquivalent (siehe P1)
Einzel-AngebotGET eigene App → /api/offers/[id]Nur Listen-Route unter …/offers (siehe P1)
Centerplan / FloorsGET 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-Loader
  • apps/center-website/app/api/categories/route.ts
  • apps/center-website/app/api/shops/route.ts
  • apps/center-website/app/api/aktuelles/route.ts (Client/BFF; Loader nutzt Prisma)
  • apps/center-website/app/api/construction-diary/route.ts
  • apps/center-website/app/api/offers/[id]/route.ts
  • apps/center-website/app/api/centers/centerplan/route.ts
  • apps/center-website/middleware.ts — u. a. GET …/api/centers/by-domain

P0 — Blocker für „nur Dashboard, öffentlich, v0-tauglich“

ThemaDashboard-DateiProblemEmpfehlung
Website-/Template-Konfigurationapps/dashboard/src/app/api/centers/[centerId]/website-config/route.tsGET 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 Contentapps/dashboard/src/app/api/centers/[centerId]/page-content/route.tsGET ohne CORScorsHeaders + OPTIONS wie bei …/shops ergänzen
Shop-Kategorienapps/dashboard/src/app/api/categories/route.tsKein CORS auf GETCORS + OPTIONS ergänzen
Gastronomie-Themesapps/dashboard/src/app/api/centers/[centerId]/gastronomy-themes/route.tsKein CORSCORS + OPTIONS ergänzen
Category-Themesapps/dashboard/src/app/api/centers/[centerId]/category-themes/route.tsKein CORSCORS + OPTIONS ergänzen
Office-Themesapps/dashboard/src/app/api/centers/[centerId]/office-themes/route.tsKein CORSCORS + OPTIONS ergänzen
Wayfinding: Centerplanapps/dashboard/src/app/api/wayfinding/centerplan/route.tsKein CORSCORS + OPTIONS auf GET ergänzen
Wayfinding: Floors (GET)apps/dashboard/src/app/api/wayfinding/floors/route.tsGET ohne CORSCORS + OPTIONS auf GET ergänzen
Wayfinding: Routingapps/dashboard/src/app/api/wayfinding/routing/route.tsPOST ohne CORSWenn vom Browser: CORS + OPTIONS für POST
Eingänge (Centerplan)apps/dashboard/src/app/api/centers/[centerId]/entrances/route.tsKein CORSErgä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)

ThemaCenter-WebsiteDashboardLücke
Baustellen-Tagebuchapp/api/construction-diary/route.tsisConstructionDiary: 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-Angebotapp/api/offers/[id]/route.ts…/[centerId]/offers nur ListeGET für ein Angebot nach id + centerId am Dashboard ergänzen oder ?id= auf Listen-Route
Aktuelles als ein CallLoader: 4× Prisma4× HTTP möglichOptional ein aggregierender Endpunkt (weniger Roundtrips, klarer Vertrag für v0)
Response-ShapesEigene /api-JSON kann von Dashboard-JSON abweichenAPI-Kurzdoku (Markdown/OpenAPI): URLs, Query-Parameter, Beispiel-JSON

P2 — Qualität, Dogfooding, Betrieb

ThemaDatei / OrtEmpfehlung
Loader nur noch über HTTPapps/center-website/lib/server-data-loader.tsSchrittweise Prisma-Reads und Self-fetch auf Dashboard-URLs umstellen (gleiches Verhalten wie externes Frontend)
Rate Limiting / AbuseDashboard Edge/MiddlewareFür neue öffentliche Endpunkte prüfen
Medien-URLsLoader resolveMediaUrlExternes Frontend: gleiche URL-Auflösung dokumentieren oder Dashboard liefert konsistent absolute URLs
SEO / Revalidateapps/center-website/app/api/revalidate/route.tsExterne Sites: eigenes Cache-/Invalidierungskonzept

Kurz-Checkliste für den Product-/Tech-Entscheid

  1. P0: Öffentliche Read-Konfiguration (ohne Session) + CORS auf allen Endpunkten, die der Browser von einer anderen Origin trifft.
  2. P1: Baustellen-Tagebuch + Angebots-Detail + ggf. Aggregat + geschriebener API-Vertrag.
  3. P2: Center-Website auf dieselben URLs umstellen und Betrieb absichern.

Verwandte Pakete / Konfiguration

  • packages/dashboard-api/src/index.tsgetDashboardApiUrl() (Env: DASHBOARD_API_URL, NEXT_PUBLIC_DASHBOARD_URL, NEXT_PUBLIC_API_URL)

Verwandte Doku

Nutzungsstatistik: Seitenaufrufe werden anonymisiert erfasst. Im Umami-Dashboard nach diesem Pfad filtern: /developer-guide/public-center-website-api-gap-analyse