ARCHITECTURE.md
Doel
SimpleHealthMonitor is een Joomla System Plugin voor het bewaken van de technische gezondheid van een Joomla-website.
De plugin voert zelfstandig een aantal health checks uit, berekent een Health Score en stelt een JSON-endpoint beschikbaar voor externe monitoringdiensten.
Architectuuroverzicht
Frontend Request
│
▼
SimpleHealthMonitor Plugin
│
▼
HealthService
│
┌───────────────┼───────────────┐
▼ ▼ ▼
ContentCheck MailCheck SchedulerCheck
│ │ │
└───────────────┼───────────────┘
▼
HealthResult[]
│
▼
HealthStatus
│
┌─────────────┴─────────────┐
▼ ▼
Backend presentatie JSON Endpoint
De plugin bestaat uit een kleine set duidelijk gescheiden componenten. Iedere laag heeft een eigen verantwoordelijkheid en kent uitsluitend de componenten die noodzakelijk zijn voor haar taak.
Architectuurprincipes
Business First
Alle businesslogica bevindt zich binnen de plugin.
De businesslaag bepaalt:
- welke controles worden uitgevoerd;
- hoe de Health Score wordt berekend;
- wanneer een website als gezond of ongezond wordt beschouwd;
- welke informatie aan de beheerder of een monitoringdienst wordt geleverd.
Joomla First
SimpleHealthMonitor volgt zoveel mogelijk de architectuur en conventies van Joomla.
Waar Joomla bestaande voorzieningen biedt, worden deze gebruikt.
Voorbeelden hiervan zijn:
- Plugin Events;
- HTTP Client;
- Registry;
- Language API;
- Plugin Parameters;
- Installer Script.
Administrator First
De configuratie van SimpleHealthMonitor is geschreven voor websitebeheerders.
Technische implementatiedetails blijven zoveel mogelijk verborgen.
Instellingen zijn begrijpelijk zonder kennis van de interne architectuur of de gebruikte Joomla API's.
Hierdoor blijft de plugin eenvoudig te configureren zonder afbreuk te doen aan de onderliggende architectuur.
Constructor Injection
Waar Joomla dit op een natuurlijke wijze ondersteunt, worden afhankelijkheden via Constructor Injection aangeboden.
Wanneer dit de architectuur niet vereenvoudigt of Joomla hiervoor geen duidelijke ondersteuning biedt, wordt bewust gekozen voor een eenvoudige implementatie volgens het KISS-principe.
Resultaatgestuurd ontwerp
Iedere health check retourneert een uniform HealthResult.
Presentatielagen interpreteren uitsluitend dit resultaat en bevatten geen businesslogica.
Hierdoor kunnen backendpresentatie en JSON-uitvoer dezelfde businessresultaten gebruiken zonder duplicatie.
Geen database-afhankelijkheid
De plugin maakt geen eigen databasetabellen aan.
Alle configuratie wordt opgeslagen in de pluginparameters (#__extensions.params).
De plugin blijft hierdoor volledig zelfstandig en eenvoudig te installeren of verwijderen.
Hoofdcomponenten
System Plugin
De Joomla System Plugin vormt het startpunt van de extensie.
Verantwoordelijkheden:
- afhandelen van het health endpoint;
- tokenvalidatie;
- uitvoeren van de HealthService;
- bepalen van de HTTP-statuscode;
- retourneren van JSON.
De plugin bevat geen businesslogica rondom health checks.
HealthService
HealthService vormt de centrale orchestrator van de businesslaag.
Verantwoordelijkheden:
- uitvoeren van alle beschikbare health checks;
- verzamelen van alle
HealthResult-objecten; - berekenen van de totale Health Score;
- bepalen van de algemene healthstatus;
- retourneren van een
HealthStatus.
HealthService kent uitsluitend de uitvoering van de checks en bevat geen kennis over HTML, JSON of HTTP.
Health Checks
Iedere health check heeft exact één verantwoordelijkheid.
De plugin bevat de volgende health checks:
- Content Check
- Mail Check
- Scheduler Check
Iedere check:
- voert zelfstandig zijn controle uit;
- bepaalt zelfstandig de penalty;
- bepaalt zelfstandig de melding;
- levert optioneel een
HealthAction; - retourneert altijd één
HealthResult.
Health checks kennen geen onderlinge afhankelijkheden.
Domeinmodel
HealthResult
Een HealthResult beschrijft de uitkomst van één health check.
Een resultaat bestaat uit:
- naam;
- status;
- penalty;
- melding;
- detailinformatie;
- optionele
HealthAction.
Hierdoor gebruiken alle onderdelen van de plugin hetzelfde contract.
HealthAction
Een HealthAction beschrijft een optionele vervolgstap voor de beheerder.
Een action:
- beïnvloedt nooit de Health Score;
- beïnvloedt nooit de status;
- bevat uitsluitend presentatiedata;
- helpt de beheerder een probleem op te lossen.
Iedere health check blijft eigenaar van zijn eigen acties.
HealthStatus
HealthStatus vertegenwoordigt de totale gezondheid van de website.
Het object bevat:
- algemene status;
- totale Health Score;
- configureerbare threshold;
- alle uitgevoerde health checks.
Hiermee vormt HealthStatus het centrale resultaat van de businesslaag.
HealthCheckStatus
Iedere health check gebruikt de PHP Enum HealthCheckStatus.
Beschikbare statussen:
| Status | Betekenis |
|---|---|
| OK | Controle succesvol uitgevoerd. |
| FAILED | Probleem vastgesteld. |
| UNKNOWN | Geen betrouwbare uitspraak mogelijk. |
UNKNOWN is uitsluitend bedoeld voor situaties waarin de controle zelf geen betrouwbaar resultaat kan bepalen.
Een UNKNOWN verhoogt nooit de Health Score.
Health Score
Iedere health check bepaalt uitsluitend zijn eigen penalty.
De totale Health Score wordt berekend door HealthService als de som van alle penalties.
Wanneer de totale score gelijk is aan of hoger is dan de configureerbare threshold, wordt de website als ongezond beschouwd.
Hierdoor blijven de verantwoordelijkheden duidelijk gescheiden:
- Health Checks bepalen individuele penalties;
- HealthService berekent de totaalscore;
- HealthStatus bepaalt de uiteindelijke status.
Ondersteunende services
HttpService
Verantwoordelijkheden:
- uitvoeren van HTTP-verzoeken;
- configureren van de Joomla HTTP Client;
- afhandelen van transportfouten;
- afschermen van de transportlaag voor de businesslogica.
Health checks bevatten hierdoor uitsluitend businesslogica.
EndpointUrlService
Verantwoordelijkheden:
- bepalen van de frontend URL;
- opbouwen van de Health Endpoint URL;
- interpreteren van
live_site; - terugvallen op
Uri::root()wanneer nodig.
Alle kennis over de endpointstructuur bevindt zich op één centrale plaats.
AdminUrlService
Verantwoordelijkheden:
- centraal beheren van Administrator-URL's;
- voorkomen van duplicatie;
- afschermen van Joomla-routering voor de businesslaag.
Health checks kennen hierdoor uitsluitend de gewenste beheeractie.
Backend-presentatie
De plugin toont de resultaten van iedere health check binnen de pluginconfiguratie.
De backend:
- presenteert uitsluitend DTO's;
- bevat geen businessregels;
- toont statussen met Bootstrap-badges;
- toont optionele
HealthAction-knoppen; - presenteert aanvullende detailinformatie zonder deze te interpreteren.
Alle betekenis van de gegevens blijft eigendom van de businesslaag.
JSON Endpoint
Het frontend endpoint publiceert de volledige Health Status als JSON.
Het endpoint gebruikt drie HTTP-statuscodes:
| HTTP | Betekenis |
|---|---|
| 200 | Website is gezond. |
| 403 | Ongeldig Health Token. |
| 503 | Health Score overschrijdt de ingestelde threshold. |
Hierdoor kan de plugin direct worden gebruikt door externe monitoringdiensten.
Installer
De installer is uitsluitend verantwoordelijk voor installatiegerelateerde werkzaamheden.
Verantwoordelijkheden:
- activeren van de plugin;
- legen van relevante Joomla-caches;
- ondersteunen van Joomla-installatie en updates.
De installer bevat geen runtime-businesslogica.
Configuratie
Alle configuratie wordt opgeslagen in de pluginparameters.
Er worden geen aanvullende configuratietabellen gebruikt.
De plugin blijft eigenaar van alle configuratie.
Codekwaliteit
SimpleHealthMonitor volgt de volgende uitgangspunten:
- UTF-8 zonder BOM;
declare(strict_types=1);;- Joomla Coding Standards;
- kleine, duidelijk afgebakende services;
- gebruik van PHP 8.1 Enums waar dit de domeinlogica verduidelijkt;
- resultaatgestuurde businesslaag;
- geen duplicatie van businesslogica;
- geen deprecated Joomla API's.
Compatibiliteit
Primair
- Joomla 6
Compatibel met
- Joomla 5.4
Architectuurtoets
Iedere wijziging moet positief kunnen beantwoorden:
- Blijft alle businesslogica eigendom van de plugin?
- Volgt de oplossing Joomla Core-conventies?
- Is de verantwoordelijkheidsverdeling duidelijk?
- Blijven businesslogica en presentatie gescheiden?
- Gebruiken alle health checks hetzelfde resultaatmodel?
- Verhoogt een
UNKNOWNnooit de Health Score? - Blijft iedere health check eigenaar van zijn eigen penalty en eventuele
HealthAction? - Kan nieuwe functionaliteit worden toegevoegd zonder bestaande businesslogica te dupliceren?
- Blijft de plugin zelfstandig bruikbaar zonder aanvullende databaseobjecten?
- Blijft de configuratie begrijpelijk voor websitebeheerders?
