6.8 KiB
6.8 KiB
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,einzeletc.), 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
# 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