Files

188 lines
7.7 KiB
Markdown

# Component Dependencies — Master CMS Module
## Package-Level Dependency Diagram
```mermaid
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
```mermaid
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
```mermaid
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
```mermaid
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` |