Adds 2 units and docs for unit 3. nfr-requirements plan

This commit is contained in:
2026-06-29 22:18:37 +02:00
parent 0e01ca1e1c
commit c156107cb1
126 changed files with 15204 additions and 80199 deletions
@@ -0,0 +1,103 @@
# Unit of Work Dependencies — Master CMS Module
## Dependency Matrix
| Unit | Depends On | Reason |
|------|-----------|--------|
| Unit 1 — master-backend | `SlpModularCms.Core` only | No unit dependencies; builds the API contract that others consume |
| Unit 2 — slave-availability-extension | Unit 1 (API contract) | Slave endpoints must match what `ISlaveApiClient` calls; registration endpoint schema defined in Unit 1 |
| Unit 3 — frontend-cms-page | Unit 1 (REST API) | Frontend hooks call `/api/v1/CmsInstances`; endpoint shapes must be finalized |
| Unit 4 — documentation | Units 1, 2, 3 | Documents final patterns after all code is complete |
## Implementation Sequence
```mermaid
graph LR
U1["Unit 1\nmaster-backend"]
U2["Unit 2\nslave-availability-extension"]
U3["Unit 3\nfrontend-cms-page"]
U4["Unit 4\ndocumentation"]
U1 --> U2
U1 --> U3
U2 --> U4
U3 --> U4
classDef unit1 fill:#9ae6b4,stroke:#2f855a,stroke-width:2px,color:#000
classDef unit2 fill:#63b3ed,stroke:#2b6cb0,stroke-width:2px,color:#000
classDef unit3 fill:#FFC107,stroke:#F57F17,stroke-width:2px,color:#000
classDef unit4 fill:#CE93D8,stroke:#6A1B9A,stroke-width:2px,color:#000
class U1 unit1
class U2 unit2
class U3 unit3
class U4 unit4
```
Text alternative: Unit 1 (master-backend) must complete first; Unit 2 and Unit 3 both depend on Unit 1 and can be worked on in parallel after Unit 1 is done; Unit 4 (documentation) depends on all three.
## Package Change Sequence
```mermaid
graph TD
Core["SlpModularCms.Core\n(no changes)"]
MasterMod["SlpModularCms.Modules.Master\nUnit 1 — new project"]
AvailMod["SlpModularCms.Modules.Availability\nUnit 2 — extended"]
Api["SlpModularCms.Api\nregisters Master module"]
Frontend["frontend/\nUnit 3 — /cms page"]
Docs["README.md\nfrontend/README.md\nUnit 4"]
MasterTests["SlpModularCms.Modules.Master.Tests\nUnit 1 — new test project"]
AvailMasterTests["SlpModularCms.Modules.Availability.Master.Tests\nUnit 2 — new test project"]
Core --> MasterMod
Core --> AvailMod
MasterMod --> AvailMod
MasterMod --> Api
AvailMod --> Api
Api --> Frontend
Frontend --> Docs
MasterMod --> MasterTests
AvailMod --> AvailMasterTests
classDef unchanged fill:#B0BEC5,stroke:#546E7A,stroke-width:1px,color:#000
classDef unit1 fill:#9ae6b4,stroke:#2f855a,stroke-width:2px,color:#000
classDef unit2 fill:#63b3ed,stroke:#2b6cb0,stroke-width:2px,color:#000
classDef unit3 fill:#FFC107,stroke:#F57F17,stroke-width:2px,color:#000
classDef unit4 fill:#CE93D8,stroke:#6A1B9A,stroke-width:2px,color:#000
classDef tests fill:#FC8181,stroke:#C53030,stroke-width:1px,color:#000
class Core,Api unchanged
class MasterMod unit1
class AvailMod unit2
class Frontend unit3
class Docs unit4
class MasterTests,AvailMasterTests tests
```
Text alternative: Core unchanged; Unit 1 (Modules.Master) created first; Unit 2 (Availability extended) and Unit 3 (frontend) build on top; Api shell registers new module; Unit 4 docs come last; two new test projects created.
## Inter-Unit API Contracts
The following interfaces form the boundary between units. These must be finalized during Unit 1 before Unit 2 and Unit 3 can proceed.
| Contract | Defined In | Consumed By |
|----------|-----------|-------------|
| `POST /api/internal/master/register` | Unit 2 (slave exposes it) | Unit 1 (`SlaveApiClient` calls it) |
| `GET /api/internal/master/registration` | Unit 2 (slave exposes it) | Unit 1 (`SlaveApiClient` calls it for integrity check) |
| `PUT /api/v1/Availability/admin/status` | Unit 2 (existing, unchanged) | Unit 1 (`SlaveApiClient` reuses it for status push) |
| `GET /api/v1/CmsInstances` | Unit 1 (master exposes it) | Unit 3 (`useCmsInstances` hook) |
| `POST /api/v1/CmsInstances` | Unit 1 (master exposes it) | Unit 3 (`useAddCmsInstance` hook) |
| `PUT /api/v1/CmsInstances/{id}/status` | Unit 1 (master exposes it) | Unit 3 (`useUpdateCmsInstanceStatus` hook) |
## Parallel Development Opportunities
After Unit 1 is complete and its API contracts are finalized:
- **Unit 2 and Unit 3 can be developed in parallel** — they share no direct dependency on each other; both only depend on Unit 1's REST API contract
- **Unit 4** must wait for all three units to be complete
## Risk Notes
| Risk | Unit | Mitigation |
|------|------|-----------|
| Slave endpoint schema changes after Unit 2 starts | 2 | Finalize `ISlaveApiClient` method signatures in Unit 1 before Unit 2 construction begins |
| Frontend type drift from actual API response shape | 3 | Generate TypeScript types from Unit 1 `CmsInstanceDto` definition; keep in sync during code generation |
| Per-module migration pattern new to codebase | 1, 2 | Apply pattern in Unit 1 first; Unit 2 follows the same pattern |