Status: Entwurf v1 zur direkten Umsetzung Stand: 28.03.2026 Owner: Core Team (Backend + Frontend)
Die bestehende, funktionale Struktur wird schrittweise in klar getrennte Schichten ueberfuehrt:
- Presentation Layer
- PHP API Controller (HTTP Input/Output, Auth-Check, Mapping)
- JS UI Layer (DOM, Window Manager, Renderer-Anbindung)
- Application Layer
- Use Cases / Services pro Kontext
- Orchestrierung von Domain + Repositories
- Domain Layer
- Entitaeten, Value Objects, Domain-Regeln
- Keine HTTP- oder DB-Abhaengigkeit
- Infrastructure Layer
- PDO Repositories, Binary/JSON Decoder, externe Adapter
- Technische Implementierungen hinter Interfaces
Wichtig:
- Keine Big-Bang Migration
- Bestehende Endpoints bleiben stabil
- Strangler Pattern: neu daneben, dann Altpfad ersetzen
- Backend PHP Re-Strukturierung nach Kontexten
- Frontend JS Entkopplung von game.js in Feature-Module
- Einheitliche Fehler- und Response-Struktur
- Testbare Interfaces fuer Kernfluesse
- Vollstaendige Neuimplementierung aller Features
- DB-Schema-Rewrite
- Echtzeit-Transport (SSE/WebSocket)
- Galaxy (hoechster technischer Druck)
- Auth + Session
- Colony Economy (game/buildings/research/shipyard)
- Fleet + Combat
- Messages
- Factions + Leaders
Definiert und verbindlich:
- IdentityContext
- Login, Logout, Session, CSRF, User-Profil
- GalaxyContext
- Stars, Systeme, Cluster, Suchlogik, Systempayload
- ColonyContext
- Ressourcen, Produktion, Buildings, Shipyard, Research
- FleetContext
- Missionen, Flugzeiten, Recall, Combat-Resolution
- DiplomacyContext
- Factions, Standing, Trade Offers, Quests
- MessagingContext
- Inbox, Read, Send, Delete, User Lookup
- SharedKernel
- Error Types, Result Envelope, Time, Validation, IDs
src/ Shared/ Http/ ApiResponse.php ApiError.php RequestContext.php Support/ Clock.php Uuid.php Validator.php Identity/ Domain/ Application/ Infrastructure/ Presentation/ Galaxy/ Domain/ Application/ Infrastructure/ Presentation/ Colony/ Domain/ Application/ Infrastructure/ Presentation/ Fleet/ Domain/ Application/ Infrastructure/ Presentation/ Diplomacy/ Domain/ Application/ Infrastructure/ Presentation/ Messaging/ Domain/ Application/ Infrastructure/ Presentation/
public/api/ auth.php galaxy.php game.php buildings.php research.php shipyard.php fleet.php factions.php leaders.php messages.php
legacy/ api/ engine/
js/ app/ bootstrap.js app-state.js event-bus.js services/ api-client.js network-health.js cache-store.js features/ galaxy/ galaxy-controller.js galaxy-state.js galaxy-service.js galaxy-mappers.js colony/ fleet/ messages/ factions/ renderers/ galaxy3d/ galaxy3d-adapter.js ui/ windows/ components/ legacy/ game-legacy-bridge.js
- api/galaxy.php
- Neu:
- src/Galaxy/Presentation/GalaxyController.php
- src/Galaxy/Application/GetSystemPayloadService.php
- src/Galaxy/Application/GetStarsRangeService.php
- src/Galaxy/Infrastructure/PdoGalaxyRepository.php
- src/Galaxy/Infrastructure/BinarySystemPayloadEncoder.php
- api/auth.php
- Neu:
- src/Identity/Presentation/AuthController.php
- src/Identity/Application/LoginService.php
- src/Identity/Application/RegisterService.php
- src/Identity/Infrastructure/PdoUserRepository.php
- api/game_engine.php
- Neu:
- src/Colony/Domain/ProductionCalculator.php
- src/Fleet/Domain/FlightCalculator.php
- src/Shared/Support/GameConstants.php
- api/game.php + buildings.php + research.php + shipyard.php
- Neu:
- src/Colony/Presentation/ColonyController.php
- src/Colony/Application/*
- src/Colony/Infrastructure/PdoColonyRepository.php
- api/fleet.php
- Neu:
- src/Fleet/Presentation/FleetController.php
- src/Fleet/Application/*
- src/Fleet/Infrastructure/PdoFleetRepository.php
- js/game.js
- Herausziehen nach:
- js/features/galaxy/*
- js/features/colony/*
- js/features/fleet/*
- js/features/messages/*
- js/api.js
- Teilen in:
- js/services/api-client.js
- js/services/request-queue.js
- js/services/network-health.js
- js/galaxy3d.js
- Kapseln hinter:
- js/renderers/galaxy3d/galaxy3d-adapter.js
- Controller duerfen keine SQL-Statements enthalten.
- Application Services duerfen kein DOM und kein HTTP kennen.
- Domain kennt keine PDO- oder Fetch-Objekte.
- Infrastructure implementiert nur Interfaces der Application/Domain.
- Frontend UI darf nie direkt fetch aufrufen; nur ueber Service Layer.
- Jede neue Funktion braucht:
- Input Validation
- Typed Mapping
- Error Mapping
- Testfall mindestens fuer Happy Path + 1 Error Path
Alle Responses folgen einem Envelope:
Success: { "success": true, "data": { ... }, "meta": { "trace_id": "...", "ts": 1710000000000 } }
Error: { "success": false, "error": { "code": "GALAXY_SYSTEM_NOT_FOUND", "message": "System nicht gefunden", "details": { ... } }, "meta": { "trace_id": "...", "ts": 1710000000000 } }
Fehlercodes (Startset):
- AUTH_UNAUTHORIZED
- AUTH_CSRF_INVALID
- VALIDATION_FAILED
- GALAXY_RANGE_INVALID
- GALAXY_SYSTEM_NOT_FOUND
- NETWORK_UNREACHABLE
- INTERNAL_ERROR
Tasks:
- Zielstruktur-Ordner anlegen.
- Gemeinsame Konventionen in Team-Session festlegen.
- API Envelope Utility in Shared erstellen.
- Baseline Regression-Checkliste definieren.
Akzeptanz:
- Shared ApiResponse/ApiError vorhanden.
- Ein Endpoint kann bereits Envelope ausgeben.
Tasks:
- Neuer GalaxyController und Services bauen.
- Bestehende Logik aus api/galaxy.php schrittweise in Service schieben.
- Binary/JSON Ausgabe ueber klaren Adapter.
- Frontend galaxy-service.js erstellt und in game.js ueber Bridge integriert.
Akzeptanz:
- Endpoint-Verhalten unveraendert fuer Consumer.
- Drei Kernflows stabil:
- Sternebereich laden
- Systemdetails laden
- Fehlerfallback bei Timeout
Tasks:
- AuthController + Services.
- Session/CSRF in Shared RequestContext kapseln.
- Einheitliche Auth-Fehlercodes.
Akzeptanz:
- login/me/logout/csrf laufen ueber neue Schicht.
Tasks:
- Produktionslogik aus game_engine in Domain-Kalkulatoren aufteilen.
- colony/buildings/research/shipyard Use Cases trennen.
- Repositories fuer Colony/Queue.
Akzeptanz:
- Overview, Upgrade, Research, Build stabil.
- Kein SQL in Controllern.
Tasks:
- Flight und Combat in Fleet Domain kapseln.
- Send/List/Recall Services.
- Regression fuer Arrival/Recall/Cargo.
Akzeptanz:
- Keine funktionalen Unterschiede fuer Spieler.
Tasks:
- Je Kontext eigener Controller + Service + Repository.
- Frontend Module splitten und game.js weiter entlasten.
Akzeptanz:
- game.js deutlich reduziert.
- Alle bisherigen Fenster funktionieren.
Tasks:
- Nicht mehr genutzte Legacy-Teile markieren.
- Nach 2 stabilen Releases entfernen.
Akzeptanz:
- Legacy-Bridge minimal.
- Architekturregeln in CI verankert.
- A1: ApiResponse Utility erstellen
- Output: src/Shared/Http/ApiResponse.php
- DoD: success/error Envelope + unit test
- A2: ApiError + ErrorCode Registry
- Output: src/Shared/Http/ApiError.php
- DoD: Mapping fuer 7 Start-Fehlercodes
- A3: RequestContext
- Output: src/Shared/Http/RequestContext.php
- DoD: Session user_id, csrf, trace_id
- B1: GalaxyController Skeleton
- B2: GetStarsRangeService
- B3: GetSystemPayloadService
- B4: PdoGalaxyRepository
- B5: Binary Encoder Adapter
- B6: Frontend galaxy-service + Bridge
- B7: E2E Smoke Test
- C1: js/features/galaxy anlegen
- C2: ui event handlers migrieren
- C3: state aus game.js extrahieren
- C4: renderer adapter einfuehren
- Unit
- Domain Calculators (deterministische Inputs/Outputs)
- Error Mapper
- Integration
- Repository gegen Test-DB
- Controller mit Mock RequestContext
- Contract
- Snapshot fuer JSON/Binary Schema (galaxy)
- Unit
- Mapper, Sorter, Filter, Range-Validator
- Integration
- API Client Retry/Timeout/Error classification
- E2E (manuell/automatisiert)
- Login -> Galaxy laden -> System oeffnen -> Fallback bei Netzfehler
- Lint Gate
- PHP CS
- JS Lint
- Test Gate
- Unit + Integration minimum
- Architektur Gate
- Verbotene Imports (z.B. UI -> direkte API intern)
- Verbotene SQL in Presentation Layer
- Release Gate
- Smoke Script erfolgreich
- Risiko: Regressionen durch schrittweises Umbauen
- Gegenmassnahme: Vertical Slices + Feature Flags + Snapshot Tests
- Risiko: Mischzustand zu lange
- Gegenmassnahme: Timebox je Slice, klare Exit-Kriterien
- Risiko: Team driftet von Regeln ab
- Gegenmassnahme: ADRs + CI Architekturregeln
- Risiko: Performance sinkt
- Gegenmassnahme: Metriken vor/nach je Slice (p95, payload size)
Rollout:
- Neuer Slice hinter Config-Flag aktivieren.
- Zuerst lokal/staging, dann produktiv.
- Monitoring fuer Error Rate und p95.
Rollback:
- Flag auf Legacy zurueck.
- Deployment ohne DB-Rollback sofern Schema kompatibel.
Ein Slice gilt als fertig, wenn:
- Alle Endpoints des Slices auf neue Schicht umgestellt sind.
- Keine SQLs in Presentation verbleiben.
- Error Envelope einheitlich.
- Smoke-Flows gruen.
- Dokumentation aktualisiert:
- ARCHITECTURE.md
- ROADMAP.md oder FUTURE_ENHANCEMENTS.md falls relevant
Tag 1-2
- Shared Foundation + Error Envelope
- Architekturregeln als Teamentscheid fixieren
Tag 3-5
- GalaxyController + Service Grundgeruest
- Erster Endpoint ueber neue Schicht
Tag 6-8
- Galaxy Sternebereich + Systempayload migrieren
- Frontend Galaxy Service Bridge anbinden
Tag 9-10
- Tests und Timeout/Fallback-Hardening
- Performance Vergleich alt vs neu
Tag 11-12
- Auth Slice starten
- Session/CSRF Vereinheitlichung
Tag 13-14
- Stabilisierung
- Review + Plan fuer Colony Slice
Fuer jede wichtige Entscheidung ein ADR mit:
- Kontext
- Entscheidung
- Alternativen
- Konsequenzen
Pfadvorschlag:
- docs/adr/ADR-001-error-envelope.md
- docs/adr/ADR-002-galaxy-slice-interfaces.md
Direkt umsetzen in dieser Reihenfolge:
- Shared ApiResponse + ApiError bauen
- GalaxyController Skeleton erstellen
- Eine Route aus api/galaxy.php ueber neuen Service laufen lassen
Wenn diese drei Punkte stehen, ist die Migration praktisch gestartet und messbar.