Initial commit with inital CMS
This commit is contained in:
+30
@@ -0,0 +1,30 @@
|
||||
# Business Rules — Unit 03: Availability Module
|
||||
|
||||
Dit document beschrijft de functionele logica voor de beschikbaarheidscontrole en de remote shutdown functionaliteit.
|
||||
|
||||
## 1. Beschikbaarheidsstatus (BR-AVAIL-01)
|
||||
|
||||
- **Status Typen**:
|
||||
- `Available`: Het systeem is volledig operationeel.
|
||||
- `Maintenance`: Het systeem is in onderhoud; alleen beheerders hebben toegang.
|
||||
- `Degraded`: Sommige functies zijn beperkt, maar het systeem is in principe bereikbaar.
|
||||
- `NotAvailable`: Het systeem is volledig afgesloten (Remote Shutdown).
|
||||
- **Default (MVP)**: In de MVP versie retourneert de `StubAvailabilityService` altijd `Available`, tenzij handmatig anders geconfigureerd in `appsettings.json`.
|
||||
|
||||
## 2. Remote Shutdown Handhaving (BR-AVAIL-02)
|
||||
|
||||
- **Mechanisme**: Een globale middleware controleert bij elk inkomend request de status via de `IAvailabilityService`.
|
||||
- **Gedrag**:
|
||||
- Als status == `NotAvailable` -> Retourneer `503 Service Unavailable`.
|
||||
- Als status == `Maintenance` -> Blokkeer requests voor reguliere gebruikers; sta alleen toe voor gebruikers met de rol `Owner` of `Administrator`.
|
||||
- **Response**: De response moet het gestandaardiseerde `ApiErrorResponse` formaat gebruiken (U01).
|
||||
|
||||
## 3. Publieke Status (BR-AVAIL-03)
|
||||
|
||||
- **Endpoint**: `GET /api/availability/status` moet voor iedereen bereikbaar zijn (geen authenticatie vereist).
|
||||
- **Informatie**: Het endpoint retourneert de huidige status en een timestamp van de laatste controle.
|
||||
|
||||
## 4. Beheerder Bypass (BR-AVAIL-04)
|
||||
|
||||
- **Rechten**: Gebruikers met de rol `Owner` of `Administrator` kunnen de blokkades van de Availability Middleware omzeilen om onderhoudstaken uit te voeren.
|
||||
- **Identificatie**: De bypass is gebaseerd op de JWT claims (`role`).
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
# Domain Entities — Unit 03: Availability Module
|
||||
|
||||
Dit document beschrijft de data structuren voor de beschikbaarheidsmodule.
|
||||
|
||||
## 1. AvailabilityResponse (DTO)
|
||||
|
||||
Model voor de publieke status check.
|
||||
|
||||
- **Status**: De huidige `AvailabilityStatus` (Enum uit U01).
|
||||
- **CheckedAt**: Tijdstip van de status check.
|
||||
- **Message**: Optionele tekstuele toelichting (bijv. "Onderhoud gepland tot 14:00").
|
||||
|
||||
## 2. AvailabilitySettings (Configuration)
|
||||
|
||||
Model voor de configuratie in `appsettings.json`.
|
||||
|
||||
- **DefaultStatus**: De status die geretourneerd wordt door de stub.
|
||||
- **MaintenanceMessage**: Bericht dat getoond wordt tijdens onderhoud.
|
||||
- **AllowedRolesForMaintenance**: Lijst van rollen die toegang hebben tijdens onderhoud (default: `Owner`, `Administrator`).
|
||||
|
||||
## 3. AvailabilityState (In-Memory)
|
||||
|
||||
Indien we in de MVP de status dynamisch willen kunnen aanpassen zonder restart:
|
||||
|
||||
- **CurrentStatus**: `AvailabilityStatus`.
|
||||
- **StatusChangedAt**: DateTimeOffset.
|
||||
- **Reason**: String.
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
# Business Logic Model — Unit 03: Availability Module
|
||||
|
||||
Dit document beschrijft de processen voor beschikbaarheidscontrole.
|
||||
|
||||
## 1. Availability Middleware Flow
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Inkomend Request] --> B{Is Endpoint /status?}
|
||||
B -- Ja --> C[Laat door naar Controller]
|
||||
B -- Nee --> D{Check Status via IAvailabilityService}
|
||||
D --> E{Status == Available?}
|
||||
E -- Ja --> C
|
||||
E -- Nee --> F{Status == Maintenance?}
|
||||
F -- Ja --> G{Heeft Rol Admin/Owner?}
|
||||
G -- Ja --> C
|
||||
G -- Nee --> H[Retourneer 503 + ApiErrorResponse]
|
||||
F -- Nee --> H
|
||||
```
|
||||
|
||||
## 2. Status Check Flow
|
||||
|
||||
1. **Client** roept `GET /api/availability/status` aan.
|
||||
2. **AvailabilityController** roept `IAvailabilityService.IsAvailableAsync()` aan.
|
||||
3. **Service** haalt status op (in MVP uit config of in-memory state).
|
||||
4. **Controller** bouwt response:
|
||||
```json
|
||||
{
|
||||
"status": "Available",
|
||||
"checkedAt": "2026-06-12T01:15:00Z",
|
||||
"message": "System is running normally."
|
||||
}
|
||||
```
|
||||
|
||||
## 3. Remote Shutdown Logic (Toekomst)
|
||||
|
||||
Hoewel de MVP een stub gebruikt, is het logic model voorbereid op een externe trigger:
|
||||
- Een administratieve actie zet een vlag in de database/cache.
|
||||
- De `IAvailabilityService` detecteert deze wijziging.
|
||||
- De Middleware reageert direct op alle volgende requests.
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
# Controller Design — Unit 03: Availability Module
|
||||
|
||||
Dit document beschrijft de endpoints van de `AvailabilityController`.
|
||||
|
||||
## 1. Publieke Status Endpoint
|
||||
|
||||
- **Method**: `GET`
|
||||
- **Path**: `/api/availability/status`
|
||||
- **Auth**: Geen (AllowAnonymous)
|
||||
- **Response**: `AvailabilityResponse`
|
||||
- **Logic**: Roept `IAvailabilityService.IsAvailableAsync()` aan en mapt de status naar het response object.
|
||||
|
||||
## 2. Status Update Endpoint (Beheer)
|
||||
|
||||
- **Method**: `POST`
|
||||
- **Path**: `/api/availability/admin/status`
|
||||
- **Auth**: `OwnerOnly` Policy (Unit 02)
|
||||
- **Request Body**:
|
||||
```json
|
||||
{
|
||||
"newStatus": "Maintenance",
|
||||
"reason": "Gepland database onderhoud"
|
||||
}
|
||||
```
|
||||
- **Logic**:
|
||||
1. Valideert de nieuwe status.
|
||||
2. Werkt de database record bij via de `IAvailabilityService`.
|
||||
3. Maakt een audit log aan (Unit 02).
|
||||
- **Response**: `200 OK`.
|
||||
|
||||
## 3. Integratie met Audit Log
|
||||
|
||||
Bij elke statuswijziging wordt de `IAuditService` aangeroepen met de volgende gegevens:
|
||||
- **ActorId**: De ID van de Owner.
|
||||
- **Action**: `SystemStatusChanged`.
|
||||
- **Details**: `OldStatus: Available, NewStatus: Maintenance, Reason: ...`
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
# 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.
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
# NFR Requirements — Unit 03: Availability Module
|
||||
|
||||
Dit document specificeert de non-functionele vereisten voor de beschikbaarheidsmodule.
|
||||
|
||||
## 1. Performance (AVAIL-PERF)
|
||||
|
||||
- **AVAIL-PERF-01: Middleware Latency**:
|
||||
- De Availability Middleware mag maximaal 5ms toevoegen aan de totale requestduur.
|
||||
- Dit vereist een geoptimaliseerde database check (indexering op de status tabel).
|
||||
- **AVAIL-PERF-02: Real-time Check**:
|
||||
- Er wordt GEEN caching toegepast in de middleware (conform gebruikerskeuze). Elke request voert een actuele check uit om maximale consistentie te waarborgen.
|
||||
|
||||
## 2. Betrouwbaarheid & Persistentie (AVAIL-REL)
|
||||
|
||||
- **AVAIL-REL-01: Persistent Status**:
|
||||
- De beschikbaarheidsstatus moet in de database worden opgeslagen, zodat deze behouden blijft na een herstart van de applicatie.
|
||||
- **AVAIL-REL-02: Fallback**:
|
||||
- Indien de database onbereikbaar is, moet de `IAvailabilityService` terugvallen op een "Veilige" status (bijv. `Available` of de laatst bekende status in het geheugen) om een lock-out te voorkomen.
|
||||
|
||||
## 3. Beveiliging (AVAIL-SEC)
|
||||
|
||||
- **AVAIL-SEC-01: Access Control**:
|
||||
- Alleen gebruikers met de rol `Owner` kunnen de globale beschikbaarheidsstatus van de API wijzigen via een beveiligd endpoint.
|
||||
- **AVAIL-SEC-02: Maintenance Bypass**:
|
||||
- De bypass voor beheerders (zoals gedefinieerd in Functional Design) moet strikt gecontroleerd worden op basis van JWT claims.
|
||||
|
||||
## 4. Onderhoudbaarheid (AVAIL-MAINT)
|
||||
|
||||
- **AVAIL-MAINT-01: Audit Trail**:
|
||||
- Elke wijziging van de beschikbaarheidsstatus moet worden gelogd in de `AuditLogs` tabel (Unit 02), inclusief de reden en de uitvoerder.
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
# Tech Stack Decisions — Unit 03: Availability Module
|
||||
|
||||
Dit document beschrijft de definitieve technische keuzes voor Unit 03.
|
||||
|
||||
## 1. Opslag (Persistence)
|
||||
|
||||
- **Provider**: Microsoft SQL Server (conform NFR-01).
|
||||
- **Entiteit**: `GlobalAvailabilityState` (Single record).
|
||||
|
||||
## 2. Middleware Implementatie
|
||||
|
||||
- **Type**: Custom Middleware in de `SlpModularCms.Api` (Shell).
|
||||
- **Dependency**: Maakt gebruik van de `IAvailabilityService` uit Unit 01.
|
||||
|
||||
## 3. Interfaces & DI
|
||||
|
||||
- **Service**: `PersistentAvailabilityService` (Implementeert `IAvailabilityService`).
|
||||
- **Lifetime**: `Scoped` (voor database toegang per request).
|
||||
|
||||
## 4. Configuratie
|
||||
|
||||
- **Options Pattern**: Gebruik van `IOptions<AvailabilitySettings>` voor de fallback status en andere drempelwaarden.
|
||||
|
||||
## 5. Monitoring
|
||||
|
||||
- **Logging**: Gebruik van `ILogger` voor het loggen van statuswijzigingen en middleware blokkades (Warning niveau).
|
||||
Reference in New Issue
Block a user