Files

7.7 KiB

Component Dependencies — Master CMS Module

Package-Level Dependency Diagram

graph TD
    Api["SlpModularCms.Api\n(shell)"]
    Master["SlpModularCms.Modules.Master\n(NEW)"]
    Availability["SlpModularCms.Modules.Availability\n(EXTENDED)"]
    Core["SlpModularCms.Core\n(unchanged)"]
    Frontend["Frontend\n(EXTENDED)"]
    SlaveCms["Slave CMS\n(another SlpModularCms instance)"]

    Api --> Master
    Api --> Availability
    Api --> Core
    Master --> Core
    Availability --> Core
    Frontend -->|"REST /api/v1/*"| Api
    Master -->|"HTTP slave API calls"| SlaveCms
    SlaveCms -->|"HTTP pull master status"| Master

    classDef new fill:#9ae6b4,stroke:#2f855a,stroke-width:2px,color:#000
    classDef extended fill:#FFC107,stroke:#F57F17,stroke-width:2px,color:#000
    classDef unchanged fill:#63b3ed,stroke:#2b6cb0,stroke-width:1px,color:#000
    classDef external fill:#FC8181,stroke:#C53030,stroke-width:2px,color:#000
    class Master new
    class Availability,Frontend extended
    class Api,Core unchanged
    class SlaveCms external

Text alternative: Master and Availability modules both depend on Core; Api depends on all three; Frontend calls Api REST; Master calls Slave CMS via HTTP and Slave pulls back.


Master-Backend Component Dependencies

graph TD
    Ctrl["CmsInstanceController"]
    Svc["CmsInstanceService"]
    Repo["CmsInstanceRepository"]
    DbCtx["MasterDbContext"]
    SlaveClient["SlaveApiClient"]
    BgSvc["IntegrityCheckBackgroundService"]
    Opts["MasterModuleOptions\n(IOptions)"]
    CmsEntity["CmsInstance\n(entity)"]

    Ctrl --> Svc
    Svc --> Repo
    Svc --> SlaveClient
    Svc --> Opts
    Repo --> DbCtx
    Repo --> CmsEntity
    DbCtx --> CmsEntity
    BgSvc --> Svc
    BgSvc --> Opts

    classDef controller fill:#63b3ed,stroke:#2b6cb0,stroke-width:1px,color:#000
    classDef service fill:#9ae6b4,stroke:#2f855a,stroke-width:2px,color:#000
    classDef data fill:#FFC107,stroke:#F57F17,stroke-width:2px,color:#000
    classDef infra fill:#CE93D8,stroke:#6A1B9A,stroke-width:1px,color:#000
    class Ctrl controller
    class Svc,SlaveClient service
    class Repo,DbCtx,CmsEntity data
    class BgSvc,Opts infra

Text alternative: Controller depends on Service; Service depends on Repository, SlaveApiClient, and Options; Repository owns DbContext and entity; BackgroundService depends on Service and Options.


Slave-Availability-Extension Component Dependencies

graph TD
    Middleware["AvailabilityMiddleware\n(EXTENDED)"]
    LocalSvc["IAvailabilityService\n(existing)"]
    MasterSvc["MasterAvailabilityService\n(NEW)"]
    AvailDb["AvailabilityDbContext\n(NEW)"]
    MasterRegEntity["MasterRegistration\n(entity)"]
    HttpFactory["IHttpClientFactory"]
    Opts["MasterModuleOptions\n(IOptions)"]
    AvailCtrl["AvailabilityController\n(EXTENDED)"]
    MasterCms["Master CMS\n(HTTP endpoint)"]

    Middleware --> LocalSvc
    Middleware --> MasterSvc
    MasterSvc --> AvailDb
    MasterSvc --> HttpFactory
    MasterSvc --> Opts
    AvailDb --> MasterRegEntity
    AvailCtrl --> AvailDb
    AvailCtrl --> Opts
    HttpFactory -->|"HTTP GET status"| MasterCms

    classDef middleware fill:#63b3ed,stroke:#2b6cb0,stroke-width:1px,color:#000
    classDef service fill:#9ae6b4,stroke:#2f855a,stroke-width:2px,color:#000
    classDef data fill:#FFC107,stroke:#F57F17,stroke-width:2px,color:#000
    classDef infra fill:#CE93D8,stroke:#6A1B9A,stroke-width:1px,color:#000
    classDef external fill:#FC8181,stroke:#C53030,stroke-width:2px,color:#000
    class Middleware middleware
    class MasterSvc,LocalSvc service
    class AvailDb,MasterRegEntity,AvailCtrl data
    class HttpFactory,Opts infra
    class MasterCms external

