Modeles de donnees
Diagrammes entite-relation et description des schemas de base de donnees pour chaque module de Place API.
Modeles de donnees
Place API utilise PostgreSQL avec une strategie schema-per-module. Chaque module possede son propre DbContext et son propre schema de base de donnees, tout en partageant le meme serveur PostgreSQL.
Bases de donnees
L'application utilise plusieurs bases de donnees PostgreSQL distinctes :
| Base de donnees | Description | Connection string key |
|---|---|---|
identity | Module Identity (utilisateurs, auth) | PostgresOptions:ConnectionString |
audit | Module Audit (journaux d'audit) | ConnectionStrings:audit |
messaging | Module Messaging (messages envoyes) | ConnectionStrings:messaging (via Aspire) |
hangfire | Background jobs Hangfire | ConnectionStrings:hangfire |
persist-message | Outbox pattern / messages persistants | PersistMessageOptions:ConnectionString |
Schema Identity
Le module Identity utilise IdentityDbContext qui herite de IdentityDbContext<User, Role, Guid> d'ASP.NET Identity. Les noms de tables sont convertis en snake_case.
Tables Identity (snake_case dans PostgreSQL)
| Table PostgreSQL | Entite C# | Description |
|---|---|---|
user | User | Utilisateurs (herite de IdentityUser<Guid>) |
role | Role | Roles applicatifs (herite de IdentityRole<Guid>) |
user_role | UserRole | Table de jointure User-Role |
user_session | UserSession | Sessions actives avec refresh token hashe |
otp_record | OtpRecord | Codes OTP pour verification email et reset password |
password_history | PasswordHistory | Historique des mots de passe (eviter reutilisation) |
push_token | PushToken | Tokens push notification (FCM, APNs) |
two_factor_challenge | TwoFactorChallenge | Challenges 2FA en cours (TOTP) |
user_security_settings | UserSecuritySettings | Preferences de securite par utilisateur |
user_claim | UserClaim | Claims utilisateur (ASP.NET Identity) |
user_login | UserLogin | Logins externes (Google, Apple, Facebook) |
user_token | UserToken | Tokens ASP.NET Identity |
group | Group | Groupes d'utilisateurs |
group_role | GroupRole | Association groupe-role |
user_group | UserGroup | Association utilisateur-groupe |
idempotency_record | IdempotencyRecord | Cache d'idempotence pour les requetes |
Index notables
user_session: index unique surRefreshTokenHash, index composite sur(UserId, RevokedAt, ExpiresAt)pour recherche de sessions activesotp_record: FK versUsergroup: index unique surNamegroup_role: index unique sur(GroupId, RoleId)user_group: index unique sur(UserId, GroupId)user_security_settings: index unique surUserId
Concurrency control
L'entite User utilise le champ Version comme concurrency token via EF Core. Toutes les entites implementant IVersion voient leur version incrementee automatiquement lors de la sauvegarde.
Schema Audit
Le module Audit utilise un AuditContext avec une seule table audit_log. Les noms de colonnes sont en snake_case.
Colonnes et types speciaux
| Colonne | Type PostgreSQL | Description |
|---|---|---|
payload_json | jsonb | Donnees de l'evenement (corps de requete) |
metadata_json | jsonb | Metadonnees additionnelles |
tags | text[] | Tags de categorisation (array PostgreSQL) |
Index
La table audit_log possede de nombreux index pour supporter les requetes de filtrage et de recherche :
OccurredAtUtc-- tri chronologiqueReceivedAtUtc-- tri par receptionModuleName-- filtrage par moduleActionName-- filtrage par actionEntityType-- filtrage par type d'entiteEntityId-- recherche par identifiant d'entiteActorUserId-- recherche par utilisateurCorrelationId-- tracabilite de correlationTraceId-- tracabilite distribuee- Composite
(ModuleName, OccurredAtUtc)-- filtrage module + temps - Composite
(ActorUserId, OccurredAtUtc)-- filtrage utilisateur + temps
Schema Messaging
Le module Messaging utilise un MessagingContext avec le schema messaging et une table sent_messages.
Statuts de message
L'enum MessageStatus definit les etats possibles :
| Statut | Description |
|---|---|
Pending | Message en attente d'envoi |
Sent | Message envoye avec succes |
Failed | Echec d'envoi |
Bounced | Message rejete par le destinataire |
Contraintes et index
| Colonne | Contrainte | Description |
|---|---|---|
Channel | max 20 chars | Canal d'envoi (email, sms, push) |
Recipient | max 500 chars | Destinataire |
TemplateName | max 100 chars | Nom du template |
Subject | max 500 chars | Sujet du message |
Status | max 20 chars | Stocke comme string |
ErrorMessage | max 2000 chars | Message d'erreur |
CorrelationId | max 64 chars | ID de correlation |
Index : CreatedAt, Status, Channel, Recipient, composite (Channel, CreatedAt).
Migrations EF Core
Les migrations sont gerees separement par module :
# Identity
dotnet ef migrations add <NomMigration> \
--project src/Modules/Identity/Identity \
--startup-project src/Api \
--context IdentityContext
# Audit
dotnet ef migrations add <NomMigration> \
--project src/Modules/Audit/Audit \
--startup-project src/Api \
--context AuditContext
# Messaging
dotnet ef migrations add <NomMigration> \
--project src/Modules/Messaging/Messaging \
--startup-project src/Api \
--context MessagingContext
Historique des migrations Identity
| Date | Migration | Description |
|---|---|---|
| 2023-03-31 | initial | Schema initial ASP.NET Identity |
| 2026-02-19 | AddAuthInfrastructure | Sessions, OTP, historique mots de passe |
| 2026-02-19 | MakeUserProfileFieldsNullable | Champs profil optionnels |
| 2026-02-20 | AddSocialLoginFields | Support login social (Google, Apple, Facebook) |
| 2026-02-21 | MakeRefreshTokenHashUnique | Index unique sur RefreshTokenHash |
| 2026-02-21 | AddSessionMetadataAndDddTypes | Metadonnees device, value objects DDD |
| 2026-02-21 | AddPreviousRefreshTokenHash | Detection replay token |
| 2026-02-21 | ApplyUs008ReviewRemediations | Corrections post-review |
| 2026-02-22 | NormalizeIdentityDateTimeColumnsToTimestampWithTimeZone | Normalisation timestamps |
| 2026-03-03 | AddTokenFingerprintToOtpRecord | Empreinte token sur OTP |
Historique des migrations Audit
| Date | Migration | Description |
|---|---|---|
| 2026-03-03 | InitialAuditLog | Table audit_log initiale |
Historique des migrations Messaging
| Date | Migration | Description |
|---|---|---|
| 2026-03-03 | InitialMessaging | Table sent_messages initiale |