# Vereinskalender State-of-the-art Kalenderapp fuer Vereine mit Admin-Freigaben, persoenlichen Kalenderansichten und iCal-Export. Die App basiert auf Next.js (App Router), Prisma und NextAuth (Credentials). ## Features - Admins koennen Termine sofort freigeben oder Vorschlaege bestaetigen/ablehnen. - Mitglieder schlagen Termine vor; Freigaben laufen ueber das Admin-Panel. - Mehrere Kalenderansichten (Monat, Woche, Liste) mit FullCalendar. - Eigene Ansichten mit iCal-Abonnement fuer externe Apps (iOS/Android). ## Tech-Stack - Frontend: Next.js 14 (App Router), React 18, Tailwind CSS, FullCalendar - Backend: Next.js Route Handlers, Prisma ORM, SQLite - Auth: NextAuth (Credentials + Prisma Adapter) - Export: iCal via `ical-generator` ## Projektstruktur - `app/` - Routen, Layouts und Seiten - `components/` - UI-Komponenten (Kalender, Admin-Panel, View-Manager) - `app/api/` - API-Routen (Auth, Events, Views, iCal) - `prisma/` - Schema und Migrations - `lib/` - Prisma Client, Auth-Helfer ## Lokale Entwicklung ```bash npm install cp .env.example .env npm run prisma:migrate npm run dev ``` Open `http://localhost:3000`. ## Konfiguration In `.env` (lokal) bzw. per Umgebungsvariablen (Docker/Prod): ``` DATABASE_URL="file:./dev.db" NEXTAUTH_SECRET="replace-with-strong-secret" NEXTAUTH_URL="http://localhost:3000" ADMIN_EMAILS="admin@example.com" ``` ## Admin-Setup `ADMIN_EMAILS` (kommagetrennt) steuert, welche Accounts beim Signup als Admin markiert werden. ## Wichtige Befehle - `npm run dev` - lokale Entwicklung - `npm run build` - Production Build - `npm run start` - Server starten (Production) - `npm run prisma:migrate` - DB Migrationen fuer SQLite (Dev) - `npm run prisma:deploy` - Schema push (Container-Start) - `npm run prisma:studio` - Prisma Studio - `npm run copy:fullcalendar-css` - FullCalendar CSS nach `public/vendor/fullcalendar/` kopieren ## APIs (kurz) - `POST /api/register` - Registrierung - `GET /api/events` - Events (Admins sehen alles, User nur eigene + freigegebene) - `POST /api/events` - Termin vorschlagen/anlegen - `PATCH /api/events/:id` - Freigeben/Ablehnen (Admin) - `GET /api/views` - Eigene Ansichten - `POST /api/views` - Ansicht erstellen - `POST /api/views/:id/items` - Termin zur Ansicht - `DELETE /api/views/:id/items` - Termin entfernen - `GET /api/ical/:token` - iCal Feed der Ansicht ## iCal-Abonnement Unter "Meine Ansichten" wird fuer jede Ansicht eine iCal-URL erzeugt. Diese kann in Kalender-Apps (iOS/Android) abonniert werden. ## Docker ```bash cp .env.example .env docker compose up --build ``` Wichtig fuer persistente Logins: - `NEXTAUTH_SECRET` in `.env` fix setzen (nicht bei jedem Build wechseln). - Die SQLite-DB liegt im `data/`-Volume des Containers und bleibt erhalten. ## Schnellere Builds (Best Practices) - `package-lock.json` committen und im Dockerfile `npm ci` nutzen (bereits vorbereitet). - BuildKit-Cache nutzen (im Dockerfile aktiv, benoetigt Docker BuildKit). - Fuer schnelle lokale Iteration: `docker compose -f docker-compose.dev.yml up --build`. ## Sicherheitshinweise - Keine Secrets committen; `.env` ist in `.dockerignore`. - Fuer Prod echte Secrets und eine externe DB nutzen.