# Middleware Design — Unit 03: Availability Module Dit document beschrijft de technische implementatie van de Availability Middleware. ## 1. Middleware Registratie De middleware wordt in de `Program.cs` van de API Shell (U04) geregistreerd: ```csharp app.UseExceptionHandler(); // Eerst de exception handler (U01) app.UseAvailability(); // Daarna de availability check // ... andere middleware (Auth, Routing, etc) ``` ## 2. AvailabilityMiddleware Logica - **Bypass voor Status Endpoint**: Het pad `/api/availability/status` wordt altijd doorgelaten zonder check. - **Check Fase**: - De middleware roept `IAvailabilityService.IsAvailableAsync()` aan. - Indien status == `Available` -> `_next(context)`. - **Bypass voor Admins/Owners**: - Indien status == `Maintenance` of `NotAvailable`: - De middleware inspecteert het JWT token in de `Authorization` header handmatig (omdat de globale Authentication middleware nog niet is uitgevoerd op dit punt). - Indien de claim `role` gelijk is aan `Owner` of `Administrator` -> `_next(context)`. - Anders -> Retourneer `503 Service Unavailable` met `ApiErrorResponse`. ## 3. PersistentAvailabilityService Implementatie van de interface uit Unit 01. - **Database Opslag**: Maakt gebruik van de `ApplicationDbContext` (Unit 02). - **Circuit Breaker**: - Houdt in een statische variabele de `_lastErrorTime` en `_cachedStatus` bij. - Indien `DateTimeOffset.UtcNow - _lastErrorTime < 30 seconden` -> Retourneer de `_cachedStatus` (default: `Available`) zonder de database te pollen. - **Logging**: Elke blokkade wordt gelogd met het IP-adres van de client en het gevraagde pad.