API Plugins
AutoMate.API gebruikt een plugin architectuur voor loosely coupled uitbreidingen. Plugins zijn aparte projecten onder /API/AutoMate.API.Plugins.* die eigen endpoints, services en models bevatten. Ze worden gerefereerd door het hoofd-API project en registreren hun dependencies via extension methods op IServiceCollection.
Plugin structuur
Een plugin project:
Bevat eigen FastEndpoints endpoints die automatisch ontdekt worden door de assembly filter
Registreert dependencies via een
RegisterDependenciesextension methodWordt geregistreerd in
Program.csvan de hoofd-API
AuditLog Plugin
Project: API/AutoMate.API.Plugins.AuditLog
Doel: Audit logging met meerdere backends, configureerbaar per tenant.
Providers
De plugin ondersteunt twee sink backends:
Sink | Klasse | Registratie key |
|---|---|---|
Seq |
|
|
Azure Table Storage |
|
|
Beide sinks zijn geregistreerd als KeyedSingleton<IAuditLogSink>. Welke sink actief is voor een tenant wordt bepaald door IAuditLogProviderResolver.
Provider resolver
De plugin registreert DefaultAuditLogProviderResolver als standaard implementatie, die null teruggeeft (het systeem valt dan terug op de geconfigureerde DefaultProvider in AuditLogOptions). De hoofd-API overschrijft dit met TenantAuditLogProviderResolver, die de provider opzoekt in de tenant tabel.
AuditLog configuratie
De Azure Table connection string wordt ook automatisch opgehaald via de Aspire connection string AuditLogsTables.
AuditLog achtergrondverwerking
AuditLogCleanupScheduler is een IHostedService die via Hangfire periodiek oude audit logs opschoont. De cleanup wordt uitgevoerd door CleanupJobRunner die CleanupAuditLogsCommandHandler aanroept.
AuditLog endpoints
GET /api/audit-logs— Audit logs ophalen met filtering (GetAuditLogsEndpoint)GET /api/audit-logs/download— Audit logs downloaden als bestand (DownloadAuditLogsEndpoint)
AuditLog interfaces
Naam | Type | Doel |
|---|---|---|
| Interface | Audit events loggen |
| Implementatie | Kiest provider via resolver, delegeert naar sink |
| Interface | Backend-specifieke write operatie |
| Implementatie | HTTP POST naar Seq via named HttpClient |
| Implementatie | Schrijft naar Azure Table Storage |
Email Plugin
Project: API/AutoMate.API.Plugins.Email
Doel: Transactionele email verzending via SendGrid.
Email configuratie
EU data residency via SetDataResidency("eu") vereist een SendGrid Pro account. Dit is momenteel uitgecommentarieerd in de plugin — activeer alleen als Pro abonnement beschikbaar is.
Email interfaces
Naam | Type | Doel |
|---|---|---|
| Interface | Email verzenden |
| Implementatie | Gebruikt |
| Interface | SendGrid API client (Singleton) |
| Interface | Email message persistentie |
| Interface | Email delivery event persistentie |
| Interface | Email template beheer |
Email endpoints
POST /api/email/webhook— SendGrid delivery status webhook (EmailStatusWebhookEndpoint)
Email achtergrondverwerking
EmailStatusJob is een Hangfire job die email delivery statussen verwerkt.
MsGraph Plugin
Project: API/AutoMate.API.Plugins.MsGraph
Doel: Microsoft Graph API integratie met multi-tenant certificaat authenticatie en batch support.
Authenticatie
De plugin gebruikt certificate-based authenticatie (client credentials) met certificaten uit Azure Key Vault. Configuratie via GraphCertificateAuthOptions (config section: GraphCertificate):
De plugin ondersteunt module-specifieke certificaat profielen (bijv. Branding, IAM). Via TenantModuleRouting kan per tenant en per module een specifiek profiel geconfigureerd worden. Zonder routing valt de plugin terug op het Default profiel, of op de legacy top-level properties.
Retry policy
De GraphService HttpClient ("GraphService") heeft een Polly retry policy met exponential backoff:
3 retries bij transient HTTP errors
Ook bij
401 Unauthorizeden403 ForbiddenWachttijd:
2^nseconden (2s, 4s, 8s)
MsGraph interfaces
Naam | Lifetime | Doel |
|---|---|---|
| Singleton | Core Graph client, token caching per tenant via MSAL |
| Singleton | User queries via Graph (ophalen, zoeken) |
| Singleton | Bulk create/update/disable via Graph |
| Singleton | Certificaten laden uit Azure Key Vault |
IGraphService, IEntraUserService en IEntraUserBatchService zijn Singleton omdat MSAL's IConfidentialClientApplication thread-safe is en token caching per tenant automatisch beheert.
Batch operaties
IEntraUserBatchService biedt:
EntraCreateUserInput— Bulk aanmaken van Entra usersEntraUpdateUserInput— Bulk bijwerken van Entra usersEntraDisableUserInput— Bulk uitschakelen van Entra accounts
Resultaten worden teruggegeven via EntraBatchResults.
GraphModule
GraphModule is een enum die de beschikbare modules definieert (bijv. Branding, IAM). Dit wordt gebruikt bij GetProfileForTenantModule() om het juiste certificaat profiel op te zoeken voor een specifieke tenant-module combinatie.