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 :

  1. Les autres modules emettent des evenements d'audit via INotification (MediatR).
  2. Le handler ConsumeAuditEvent persiste les evenements dans la table audit_log.
  3. Un hub SignalR (AuditHub) notifie les administrateurs connectes en temps reel.
  4. 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

ParametreTypeDescription
fromUtcDateTimeDate de debut (filtre sur OccurredAtUtc)
toUtcDateTimeDate de fin
moduleNamestringNom du module (ex: identity)
actionNamestringNom de l'action (ex: Login)
eventTypestringType d'evenement (ex: security, exception)
severitystringSeverite (ex: info, warning, error)
sourcestringSource de l'evenement
tenantIdstringIdentifiant du tenant
correlationIdstringID de correlation
traceIdstringID de trace OpenTelemetry
resultstringResultat (ex: success, failure)
entityTypestringType d'entite (ex: User, Session)
entityIdstringIdentifiant de l'entite
actorUserIdGuidID de l'utilisateur acteur
sortBystringChamp de tri
sortOrderstringOrdre de tri (asc ou desc)
pageNumberintNumero de page
pageSizeintTaille 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

ParametreTypeDescription
idGuidIdentifiant 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

ParametreTypeDescription
fromUtcDateTimeDate de debut
toUtcDateTimeDate de fin
moduleNamestringFiltrer par module
tenantIdstringFiltrer par tenant
sourcestringFiltrer 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

ParametreTypeDescription
correlationIdstringID de correlation
fromUtcDateTimeDate de debut (opt.)
toUtcDateTimeDate de fin (opt.)
pageNumberintNumero de page (opt.)
pageSizeintTaille 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

ParametreTypeDescription
traceIdstringID de trace OpenTelemetry
fromUtcDateTimeDate de debut (opt.)
toUtcDateTimeDate de fin (opt.)
pageNumberintNumero de page (opt.)
pageSizeintTaille 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

ParametreTypeDescription
fromUtcDateTimeDate de debut
toUtcDateTimeDate de fin
severitystringFiltrer par severite
resultstringFiltrer par resultat
moduleNamestringFiltrer par module
pageNumberintNumero de page
pageSizeintTaille 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

ParametreTypeDescription
fromUtcDateTimeDate de debut
toUtcDateTimeDate de fin
severitystringFiltrer par severite
resultstringFiltrer par resultat
tenantIdstringFiltrer par tenant
actorUserIdGuidFiltrer par utilisateur acteur
pageNumberintNumero de page
pageSizeintTaille 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 UseInfrastructure du 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

CanalImplementationStatut
EmailSmtpEmailSender (MailKit)Production
SMSSnsSmsSender (AWS SNS)Production
PushPushServiceStubStub (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

EvenementDescription
MessageSentEventEmis apres un envoi reussi
MessageFailedEventEmis 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.