Text alternative: Extended middleware calls both MasterAvailabilityService and existing IAvailabilityService; MasterAvailabilityService reads DB for registration and pulls from master via HTTP; AvailabilityController handles registration writes.


Frontend Component Dependencies

graph TD
    CmsPage["CmsPage\n(/cms route)"]
    List["CmsInstanceList"]
    AddDialog["AddCmsInstanceDialog"]
    StatusDialog["SetStatusDialog"]
    HookList["useCmsInstances"]
    HookAdd["useAddCmsInstance"]
    HookStatus["useUpdateCmsInstanceStatus"]
    ApiTypes["CmsInstance types\nCmsInstanceStatus enum"]
    MasterApi["Master CMS REST API\n/api/v1/CmsInstances"]

    CmsPage --> List
    CmsPage --> AddDialog
    CmsPage --> StatusDialog
    List --> HookList
    AddDialog --> HookAdd
    StatusDialog --> HookStatus
    HookList --> ApiTypes
    HookAdd --> ApiTypes
    HookStatus --> ApiTypes
    HookList -->|"GET"| MasterApi
    HookAdd -->|"POST"| MasterApi
    HookStatus -->|"PUT"| MasterApi

    classDef page fill:#63b3ed,stroke:#2b6cb0,stroke-width:2px,color:#000
    classDef component fill:#9ae6b4,stroke:#2f855a,stroke-width:1px,color:#000
    classDef hook fill:#FFC107,stroke:#F57F17,stroke-width:1px,color:#000
    classDef types fill:#CE93D8,stroke:#6A1B9A,stroke-width:1px,color:#000
    classDef api fill:#FC8181,stroke:#C53030,stroke-width:2px,color:#000
    class CmsPage page
    class List,AddDialog,StatusDialog component
    class HookList,HookAdd,HookStatus hook
    class ApiTypes types
    class MasterApi api

Text alternative: CmsPage renders List + dialogs; List uses useCmsInstances; dialogs use mutation hooks; all hooks use shared API types and call Master REST API.


Dependency Matrix

Component Depends On Used By
CmsInstanceController ICmsInstanceService SlpModularCms.Api (module registration)
CmsInstanceService ICmsInstanceRepository, ISlaveApiClient, IOptions<MasterModuleOptions> CmsInstanceController, IntegrityCheckBackgroundService
CmsInstanceRepository MasterDbContext CmsInstanceService
MasterDbContext EF Core, CmsInstance entity CmsInstanceRepository
SlaveApiClient HttpClient (via IHttpClientFactory) CmsInstanceService
IntegrityCheckBackgroundService IServiceScopeFactory, ICmsInstanceService, IOptions<MasterModuleOptions> IHostedService (framework)
AvailabilityMiddleware (ext.) IAvailabilityService, IMasterAvailabilityService ASP.NET Core pipeline
MasterAvailabilityService AvailabilityDbContext, IHttpClientFactory, IOptions<MasterModuleOptions> AvailabilityMiddleware
AvailabilityDbContext EF Core, MasterRegistration entity MasterAvailabilityService, AvailabilityController
AvailabilityController (ext.) IAvailabilityService, AvailabilityDbContext, IOptions<MasterModuleOptions> SlpModularCms.Api
CmsPage CmsInstanceList, AddCmsInstanceDialog, SetStatusDialog React Router
useCmsInstances TanStack Query, API types CmsInstanceList
useAddCmsInstance TanStack Query, API types AddCmsInstanceDialog
useUpdateCmsInstanceStatus TanStack Query, API types SetStatusDialog

Cross-Cutting Concerns

Concern Mechanism
Authentication (API) JWT Bearer on all master endpoints; [Authorize(Policy = "OwnerOnly")] on CmsInstanceController
Authentication (Slave internal) X-Master-Api-Key header validated against MasterModuleOptions.ApiKey
API key secrecy ApiKey never included in CmsInstanceDto; only in CreateCmsInstanceRequest input
Fail-open MasterAvailabilityService returns cached status (default Available) on HTTP failure
Per-module migrations MasterDbContext in Modules.Master; AvailabilityDbContext in Modules.Availability; applied at startup in UseModule
Configuration MasterModuleOptions via IOptions<MasterModuleOptions>; section "MasterModule" in appsettings.json