449 lines
12 KiB
Markdown
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.
|