Modules

Vue d'ensemble du systeme modulaire de Place API et communication inter-modules

Modules

Systeme modulaire

Place API organise le code en modules autonomes, chacun representant un contexte metier distinct. Chaque module possede :

  • Son propre projet d'implementation (types internal)
  • Son propre projet Contracts (types public : DTOs, commandes, evenements)
  • Son propre DbContext avec un schema PostgreSQL dedie
  • Ses propres features organisees en vertical slices
  • Ses propres tests (unitaires et integration)

Modules actuels

ModuleSchema DBDescription
IdentityidentityAuthentification, autorisation, sessions, 2FA, groupes, roles
AuditauditTracabilite des actions, diffusion temps reel via SignalR
MessagingmessagingEnvoi multicanal (email, SMS, push), suivi de statut
Booking--Module a venir (seul le projet Contracts existe)

Communication inter-modules

Via projets Contracts

Le mecanisme principal de communication est l'utilisation de commandes MediatR definies dans les projets Contracts. Par exemple, le module Identity envoie un email en publiant une SendEmailCommand definie dans Messaging.Contracts :

// Defini dans Messaging.Contracts
public sealed record SendEmailCommand(EmailMessage Message) : IMessagingCommand;

// Utilise depuis le module Identity
await mediator.Send(new SendEmailCommand(new EmailMessage(
    To: user.Email,
    Subject: "Confirmation",
    TemplateName: "confirm-email",
    Variables: new Dictionary<string, string> { ["code"] = otpCode })));

Via notifications MediatR

Pour les evenements asynchrones (in-process), les modules utilisent INotification / INotificationHandler :

// Evenement publie par Identity
public record UserLoggedInEvent(Guid UserId) : IDomainEvent;

// Consomme par Audit (ou tout autre module)
internal class OnUserLoggedIn : INotificationHandler<UserLoggedInEvent> { }

Regles strictes

  • Un module ne peut jamais referencer le projet d'implementation d'un autre module
  • Un module peut referencer le projet Contracts d'un autre module
  • Tous les modules referencent BuildingBlocks (bibliotheque partagee)
mermaid
graph LR
    IdentityImpl[Identity] -->|reference| IdentityContracts[Identity.Contracts]
    IdentityImpl -->|reference| MessagingContracts[Messaging.Contracts]
    IdentityImpl -->|reference| BB[BuildingBlocks]

    AuditImpl[Audit] -->|reference| BB
    AuditImpl -->|reference| IdentityContracts

    MessagingImpl[Messaging] -->|reference| MessagingContracts
    MessagingImpl -->|reference| BB

    IdentityImpl -.-x|interdit| AuditImpl
    IdentityImpl -.-x|interdit| MessagingImpl

Structure type d'un module

ModuleName/
├── ModuleName/                     # Implementation (internal)
│   ├── ModuleNameRoot.cs           # Classe marqueur pour le scan d'assemblies
│   ├── Constants/                  # Constantes du module
│   ├── Entities/                   # Modeles de domaine
│   ├── Events/                     # Evenements de domaine
│   ├── Errors/                     # Types d'erreurs
│   ├── Extensions/                 # AddInfrastructure / UseInfrastructure
│   ├── Features/                   # Vertical slices (Commands, Queries, Endpoints)
│   ├── Infrastructure/             # Implementations techniques
│   ├── Persistence/                # DbContext, configurations EF, migrations, seeds
│   ├── Services/                   # Interfaces de services
│   └── ValueObjects/               # Types valeur immutables
├── ModuleName.Contracts/           # Interface publique
│   ├── Commands/                   # Commandes MediatR publiques
│   ├── Events/                     # Evenements d'integration
│   ├── Messages/                   # DTOs de messages
│   ├── Requests/                   # DTOs de requete
│   └── Responses/                  # DTOs de reponse
└── tests/
    ├── IntegrationTest/            # Tests avec Testcontainers + Respawn
    └── UnitTest/                   # Tests unitaires avec NSubstitute

Pages detaillees