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

94 lines
3.1 KiB
Markdown

# 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.