# Domain Management System - Optimierte Architektur

## Übersicht

Dieses optimierte Domain Management System löst die Session-Probleme des aktuellen Systems und bietet eine saubere, wartbare Architektur für Multi-Domain-Anwendungen.

## Hauptprobleme der aktuellen Implementierung

1. **Session-Konflikte**: DomainResolver wird zu früh ausgeführt, bevor die Session-Middleware verfügbar ist
2. **Zwei Sessions**: Dadurch werden zwei separate Sessions erstellt
3. **Komplexe Logik**: Domain-Auflösung und Session-Management sind eng gekoppelt
4. **Performance**: Ineffizientes Caching und wiederholte DB-Abfragen

## Neue Architektur

### Kernkomponenten

```
├── DomainResolver (Middleware) - Reine Domain-Auflösung
├── DomainContext (DTO) - Unveränderlicher Domain-Kontext
├── DomainService - Zentraler Service für Domain-Logik
├── SessionHandler - Event-basiertes Session-Management
├── RouteService - Domain-aware Route-Loading
└── CacheManager - Optimiertes Caching
```

### Middleware-Reihenfolge (Behoben)

```php
'web' => [
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \App\Http\Middleware\DomainResolver::class,        // ✅ Nach Cookies, vor Session
    \Illuminate\Session\Middleware\StartSession::class,
    \App\Http\Middleware\DomainSessionHandler::class,  // ✅ Nach Session-Start
    // ... weitere Middleware
]
```

## Hauptverbesserungen

### 1. Session-Problem gelöst

- **DomainResolver**: Läuft nach Cookie-Encryption, aber vor Session-Start
- **DomainSessionHandler**: Verarbeitet Session-Updates nach Session-Initialisierung
- **Event-basierte Kommunikation**: Domain-Änderungen werden als Events behandelt

### 2. Saubere Trennung der Verantwortlichkeiten

- **DomainResolver**: Nur Domain-Auflösung und Kontext-Erstellung
- **DomainSessionHandler**: Nur Session-Management
- **DomainService**: Reine Geschäftslogik

### 3. Performance-Optimierungen

- **Intelligentes Caching**: Mehrere Cache-Schichten
- **Lazy Loading**: UserShop-Daten werden nur bei Bedarf geladen
- **Batch-Operations**: Mehrere Domain-Validierungen in einem Durchgang

### 4. Domain-Types

```php
enum DomainType: string {
    case MAIN = 'main';           // mivita.care
    case SHOP = 'shop';           // mivita.shop
    case CRM = 'crm';             // my.mivita.care
    case PORTAL = 'portal';       // in.mivita.care
    case CHECKOUT = 'checkout';   // checkout.mivita.care
    case USER_SHOP = 'user-shop'; // {slug}.mivita.care
    case UNKNOWN = 'unknown';
}
```

## Implementierung

### DomainResolver (Neue Middleware)

```php
class DomainResolver
{
    public function handle(Request $request, Closure $next)
    {
        // 1. Domain parsen und Context erstellen
        $context = $this->resolveDomain($request->getHost());

        // 2. Context in Request speichern (nicht Session!)
        $request->merge(['domain_context' => $context]);

        // 3. Session-Domain setzen für Cookies
        $this->setSessionDomain($context);

        // 4. Domain-Changed Event auslösen (falls nötig)
        if ($this->domainChanged($context)) {
            event(new DomainChangedEvent($context));
        }

        return $next($request);
    }
}
```

### DomainSessionHandler (Neue Middleware)

```php
class DomainSessionHandler
{
    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);

        // Session nur updaten, wenn Domain-Context verfügbar
        if ($context = $request->get('domain_context')) {
            $this->updateSessionForDomain($context);
        }

        return $response;
    }

    private function updateSessionForDomain(DomainContext $context): void
    {
        // UserShop in Session setzen/behalten
        if ($context->isUserShop()) {
            Session::put('user_shop', $context->userShop);
            Session::put('user_shop_domain', $context->host);
        }

        // Session-Domain aktualisieren
        Config::set('session.domain', $this->getSessionDomain($context));
    }
}
```

### DomainService (Optimierte Version)

```php
class DomainService
{
    public function resolveDomain(string $host): DomainContext
    {
        // 1. Host normalisieren
        $normalizedHost = $this->normalizeHost($host);

        // 2. Domain-Info parsen
        $domainInfo = $this->parseDomain($normalizedHost);

        // 3. Domain-Type bestimmen
        $type = $this->determineDomainType($domainInfo);

        // 4. UserShop laden (nur bei Bedarf)
        $userShop = $this->loadUserShopIfNeeded($type, $domainInfo);

        return new DomainContext($type, $normalizedHost, $domainInfo['subdomain'], $userShop);
    }

    private function loadUserShopIfNeeded(DomainType $type, array $domainInfo): ?UserShop
    {
        if (!$type->isUserShop()) {
            return null;
        }

        return $this->getUserShop($domainInfo['subdomain']);
    }
}
```

## Migration Guide

### Schritt 1: Neue Dateien hinzufügen

```bash
# Neue Middleware
cp dev/subdomain-optimization-grok/src/Middleware/DomainResolver.php app/Http/Middleware/
cp dev/subdomain-optimization-grok/src/Middleware/DomainSessionHandler.php app/Http/Middleware/

# Neue Services
cp dev/subdomain-optimization-grok/src/Services/DomainService.php app/Services/
cp dev/subdomain-optimization-grok/src/Services/DomainCacheManager.php app/Services/

# Neue Domain-Klassen
cp dev/subdomain-optimization-grok/src/Domain/DomainContext.php app/Domain/
cp dev/subdomain-optimization-grok/src/Domain/DomainType.php app/Domain/
```

### Schritt 2: Kernel.php aktualisieren

```php
'web' => [
    // ... existing middleware ...
    \App\Http\Middleware\DomainResolver::class,        // Nach Cookies
    \Illuminate\Session\Middleware\StartSession::class,
    \App\Http\Middleware\DomainSessionHandler::class,  // Nach Session
    // ... rest of middleware ...
],
```

### Schritt 3: DomainServiceProvider aktualisieren

```php
// Alte DomainResolver-Middleware entfernen
// Neue Services registrieren
```

## Vorteile der neuen Architektur

1. **Session-Konflikte behoben**: Klare Trennung zwischen Domain-Auflösung und Session-Management
2. **Bessere Performance**: Optimiertes Caching und Lazy Loading
3. **Wartbarkeit**: Klare Trennung der Verantwortlichkeiten
4. **Testbarkeit**: Jede Komponente kann isoliert getestet werden
5. **Skalierbarkeit**: Einfache Erweiterung um neue Domain-Types
6. **Event-Driven**: Lose Kopplung durch Events

## Tests

```bash
# Unit Tests
php artisan test tests/Unit/Domain/

# Feature Tests
php artisan test tests/Feature/DomainRouting/

# Integration Tests
php artisan test tests/Feature/SessionDomainSwitching/
```

## Monitoring

Das neue System integriert sich nahtlos mit Laravel's Logging und Monitoring:

```php
// Domain-Resolution Metrics
Log::channel('domain')->info('Domain resolved', [
    'host' => $host,
    'type' => $context->type,
    'resolution_time' => $time,
    'cache_hit' => $cacheHit
]);
```

## Fazit

Diese optimierte Architektur löst alle identifizierten Probleme und bietet eine solide Grundlage für zukünftige Erweiterungen des Domain-Systems.
