current init
This commit is contained in:
175
CLAUDE.md
Normal file
175
CLAUDE.md
Normal file
@@ -0,0 +1,175 @@
|
||||
# Haushalt — Aufgabenverwaltung
|
||||
|
||||
## Tech-Stack
|
||||
|
||||
| Schicht | Technologie |
|
||||
|---------|------------|
|
||||
| Backend | Symfony 7.4, PHP 8.2+, Doctrine ORM 3.6 |
|
||||
| Frontend Web | Vue 3 (Composition API), Vite 8, Pinia, Vue Router 4 |
|
||||
| Datenbank | MySQL/MariaDB (utf8mb4) |
|
||||
| CORS | Nelmio CORS Bundle |
|
||||
| Umgebung | DDEV |
|
||||
|
||||
## Domain-Modell
|
||||
|
||||
**TaskSchema** — Vorlage/Template für Aufgaben
|
||||
- Felder: name, status, taskType, category, deadline, startDate, endDate, weekdays, monthDays, yearDays
|
||||
- TaskSchemaStatus: Active (`aktiv`), Completed (`erledigt`), Inactive (`inaktiv`)
|
||||
- TaskSchemaType: Single (`einzel`), Daily (`taeglich`), Multi (`multi`), Weekly (`woechentlich`), Monthly (`monatlich`), Yearly (`jaehrlich`)
|
||||
|
||||
**Task** — Einzelne Aufgabe (Instanz eines Schemas)
|
||||
- Felder: schema (FK), name (Override), category (Override), categoryOverridden, date, status, createdAt
|
||||
- TaskStatus: Active (`aktiv`), Completed (`erledigt`)
|
||||
- Kann Name und Kategorie pro Instanz überschreiben (`getEffectiveName()`, `getEffectiveCategory()`)
|
||||
- Unique Constraint: (schema_id, date)
|
||||
|
||||
**Category** — Farbkodierte Kategorie
|
||||
- Felder: id, name, color (Hex #RRGGBB)
|
||||
|
||||
Enum-Case-Namen sind Englisch, String-Werte bleiben Deutsch (in DB gespeichert).
|
||||
|
||||
## Architektur (Backend)
|
||||
|
||||
```
|
||||
Controller → Service (Manager) → Repository → Entity
|
||||
↓
|
||||
DTO (Request/Response)
|
||||
```
|
||||
|
||||
**Prinzipien:**
|
||||
- Controller: nur Routing + Response, keine Geschäftslogik
|
||||
- Manager-Services: Geschäftslogik (CRUD, Validierung, Toggle)
|
||||
- DTOs: typisierter Input (Request) und Output (Response)
|
||||
- Validierung: nur auf Request-DTOs (`#[Assert\...]`), nicht auf Entities
|
||||
- Exceptions: `ValidationException` (eigener Listener), `HttpException` (Symfony built-in)
|
||||
- Entities: nur Doctrine-Mapping + Getter/Setter
|
||||
|
||||
## Verzeichnisstruktur (Backend)
|
||||
|
||||
```
|
||||
backend/src/
|
||||
Controller/Api/
|
||||
CategoryController.php — Category CRUD
|
||||
TaskController.php — Task show/update/delete
|
||||
TaskSchemaController.php — Schema CRUD + week view + toggle
|
||||
DTO/
|
||||
Request/ — CreateSchemaRequest, UpdateSchemaRequest, UpdateTaskRequest,
|
||||
ToggleRequest, CreateCategoryRequest, UpdateCategoryRequest
|
||||
Response/ — TaskResponse, CategoryResponse, WeekViewResponse,
|
||||
DayResponse, ToggleResponse
|
||||
Entity/
|
||||
Category.php, Task.php, TaskSchema.php
|
||||
Enum/
|
||||
TaskStatus.php, TaskSchemaStatus.php, TaskSchemaType.php
|
||||
Exception/
|
||||
ValidationException.php — Wraps ConstraintViolationList, handled by ExceptionListener
|
||||
EventListener/
|
||||
ExceptionListener.php — Fängt ValidationException, erzeugt JSON 422
|
||||
Repository/
|
||||
CategoryRepository.php, TaskRepository.php, TaskSchemaRepository.php
|
||||
Service/
|
||||
CategoryManager.php — Category CRUD-Logik
|
||||
TaskManager.php — Task Update/Delete
|
||||
TaskSchemaManager.php — Schema CRUD + Toggle + Sync-Auslösung
|
||||
TaskGenerator.php — Erzeugt Task-Instanzen für Zeiträume
|
||||
TaskSynchronizer.php — Sync nach Schema-Update (löschen/erstellen/reset)
|
||||
DeadlineCalculator.php — Berechnet Fälligkeitsdaten für ein Schema
|
||||
TaskViewBuilder.php — Baut Wochenansicht + Alle-Aufgaben-View
|
||||
TaskSerializer.php — Task/Category → Response-DTOs
|
||||
```
|
||||
|
||||
## API-Routen
|
||||
|
||||
### Categories (`/api/categories`)
|
||||
```
|
||||
GET / — Alle Kategorien
|
||||
GET /{id} — Einzelne Kategorie
|
||||
POST / — Erstellen
|
||||
PUT /{id} — Aktualisieren
|
||||
DELETE /{id} — Löschen
|
||||
```
|
||||
|
||||
### Schemas (`/api/schemas`)
|
||||
```
|
||||
GET / — Alle Schemas
|
||||
GET /week?start=DATE — Wochenansicht (7 Tage)
|
||||
GET /all — Alle Schemas sortiert
|
||||
GET /all-tasks — Alle Tasks über alle Schemas
|
||||
GET /{id} — Einzelnes Schema
|
||||
POST / — Erstellen
|
||||
PUT /{id} — Aktualisieren (synchronisiert Tasks)
|
||||
DELETE /{id} — Löschen
|
||||
PATCH /{id}/toggle — Task-Status umschalten
|
||||
```
|
||||
|
||||
### Tasks (`/api/tasks`)
|
||||
```
|
||||
GET /{id} — Task-Details
|
||||
PUT /{id} — Task aktualisieren
|
||||
DELETE /{id} — Task löschen
|
||||
```
|
||||
|
||||
## Verzeichnisstruktur (Frontend)
|
||||
|
||||
```
|
||||
frontend/src/
|
||||
views/
|
||||
HomeView.vue — Startseite, Wochenansicht
|
||||
AllTasksView.vue — Übersicht aller Schemas/Tasks
|
||||
SchemaView.vue — Schema erstellen/bearbeiten
|
||||
TaskDetailView.vue — Einzelne Aufgabe bearbeiten
|
||||
CategoriesView.vue — Kategorien verwalten
|
||||
components/
|
||||
TaskCard.vue — Aufgaben-Karte (klickbar zum Toggle)
|
||||
DayColumn.vue — Tages-Spalte in Wochenansicht
|
||||
CategoryBadge.vue — Kategorie-Badge mit Farbe
|
||||
Icon.vue — SVG-Icons (eyeOpen, eyeClosed, plus, arrowLeft, save, trash, edit, close)
|
||||
WeekdayPicker.vue — Wochentag-Auswahl (Mo-So)
|
||||
MonthdayPicker.vue — Monatstag-Auswahl (Kalender-Grid)
|
||||
YearPicker.vue — Jahreskalender-Auswahl
|
||||
router/index.js — Routen mit Breadcrumb-Meta
|
||||
services/api.js — REST-Client (fetch-basiert)
|
||||
stores/categories.js — Pinia Store für Kategorien
|
||||
style.css — Globale Styles, CSS-Variablen, Light/Dark Mode
|
||||
App.vue — Root-Layout mit Breadcrumb-Navigation
|
||||
main.js — Vue-App-Init (Pinia + Router)
|
||||
```
|
||||
|
||||
## Frontend-Routen
|
||||
|
||||
```
|
||||
/ → HomeView (Wochenansicht)
|
||||
/tasks/all → AllTasksView (Übersicht)
|
||||
/tasks/new → SchemaView (Schema erstellen)
|
||||
/tasks/:id → TaskDetailView (Aufgabe bearbeiten)
|
||||
/schemas/:id → SchemaView (Schema bearbeiten)
|
||||
/categories → CategoriesView
|
||||
```
|
||||
|
||||
## Code-Konventionen
|
||||
|
||||
- **Sprache Code**: Englisch (Klassen, Methoden, Variablen, CSS-Klassen)
|
||||
- **Sprache UI**: Deutsch (Labels, Fehlermeldungen, Platzhalter)
|
||||
- **Enum-Werte**: Deutsch in DB (`aktiv`, `erledigt`, `einzel` etc.), Englisch als PHP-Case-Namen (`Active`, `Completed`, `Single`)
|
||||
- **API-Serialisierung**: Symfony Serializer-Groups für Schema/Category Entities (`schema:read`, `schema:write`, `category:read`, `category:write`), TaskSerializer-Service für Tasks
|
||||
- **Validierung**: Auf Request-DTOs, nicht auf Entities
|
||||
- **Error-Handling**: `ValidationException` → ExceptionListener → JSON 422; `HttpException` → Symfony built-in
|
||||
- **Frontend**: Vue 3 Composition API mit `<script setup>`, fetch-basierter API-Client
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
# DDEV starten
|
||||
ddev start
|
||||
|
||||
# Backend
|
||||
ddev exec "cd backend && php bin/console cache:clear"
|
||||
ddev exec "cd backend && php bin/console doctrine:migrations:migrate --no-interaction"
|
||||
|
||||
# Frontend
|
||||
cd frontend && npm run dev
|
||||
|
||||
# URLs
|
||||
Frontend: https://haushalt.ddev.site:5174
|
||||
API: https://haushalt.ddev.site/api
|
||||
```
|
||||
Reference in New Issue
Block a user