5.9 KiB
Unit of Work — Master CMS Module
Unit Decomposition Overview
| # | Unit Slug | Project(s) | Test Project | Construction Cycle |
|---|---|---|---|---|
| 1 | master-backend |
SlpModularCms.Modules.Master (NEW) |
SlpModularCms.Modules.Master.Tests (NEW) |
FD → NFR Req → NFR Design → Code Gen |
| 2 | slave-availability-extension |
SlpModularCms.Modules.Availability (EXTENDED) |
SlpModularCms.Modules.Availability.Master.Tests (NEW) |
FD → NFR Req → NFR Design → Code Gen |
| 3 | frontend-cms-page |
frontend/ (EXTENDED) |
Existing frontend test setup | FD → NFR Req → NFR Design → Code Gen |
| 4 | documentation |
README.md, frontend/README.md |
N/A | Code Gen only |
Unit 1 — master-backend
Project: src/SlpModularCms.Modules.Master/ (new project added to solution)
Test Project: src/SlpModularCms.Modules.Master.Tests/ (new; parallel to existing Availability.Tests)
Construction Cycle: Functional Design → NFR Requirements → NFR Design → Code Generation
Scope:
- New
SlpModularCms.Modules.Masterclass library project MasterModule : IModule— module registration, service wiring, migration applicationMasterDbContext— per-module EF Core DbContext; ownsCmsInstancestableCmsInstanceentity +CmsInstanceStatusenumICmsInstanceRepository/CmsInstanceRepository— data accessICmsInstanceService/CmsInstanceService— business orchestrationISlaveApiClient/SlaveApiClient— typed HTTP client for master → slave callsCmsInstanceController— REST endpoints (GET,POST,PUT /status) with[Authorize(Policy = "OwnerOnly")]IntegrityCheckBackgroundService— periodic master URL integrity verificationMasterModuleOptions— configuration POCO- DTOs:
CmsInstanceDto,CreateCmsInstanceRequest,UpdateStatusRequest - EF Core migrations for
CmsInstancestable
Dependencies: SlpModularCms.Core (for IModule, shared types)
Deliverables:
- Functional, tested module registered in
SlpModularCms.Api - REST API endpoints accessible to Owner role
- Background service running on master CMS startup
- EF Core migration applied at startup
Unit 2 — slave-availability-extension
Project: src/SlpModularCms.Modules.Availability/ (existing project, extended)
Test Project: src/SlpModularCms.Modules.Availability.Master.Tests/ (new; separate from existing Availability.Tests to isolate master-related slave changes)
Construction Cycle: Functional Design → NFR Requirements → NFR Design → Code Generation
Scope:
MasterRegistrationentity — stores master URL on slave sideAvailabilityDbContext— new per-module EF Core DbContext in Availability module; ownsMasterRegistrationstableIMasterAvailabilityService/MasterAvailabilityService— pull/cache/fallback service; static field cachingAvailabilityMiddleware(extended) — two-phase gate: Master gate (outer) + existing local gate (inner)AvailabilityController(extended) —POST /api/internal/master/registerendpoint addedRegisterMasterRequestrequest modelMasterGateResultresult record- EF Core migrations for
MasterRegistrationstable GET /api/internal/master/registrationendpoint (read registered master URL, used by integrity check)
Dependencies: Unit 1 API contract (endpoint schemas that slave exposes must match what ISlaveApiClient calls)
Deliverables:
- Two-phase availability gate active on slave CMS instances
- Slave accepts master registration calls with API key validation
- Slave pulls and caches master status with fail-open fallback
- EF Core migration applied at startup
Unit 3 — frontend-cms-page
Project: frontend/ (existing React SPA, extended)
Test Project: Existing frontend test setup (no separate test project added)
Construction Cycle: Functional Design → NFR Requirements → NFR Design → Code Generation
Scope:
CmsPage— page component at route/cms; Owner-only guardCmsInstanceList— table component with status badges; Inactive rows greyed outAddCmsInstanceDialog— modal form (Name, URL, ApiKey)SetStatusDialog— modal with status dropdown and conditional DisableMessage fielduseCmsInstances.ts— TanStack Query hook: GET/api/v1/CmsInstancesuseAddCmsInstance.ts— TanStack Query mutation: POST/api/v1/CmsInstancesuseUpdateCmsInstanceStatus.ts— TanStack Query mutation: PUT/api/v1/CmsInstances/{id}/status- TypeScript types:
CmsInstance,CmsInstanceStatusenum - Route registration in existing router
Dependencies: Unit 1 REST API (endpoint definitions must be finalized before frontend hooks)
Deliverables:
/cmspage renders list of slave CMSes- Owner can add a slave and set its status
- Status badge display for all three states; Inactive greyed out
- Mandatory DisableMessage enforced in UI when NotAvailable selected
Unit 4 — documentation
Files: README.md (root), frontend/README.md
Test Project: N/A
Construction Cycle: Code Generation only (Functional Design, NFR Requirements, NFR Design skipped — documentation-only unit)
Scope (per FR-MASTER-15):
README.md— "Database Migraties" section: document per-module migration patternREADME.md— "Nieuwe Module Toevoegen" section: document optional per-module DbContext patternREADME.md— "Productie Setup" section: addMasterModule__CacheMinutesandMasterModule__IntegrityCheckIntervalMinutesenv varsfrontend/README.md— replace boilerplate with project-specific content
Dependencies: Units 1–3 (must be complete so final patterns are known before documenting)
Deliverables:
- README accurately reflects per-module migration workflow
- Module guide covers optional DbContext pattern
- Production env vars list is complete
- Frontend README is project-specific and useful