Files
vereinskalender/README.md
2026-01-13 18:08:59 +01:00

3.1 KiB

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

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

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.