# Module Integration Patterns ## Purpose This document explains how modules integrate with the core platform, focusing on module discovery, initialization, service integration, and communication patterns rather than detailed implementation. ## Overview Modules are implemented as independent services that extend the platform's functionality. They integrate with core services through service client interfaces, service discovery (Consul), and a standardized initialization process. Each module operates as an independent service with its own entry point, database connection, and deployment while leveraging core platform capabilities. ## Key Concepts - **Module**: Independent service providing specific functionality - **Module Manifest**: YAML file defining module metadata and configuration - **Module Interface**: Standard interface all modules implement - **Service Clients**: Abstraction for inter-service communication - **Module Registry**: Registry tracking all loaded modules ## Module Discovery Process Modules are discovered automatically during application startup by scanning module directories. ```mermaid sequenceDiagram participant Main participant ModuleLoader participant FileSystem participant ModuleManifest participant ModuleRegistry Main->>ModuleLoader: DiscoverModules() ModuleLoader->>FileSystem: Scan modules/ directory FileSystem-->>ModuleLoader: Module directories loop For each module directory ModuleLoader->>FileSystem: Read module.yaml FileSystem-->>ModuleLoader: Module manifest ModuleLoader->>ModuleManifest: Parse manifest ModuleManifest-->>ModuleLoader: Module metadata ModuleLoader->>ModuleRegistry: Register module ModuleRegistry->>ModuleRegistry: Validate manifest ModuleRegistry->>ModuleRegistry: Check dependencies ModuleRegistry-->>ModuleLoader: Module registered end ModuleLoader->>ModuleRegistry: Resolve dependencies ModuleRegistry->>ModuleRegistry: Build dependency graph ModuleRegistry->>ModuleRegistry: Order modules ModuleRegistry-->>ModuleLoader: Ordered module list ModuleLoader-->>Main: Module list ready ``` ### Discovery Steps 1. **Directory Scanning**: Scan `modules/` directory for module subdirectories 2. **Manifest Loading**: Load `module.yaml` from each module directory 3. **Manifest Parsing**: Parse manifest to extract metadata 4. **Dependency Extraction**: Extract module dependencies from manifest 5. **Module Registration**: Register module in module registry 6. **Dependency Resolution**: Build dependency graph and order modules 7. **Validation**: Validate all dependencies are available ## Module Initialization Flow Modules are initialized in dependency order, ensuring all dependencies are available before module initialization. ```mermaid sequenceDiagram participant Main participant ModuleRegistry participant Module participant DI participant Router participant ServiceRegistry participant DB Main->>ModuleRegistry: GetOrderedModules() ModuleRegistry-->>Main: Ordered module list loop For each module (dependency order) Main->>Module: Init() Module->>DI: Provide services DI->>DI: Register module services DI-->>Module: Services registered Module->>Router: Register routes Router->>Router: Add route handlers Router-->>Module: Routes registered Module->>DB: Register migrations DB->>DB: Store migration info DB-->>Module: Migrations registered Module->>ServiceRegistry: Register service ServiceRegistry->>ServiceRegistry: Register with Consul ServiceRegistry-->>Module: Service registered Module->>Module: OnStart hook (optional) Module-->>Main: Module initialized end Main->>DB: Run migrations DB->>DB: Execute in dependency order DB-->>Main: Migrations complete Main->>Router: Start HTTP server Main->>ServiceRegistry: Start service discovery ``` ### Initialization Phases 1. **Dependency Resolution**: Determine module initialization order 2. **Service Registration**: Register module services in DI container 3. **Route Registration**: Register HTTP routes 4. **Migration Registration**: Register database migrations 5. **Service Registration**: Register module as service in service registry 6. **Lifecycle Hooks**: Execute OnStart hooks if defined 7. **Migration Execution**: Run migrations in dependency order 8. **Server Startup**: Start HTTP and gRPC servers ## Module Service Integration Modules integrate with core services through service client interfaces, ensuring all communication goes through well-defined abstractions. ```mermaid graph TB subgraph "Module Service" ModuleHandler[Module Handler] ModuleService[Module Service] ModuleRepo[Module Repository] end subgraph "Service Clients" AuthClient[Auth Service Client] IdentityClient[Identity Service Client] AuthzClient[Authz Service Client] AuditClient[Audit Service Client] end subgraph "Core Services" AuthService[Auth Service
:8081] IdentityService[Identity Service
:8082] AuthzService[Authz Service
:8083] AuditService[Audit Service
:8084] end subgraph "Infrastructure" EventBus[Event Bus] Cache[Cache] DB[(Database)] end ModuleHandler --> ModuleService ModuleService --> ModuleRepo ModuleRepo --> DB ModuleService -->|gRPC| AuthClient ModuleService -->|gRPC| IdentityClient ModuleService -->|gRPC| AuthzClient ModuleService -->|gRPC| AuditClient AuthClient --> AuthService IdentityClient --> IdentityService AuthzClient --> AuthzService AuditClient --> AuditService ModuleService --> EventBus ModuleService --> Cache style ModuleService fill:#7b68ee,stroke:#5a4fcf,stroke-width:2px,color:#fff style AuthClient fill:#50c878,stroke:#2e7d4e,stroke-width:2px,color:#fff ``` ### Service Integration Points 1. **Authentication**: Use Auth Service Client for token validation 2. **Identity**: Use Identity Service Client for user operations 3. **Authorization**: Use Authz Service Client for permission checks 4. **Audit**: Use Audit Service Client for audit logging 5. **Event Bus**: Publish and subscribe to events 6. **Cache**: Use cache for performance optimization 7. **Database**: Direct database access via repositories ## Module Data Management Modules manage their own data while sharing database infrastructure. ```mermaid graph TD subgraph "Module A" ModuleA[Module A Service] RepoA[Module A Repository] SchemaA[Module A Schema
blog_posts] end subgraph "Module B" ModuleB[Module B Service] RepoB[Module B Repository] SchemaB[Module B Schema
billing_subscriptions] end subgraph "Shared Database" DB[(PostgreSQL)] end subgraph "Migrations" MigrationA[Module A Migrations] MigrationB[Module B Migrations] end ModuleA --> RepoA RepoA --> SchemaA SchemaA --> DB ModuleB --> RepoB RepoB --> SchemaB SchemaB --> DB MigrationA --> DB MigrationB --> DB style ModuleA fill:#7b68ee,stroke:#5a4fcf,stroke-width:2px,color:#fff style ModuleB fill:#7b68ee,stroke:#5a4fcf,stroke-width:2px,color:#fff style DB fill:#4a90e2,stroke:#2e5c8a,stroke-width:2px,color:#fff ``` ### Data Isolation Patterns 1. **Schema Isolation**: Each module has its own database schema 2. **Table Prefixing**: Module tables prefixed with module name 3. **Migration Isolation**: Each module manages its own migrations 4. **Shared Database**: Modules share database instance but not schemas 5. **Cross-Module Queries**: Use service clients, not direct SQL joins ## Module Permission System Modules register permissions that are automatically integrated into the platform's permission system. ```mermaid sequenceDiagram participant Module participant ModuleManifest participant PermissionGenerator participant PermissionRegistry participant AuthzService Module->>ModuleManifest: Define permissions ModuleManifest->>ModuleManifest: permissions: blog.post.create, blog.post.read, blog.post.update, blog.post.delete Module->>PermissionGenerator: Generate permission code PermissionGenerator->>PermissionGenerator: Parse manifest PermissionGenerator->>PermissionGenerator: Generate constants PermissionGenerator-->>Module: Permission code generated Module->>PermissionRegistry: Register permissions PermissionRegistry->>PermissionRegistry: Validate format PermissionRegistry->>PermissionRegistry: Store permissions PermissionRegistry-->>Module: Permissions registered AuthzService->>PermissionRegistry: Resolve permissions PermissionRegistry-->>AuthzService: Permission list AuthzService->>AuthzService: Check permissions ``` ### Permission Registration Flow 1. **Permission Definition**: Define permissions in `module.yaml` 2. **Code Generation**: Generate permission constants from manifest 3. **Permission Registration**: Register permissions during module initialization 4. **Permission Validation**: Validate permission format and uniqueness 5. **Permission Resolution**: Permissions available for authorization checks ## Module Communication Patterns Modules communicate with each other through event bus and service clients. ```mermaid graph TB subgraph "Module A" ServiceA[Module A Service] end subgraph "Module B" ServiceB[Module B Service] end subgraph "Event Bus" EventBus[Event Bus
Kafka] end subgraph "Service Clients" ClientA[Service Client A] ClientB[Service Client B] end subgraph "Module C" ServiceC[Module C Service] end ServiceA -->|Publish Event| EventBus EventBus -->|Subscribe| ServiceB EventBus -->|Subscribe| ServiceC ServiceA -->|gRPC Call| ClientA ClientA --> ServiceB ServiceB -->|gRPC Call| ClientB ClientB --> ServiceC style ServiceA fill:#7b68ee,stroke:#5a4fcf,stroke-width:2px,color:#fff style ServiceB fill:#7b68ee,stroke:#5a4fcf,stroke-width:2px,color:#fff style EventBus fill:#4a90e2,stroke:#2e5c8a,stroke-width:2px,color:#fff ``` ### Communication Patterns #### Event-Based Communication ```mermaid sequenceDiagram participant ModuleA participant EventBus participant ModuleB participant ModuleC ModuleA->>EventBus: Publish event EventBus->>EventBus: Route to subscribers EventBus->>ModuleB: Deliver event EventBus->>ModuleC: Deliver event ModuleB->>ModuleB: Process event ModuleC->>ModuleC: Process event Note over ModuleB,ModuleC: Events processed independently ``` #### Service Client Communication ```mermaid sequenceDiagram participant ModuleA participant Client participant ServiceRegistry participant ModuleB ModuleA->>Client: Call service method Client->>ServiceRegistry: Discover Module B ServiceRegistry-->>Client: Module B endpoint Client->>ModuleB: gRPC call ModuleB->>ModuleB: Process request ModuleB-->>Client: Response Client-->>ModuleA: Return result ``` ## Module Route Registration Modules register their HTTP routes with the platform's router. ```mermaid sequenceDiagram participant Module participant Router participant AuthzMiddleware participant ModuleHandler Module->>Router: Register routes Module->>Router: Define route: /api/v1/blog/posts Module->>Router: Define permission: blog.post.create Module->>Router: Define handler: CreatePostHandler Router->>Router: Create route Router->>AuthzMiddleware: Register permission check Router->>Router: Attach handler Router->>Router: Route registered Note over Router: Routes are registered with
permission requirements ``` ### Route Registration Process 1. **Route Definition**: Module defines routes in `Init()` method 2. **Permission Association**: Routes associated with required permissions 3. **Handler Registration**: Handlers registered with router 4. **Middleware Attachment**: Authorization middleware automatically attached 5. **Route Activation**: Routes available when HTTP server starts ## Integration Points This module integration integrates with: - **[System Behavior Overview](system-behavior.md)**: How modules participate in system bootstrap - **[Service Orchestration](service-orchestration.md)**: How modules operate as services - **[Operational Scenarios](operational-scenarios.md)**: Module behavior in specific scenarios - **[Architecture Modules](architecture-modules.md)**: Detailed module architecture ## Related Documentation - [System Behavior Overview](system-behavior.md) - System-level behavior - [Service Orchestration](service-orchestration.md) - Service coordination - [Operational Scenarios](operational-scenarios.md) - Module usage scenarios - [Architecture Modules](architecture-modules.md) - Module architecture details - [Module Requirements](module-requirements.md) - Module requirements and interfaces