taskmanager/README.md
2025-11-12 17:16:01 +01:00

449 lines
12 KiB
Markdown

# Aufgabenplaner
Ein modernes Task-Management-System gebaut mit Next.js 14, TypeScript, Prisma, PostgreSQL und NextAuth.js.
## Features
- ✅ **Rollenbasierte Zugriffskontrolle**: BEARBEITER, PFLEGER, VORGESETZTER, ADMIN
- ✅ **Task-Management**: Erstellen, Bearbeiten, Löschen von Aufgaben
- ✅ **Kommentare**: Kommunikation zu Aufgaben
- ✅ **Datei-Uploads**: Anhänge zu Aufgaben (PDF, JPG, PNG, DOCX, XLSX)
- ✅ **Kalender-Ansicht**: Visualisierung der Aufgaben mit react-big-calendar
- ✅ **Benutzerverwaltung**: Verwaltung von Benutzern (nur VORGESETZTER & ADMIN)
- ✅ **Dark/Light Mode**: Theme-Unterstützung
- ✅ **Responsive Design**: Desktop & Mobile optimiert
- ✅ **shadcn/ui Components**: Moderne UI-Komponenten
## Tech Stack
- **Framework**: Next.js 14 (App Router)
- **Sprache**: TypeScript
- **Datenbank**: PostgreSQL
- **ORM**: Prisma
- **Authentifizierung**: NextAuth.js
- **UI**: shadcn/ui + Tailwind CSS
- **Animationen**: Framer Motion
- **Formulare**: React Hook Form + Zod
- **State Management**: TanStack Query
- **Kalender**: react-big-calendar
## Voraussetzungen
- Node.js 20 oder höher
- PostgreSQL 15 oder höher (oder Docker)
- npm oder yarn
## Lokale Entwicklung
### 1. Repository klonen und Dependencies installieren
```bash
# Dependencies installieren
npm install
```
### 2. Environment Variables einrichten
Erstelle eine `.env` Datei im Root-Verzeichnis:
```env
DATABASE_URL="postgresql://user:password@localhost:5432/aufgabenplaner_db"
NEXTAUTH_SECRET="dein-geheimer-schluessel-hier"
NEXTAUTH_URL="http://localhost:3000"
```
Generiere `NEXTAUTH_SECRET`:
```bash
openssl rand -base64 32
```
### 3. Datenbank Setup
```bash
# Prisma Client generieren
npx prisma generate
# Datenbank-Migrationen ausführen
npx prisma migrate dev
# Datenbank mit Beispieldaten füllen
npx prisma db seed
```
### 4. Development Server starten
```bash
npm run dev
```
Die Anwendung läuft nun auf [http://localhost:3000](http://localhost:3000)
### Standard-Zugangsdaten
Nach dem Seeding ist folgender Admin-Account verfügbar:
- **Email**: admin@taskmanager.de
- **Passwort**: admin123
⚠️ **Wichtig**: Ändern Sie diese Zugangsdaten in Production!
## Production Deployment mit Docker
### 1. Environment Variables vorbereiten
```bash
# Template kopieren
cp .env.production.example .env.production
# .env.production bearbeiten und folgende Werte anpassen:
# - DB_PASSWORD: Sicheres Passwort für PostgreSQL
# - NEXTAUTH_SECRET: Generieren mit openssl rand -base64 32
# - NEXTAUTH_URL: Deine Production URL (z.B. https://aufgabenplaner.example.com)
```
### 2. Container bauen und starten
```bash
# Container im Hintergrund starten
docker-compose up -d
# Logs anschauen
docker-compose logs -f app
```
### 3. Datenbank initialisieren
```bash
# Migrations ausführen
docker-compose exec app npx prisma migrate deploy
# Datenbank seeden (erstellt Admin-User)
docker-compose exec app npx prisma db seed
```
Die Anwendung läuft nun auf [http://localhost:3000](http://localhost:3000)
### Container-Management
```bash
# Container stoppen
docker-compose down
# Container stoppen und Volumes löschen (⚠️ löscht alle Daten!)
docker-compose down -v
# Container neu bauen
docker-compose build --no-cache
# Logs anschauen
docker-compose logs -f app
docker-compose logs -f db
# Shell im Container öffnen
docker-compose exec app sh
```
## Prisma Studio
Prisma Studio ist ein visuelles Tool zur Verwaltung der Datenbank:
```bash
# Lokal
npx prisma studio
# In Docker
docker-compose exec app npx prisma studio
```
Studio läuft auf [http://localhost:5555](http://localhost:5555)
## Datenbank-Migrations
### Neue Migration erstellen
```bash
# Lokal
npx prisma migrate dev --name migration_name
# In Docker (nicht empfohlen, besser lokal entwickeln)
docker-compose exec app npx prisma migrate dev --name migration_name
```
### Migrations in Production anwenden
```bash
docker-compose exec app npx prisma migrate deploy
```
## Projekt-Struktur
```
src/
├── app/ # Next.js App Router
│ ├── (auth)/ # Auth-Gruppe (Login)
│ ├── (dashboard)/ # Dashboard-Gruppe (protected)
│ │ ├── page.tsx # Dashboard Startseite
│ │ ├── tasks/ # Aufgaben-Seiten
│ │ ├── calendar/ # Kalender-Seite
│ │ └── users/ # Benutzerverwaltung
│ └── api/ # API Routes
│ ├── auth/ # NextAuth API
│ ├── tasks/ # Task CRUD
│ └── users/ # User CRUD
├── components/ # React Komponenten
│ ├── calendar/ # Kalender-Komponenten
│ ├── layout/ # Layout-Komponenten
│ ├── shared/ # Gemeinsame Komponenten
│ ├── tasks/ # Task-Komponenten
│ ├── ui/ # shadcn/ui Komponenten
│ └── users/ # User-Komponenten
├── hooks/ # Custom React Hooks
├── lib/ # Utility-Funktionen
│ ├── auth.ts # NextAuth Konfiguration
│ ├── permissions.ts # Permission-System
│ ├── prisma.ts # Prisma Client
│ └── validations/ # Zod Schemas
├── types/ # TypeScript Types
└── middleware.ts # Next.js Middleware (Auth & Permissions)
prisma/
├── schema.prisma # Datenbank-Schema
└── seed.ts # Seed-Daten
```
## Berechtigungssystem
### Rollen
1. **BEARBEITER**: Kann nur eigene zugewiesene Aufgaben sehen und Status ändern
2. **PFLEGER**: Kann alle Aufgaben sehen, erstellen, bearbeiten und löschen
3. **VORGESETZTER**: Wie PFLEGER + Benutzerverwaltung
4. **ADMIN**: Volle Berechtigung + Benutzer löschen
### Benutzerrollen im Detail
#### Bearbeiter
- Kann nur **zugewiesene Aufgaben** sehen (keine Übersicht aller Aufgaben)
- Kann **Status eigener Aufgaben** ändern (UNERLEDIGT → IN_BEARBEITUNG → ERLEDIGT)
- Kann **Kommentare** zu eigenen Aufgaben schreiben
- Kann **Dateien** zu eigenen Aufgaben hochladen
- **Kein Zugriff** auf:
- Aufgaben erstellen
- Aufgaben bearbeiten (außer Status)
- Aufgaben löschen
- Benutzerverwaltung
#### Pfleger
- Kann **alle Aufgaben** sehen (Dashboard-Übersicht)
- Kann **Aufgaben erstellen** und allen Benutzern zuweisen
- Kann **Aufgaben bearbeiten** (Ort, Beschreibung, Frist, Zuständigkeit, Status)
- Kann **Aufgaben löschen**
- Kann **Kommentare** schreiben
- Kann **Dateien** hochladen
- **Kein Zugriff** auf:
- Benutzerverwaltung
#### Vorgesetzter
- **Alle Rechte von Pfleger**
- Kann **Benutzerverwaltung** aufrufen
- Kann **neue Benutzer** anlegen
- Kann **Benutzer bearbeiten** (Name, Email, Passwort, Rolle)
- **Kein Zugriff** auf:
- Benutzer löschen
#### Admin
- **Alle Rechte von Vorgesetzter**
- Kann **Benutzer löschen**
- Hat **volle System-Rechte**
### Berechtigungen
| Aktion | BEARBEITER | PFLEGER | VORGESETZTER | ADMIN |
|--------|------------|---------|--------------|-------|
| Eigene Tasks sehen | ✅ | ✅ | ✅ | ✅ |
| Alle Tasks sehen | ❌ | ✅ | ✅ | ✅ |
| Task erstellen | ❌ | ✅ | ✅ | ✅ |
| Task bearbeiten | ❌ | ✅ | ✅ | ✅ |
| Task-Status ändern | ✅ | ✅ | ✅ | ✅ |
| Task löschen | ❌ | ✅ | ✅ | ✅ |
| Kommentare hinzufügen | ✅ | ✅ | ✅ | ✅ |
| Dateien hochladen | ✅ | ✅ | ✅ | ✅ |
| Benutzer verwalten | ❌ | ❌ | ✅ | ✅ |
| Benutzer löschen | ❌ | ❌ | ❌ | ✅ |
## Sicherheit
- ✅ Passwörter werden mit bcrypt gehashed (12 Rounds)
- ✅ JWT-basierte Session mit NextAuth.js
- ✅ CSRF-Schutz durch NextAuth.js
- ✅ Role-basierte Zugriffskontrolle auf API- und UI-Ebene
- ✅ Input-Validierung mit Zod
- ✅ SQL-Injection-Schutz durch Prisma
- ✅ XSS-Schutz durch React
- ✅ File-Upload-Validierung (Dateityp & Größe)
## Performance-Optimierungen
- ✅ Server-Side Rendering (SSR)
- ✅ Static Site Generation (SSG) wo möglich
- ✅ Optimistic Updates mit TanStack Query
- ✅ Image Optimization mit next/image
- ✅ Code Splitting
- ✅ Database Indexing (Prisma)
- ✅ Standalone Output für Docker (minimale Image-Größe)
## Error Handling & Loading States
### Error Boundaries
Die Anwendung verwendet Next.js Error Boundaries für robuste Fehlerbehandlung:
- **Global Error Boundary** (`app/error.tsx`): Fängt unerwartete Fehler auf
- **404 Page** (`app/not-found.tsx`): Zeigt freundliche Fehlerseite für nicht gefundene Routen
- **Toast Notifications**: Benutzerfreundliche Fehler- und Erfolgsmeldungen mit sonner
### Loading States
Skeleton Components sorgen für bessere UX während Ladezeiten:
- **Global Loading** (`app/loading.tsx`): Layout-Skeleton mit Header, Sidebar, Content
- **Task List Loading** (`app/(dashboard)/tasks/loading.tsx`): TaskListSkeleton
- **Task Detail Loading** (`app/(dashboard)/tasks/[id]/loading.tsx`): TaskDetailSkeleton
- **Calendar Loading** (`app/(dashboard)/calendar/loading.tsx`): CalendarSkeleton
### File Upload Validation
- **Max Dateigröße**: 10MB
- **Erlaubte Typen**: PDF, JPG, PNG, DOCX, XLSX
- **Filename Sanitization**: Entfernt gefährliche Zeichen
- **Client & Server Validierung**: Doppelte Absicherung
## Testing Checklist
### Authentifizierung
- [ ] Login funktioniert mit korrekten Credentials
- [ ] Login schlägt fehl mit falschen Credentials
- [ ] Logout funktioniert und leitet zu Login weiter
- [ ] Session bleibt erhalten beim Reload
- [ ] Nicht-authentifizierte Benutzer werden zu /login weitergeleitet
### Rollenbasierte Berechtigungen
- [ ] **Bearbeiter** sieht nur zugewiesene Aufgaben
- [ ] **Bearbeiter** kann nur Status ändern (keine vollständige Bearbeitung)
- [ ] **Pfleger** sieht alle Aufgaben
- [ ] **Pfleger** kann Aufgaben erstellen, bearbeiten, löschen
- [ ] **Vorgesetzter** hat Zugriff auf Benutzerverwaltung
- [ ] **Vorgesetzter** kann Benutzer erstellen und bearbeiten (nicht löschen)
- [ ] **Admin** kann Benutzer löschen
- [ ] Middleware blockiert unautorisierte Zugriffe auf /users
### Task Management
- [ ] **Erstellen**: Neue Tasks können erstellt werden (Pfleger+)
- [ ] **Ansehen**: Tasks werden korrekt angezeigt
- [ ] **Bearbeiten**: Task-Details können geändert werden (Pfleger+)
- [ ] **Status ändern**: Status kann geändert werden (alle Rollen)
- [ ] **Löschen**: Tasks können gelöscht werden (Pfleger+)
- [ ] **Überfällige Tasks**: Werden rot markiert bei überschrittener Frist
### Kommentare
- [ ] Kommentare können hinzugefügt werden
- [ ] Kommentare werden mit Avatar und Timestamp angezeigt
- [ ] Relative Zeitangaben (z.B. "vor 3 Stunden") funktionieren
### File Upload
- [ ] Dateien können hochgeladen werden
- [ ] Validierung funktioniert (Dateityp, Größe)
- [ ] Dateien werden korrekt angezeigt
- [ ] Download-Links funktionieren
- [ ] Fehlermeldungen bei ungültigen Dateien
### Kalender
- [ ] Tasks werden im Kalender angezeigt
- [ ] Status-Farben sind korrekt (Rot/Gelb/Grün)
- [ ] Filter nach Status funktioniert
- [ ] Filter nach Zuständigkeit funktioniert
- [ ] Click auf Event öffnet Task-Detail-Dialog
- [ ] Navigation zur Task-Detailseite funktioniert
### Benutzerverwaltung
- [ ] Benutzerliste wird angezeigt (nur für Vorgesetzte/Admins)
- [ ] Neue Benutzer können erstellt werden
- [ ] Benutzer können bearbeitet werden
- [ ] Benutzer können gelöscht werden (nur Admin)
- [ ] E-Mail-Duplikate werden verhindert
- [ ] Passwort wird korrekt gehashed
### Responsive Design
- [ ] Desktop: Sidebar links, Content rechts
- [ ] Mobile: Sheet Sidebar, Hamburger Menu
- [ ] Alle Seiten sind mobile-optimiert
- [ ] Touch-Gesten funktionieren
### Dark/Light Mode
- [ ] Theme-Toggle funktioniert
- [ ] Theme bleibt erhalten beim Reload
- [ ] Alle Komponenten sind in beiden Modi lesbar
### Loading & Error States
- [ ] Loading Skeletons werden angezeigt
- [ ] Error Boundaries fangen Fehler ab
- [ ] 404 Page wird bei ungültigen Routes angezeigt
- [ ] Toast Notifications zeigen Fehler/Erfolg
## Troubleshooting
### Datenbank-Verbindungsfehler
```bash
# Prüfe ob PostgreSQL läuft
docker-compose ps
# Prüfe Logs
docker-compose logs db
# Restart Container
docker-compose restart db
```
### Migration-Fehler
```bash
# Reset Datenbank (⚠️ löscht alle Daten!)
npx prisma migrate reset
# Oder in Docker:
docker-compose exec app npx prisma migrate reset
```
### Port bereits belegt
```bash
# Port 3000 oder 5432 bereits belegt?
# Ändere die Ports in docker-compose.yml:
ports:
- "3001:3000" # Für App
- "5433:5432" # Für DB
```
## Lizenz
Dieses Projekt ist für interne Nutzung bestimmt.
## Support
Bei Fragen oder Problemen öffne ein Issue im Repository.