Audit & Messaging
Documentation des endpoints du module Audit (journaux d'audit) et du module Messaging (envoi de messages email, SMS, push).
Audit & Messaging
Module Audit
Le module Audit fournit des endpoints d'administration pour consulter les journaux d'audit de l'application. Tous les endpoints requierent le role Admin.
Architecture
Le module Audit fonctionne comme un consommateur d'evenements :
- Les autres modules emettent des evenements d'audit via
INotification(MediatR). - Le handler
ConsumeAuditEventpersiste les evenements dans la tableaudit_log. - Un hub SignalR (
AuditHub) notifie les administrateurs connectes en temps reel. - Les endpoints REST permettent de consulter et filtrer les logs.
GetAuditLogs
GET /api/v1/audit/admin/logs
Retourne les logs d'audit pagines avec filtres optionnels.
Tag : Admin -- Audit
Auth requise : Role Admin
Query parameters
| Parametre | Type | Description |
|---|---|---|
fromUtc | DateTime | Date de debut (filtre sur OccurredAtUtc) |
toUtc | DateTime | Date de fin |
moduleName | string | Nom du module (ex: identity) |
actionName | string | Nom de l'action (ex: Login) |
eventType | string | Type d'evenement (ex: security, exception) |
severity | string | Severite (ex: info, warning, error) |
source | string | Source de l'evenement |
tenantId | string | Identifiant du tenant |
correlationId | string | ID de correlation |
traceId | string | ID de trace OpenTelemetry |
result | string | Resultat (ex: success, failure) |
entityType | string | Type d'entite (ex: User, Session) |
entityId | string | Identifiant de l'entite |
actorUserId | Guid | ID de l'utilisateur acteur |
sortBy | string | Champ de tri |
sortOrder | string | Ordre de tri (asc ou desc) |
pageNumber | int | Numero de page |
pageSize | int | Taille de page |
Reponse
200 OK -- PageList<AuditLogSummaryDto> :
{
"items": [
{
"id": "3fa85f64-...",
"occurredAtUtc": "2026-03-07T10:30:00Z",
"receivedAtUtc": "2026-03-07T10:30:01Z",
"moduleName": "identity",
"actionName": "Login",
"eventType": "security",
"severity": "info",
"result": "success",
"source": "LoginCommandHandler",
"tenantId": null,
"actorUserId": "3fa85f64-...",
"entityType": "User",
"entityId": "3fa85f64-...",
"correlationId": "abc-123",
"traceId": "0af7651916cd43dd...",
"version": 1
}
],
"pageNumber": 1,
"pageSize": 25,
"totalCount": 150
}
GetAuditLogById
GET /api/v1/audit/admin/logs/{id}
Retourne les details complets d'un log d'audit.
Tag : Admin -- Audit
Auth requise : Role Admin
Parametres de route
| Parametre | Type | Description |
|---|---|---|
id | Guid | Identifiant du log |
Reponse
200 OK -- AuditLogDetailDto :
{
"id": "3fa85f64-...",
"occurredAtUtc": "2026-03-07T10:30:00Z",
"receivedAtUtc": "2026-03-07T10:30:01Z",
"moduleName": "identity",
"actionName": "Login",
"eventType": "security",
"entityType": "User",
"entityId": "3fa85f64-...",
"actorUserId": "3fa85f64-...",
"actorType": "user",
"result": "success",
"reason": null,
"severity": "info",
"tenantId": null,
"ipAddress": "192.168.1.42",
"userAgent": "Mozilla/5.0 ...",
"correlationId": "abc-123",
"requestId": "def-456",
"traceId": "0af7651916cd43dd...",
"spanId": "b7ad6b7169203331",
"tags": ["auth", "login"],
"metadataJson": "{}",
"tokenFingerprintSha256": "abc123...",
"source": "LoginCommandHandler",
"payloadJson": "{\"email\":\"***\"}",
"version": 1
}
404 Not Found -- Log introuvable.
GetAuditSummary
GET /api/v1/audit/admin/logs/summary
Retourne les compteurs agreges par type, severite, source et tenant.
Tag : Admin -- Audit
Auth requise : Role Admin
Query parameters
| Parametre | Type | Description |
|---|---|---|
fromUtc | DateTime | Date de debut |
toUtc | DateTime | Date de fin |
moduleName | string | Filtrer par module |
tenantId | string | Filtrer par tenant |
source | string | Filtrer par source |
Reponse
200 OK -- AuditSummaryDto :
{
"totalCount": 1250,
"fromUtc": "2026-03-01T00:00:00Z",
"toUtc": "2026-03-07T23:59:59Z",
"byEventType": [
{ "key": "security", "count": 800 },
{ "key": "exception", "count": 50 }
],
"bySeverity": [
{ "key": "info", "count": 1100 },
{ "key": "warning", "count": 100 },
{ "key": "error", "count": 50 }
],
"bySource": [
{ "key": "LoginCommandHandler", "count": 500 }
],
"byTenant": [
{ "key": "none", "count": 1250 }
]
}
GetAuditLogsByCorrelation
GET /api/v1/audit/admin/logs/correlation/{correlationId}
Retourne la timeline paginee d'une correlation, triee par ordre chronologique.
Tag : Admin -- Audit
Auth requise : Role Admin
Parametres
| Parametre | Type | Description |
|---|---|---|
correlationId | string | ID de correlation |
fromUtc | DateTime | Date de debut (opt.) |
toUtc | DateTime | Date de fin (opt.) |
pageNumber | int | Numero de page (opt.) |
pageSize | int | Taille de page (opt.) |
Reponse
200 OK -- PageList<AuditLogSummaryDto> (tri chronologique ascendant).
GetAuditLogsByTrace
GET /api/v1/audit/admin/logs/trace/{traceId}
Retourne la timeline paginee d'une trace OpenTelemetry.
Tag : Admin -- Audit
Auth requise : Role Admin
Parametres
| Parametre | Type | Description |
|---|---|---|
traceId | string | ID de trace OpenTelemetry |
fromUtc | DateTime | Date de debut (opt.) |
toUtc | DateTime | Date de fin (opt.) |
pageNumber | int | Numero de page (opt.) |
pageSize | int | Taille de page (opt.) |
Reponse
200 OK -- PageList<AuditLogSummaryDto> (tri chronologique ascendant).
GetExceptionAuditLogs
GET /api/v1/audit/admin/logs/exceptions
Retourne les logs d'audit de type exception, tries par date decroissante.
Tag : Admin -- Audit
Auth requise : Role Admin
Query parameters
| Parametre | Type | Description |
|---|---|---|
fromUtc | DateTime | Date de debut |
toUtc | DateTime | Date de fin |
severity | string | Filtrer par severite |
result | string | Filtrer par resultat |
moduleName | string | Filtrer par module |
pageNumber | int | Numero de page |
pageSize | int | Taille de page |
Reponse
200 OK -- PageList<AuditLogSummaryDto>
GetSecurityAuditLogs
GET /api/v1/audit/admin/logs/security
Retourne les logs d'audit de type security, tries par date decroissante.
Tag : Admin -- Audit
Auth requise : Role Admin
Query parameters
| Parametre | Type | Description |
|---|---|---|
fromUtc | DateTime | Date de debut |
toUtc | DateTime | Date de fin |
severity | string | Filtrer par severite |
result | string | Filtrer par resultat |
tenantId | string | Filtrer par tenant |
actorUserId | Guid | Filtrer par utilisateur acteur |
pageNumber | int | Numero de page |
pageSize | int | Taille de page |
Reponse
200 OK -- PageList<AuditLogSummaryDto>
SignalR Hub -- AuditHub
Le module Audit expose un hub SignalR pour les notifications en temps reel.
Configuration
- Route : Configuree via
UseInfrastructuredu module Audit - Groupe :
audit-admins - Evenement :
AuditLogInserted
Connexion
Seuls les utilisateurs avec le role Admin peuvent se connecter au hub. Les non-administrateurs sont immediatement deconnectes.
// Client SignalR (exemple)
const connection = new signalR.HubConnectionBuilder()
.withUrl("/hubs/audit", {
accessTokenFactory: () => accessToken
})
.build();
connection.on("AuditLogInserted", (auditLog) => {
console.log("Nouveau log:", auditLog);
});
await connection.start();
Module Messaging
Le module Messaging est un module interne (pas d'endpoints HTTP publics). Il fournit des services d'envoi de messages consommes par les autres modules via CQRS (MediatR).
Canaux supportes
| Canal | Implementation | Statut |
|---|---|---|
SmtpEmailSender (MailKit) | Production | |
| SMS | SnsSmsSender (AWS SNS) | Production |
| Push | PushServiceStub | Stub (a implementer) |
Commands (via MediatR)
Les commandes de messagerie sont definies dans Messaging.Contracts :
SendEmailCommand
public record SendEmailCommand(EmailMessage Message) : IMessagingCommand;
Envoi d'un email via SMTP. Le template est rendu via MjmlTemplateRenderer.
SendSmsCommand
public record SendSmsCommand(SmsMessage Message) : IMessagingCommand;
Envoi d'un SMS via AWS SNS.
SendPushCommand
public record SendPushCommand(PushMessage Message) : IMessagingCommand;
Envoi de notification push (actuellement un stub).
Persistance
Tous les messages envoyes sont persistes dans la table sent_messages (schema messaging) via le MessagingPersistenceBehavior, un pipeline MediatR qui encapsule chaque commande de messagerie.
Nettoyage automatique
Le MessageCleanupJob (Hangfire) supprime periodiquement les anciens messages de la table sent_messages.
Events
| Evenement | Description |
|---|---|
MessageSentEvent | Emis apres un envoi reussi |
MessageFailedEvent | Emis apres un echec d'envoi |
Configuration SMTP
{
"SmtpOptions": {
"Host": "smtp.example.com",
"Port": 587,
"Username": "user",
"Password": "pass",
"FromEmail": "noreply@place.app",
"FromName": "Place",
"UseSsl": true
}
}
Configuration AWS SNS (SMS)
{
"SnsOptions": {
"Region": "eu-north-1",
"SenderId": "Place",
"SmsType": "Transactional"
}
}
Les credentials AWS sont configures via variables d'environnement (SNS_ACCESS_KEY_ID, SNS_SECRET_ACCESS_KEY).
Health Check
Le module Messaging inclut un SmtpHealthCheck qui verifie la connectivite au serveur SMTP.