Adds SlpModularCms.Api.SlpSoftware and extracts shared CmsHost composition #9

Merged
Sluijsens merged 6 commits from feature/slpsoftware-api into master 2026-08-02 23:46:01 +02:00
Owner

Summary

  • Unit 1 of the slpsoftware-api feature (FR-1/FR-2/FR-3): adds a new SlpModularCms.Api.SlpSoftware Client project, intended to eventually become the deployed API for est.slpsoftware.nl/slpsoftware.nl
  • Extracts the hosting-pipeline composition from SlpModularCms.Api/Program.cs into shared SlpModularCms.Core.Hosting.CmsHost (ConfigureServices/ConfigurePipeline), so both Client projects call the same code instead of duplicating it
  • Moves StaticContentExtensions.cs + WebsitePlaceholder.html from Api into Core (required since Core cannot depend on Api)
  • Adds SlpModularCms.Api.Tests with WebApplicationFactory-based pipeline regression tests (security headers, health check, SPA fallback, rate limiting)
  • Adds a dev:slpsoftware frontend pnpm script mirroring the existing dev:slave
  • Fixes GlobalExceptionHandler logging routine 401s (e.g. an expired/missing refresh token) as unhandled errors -- pre-existing, unrelated to this feature, found while testing the new instance

Test plan

  • Full solution build succeeds
  • SlpModularCms.Core.Tests: 196/196 passed (no regression from the file move)
  • SlpModularCms.Api.Tests (new): 4/4 passed
  • Manual smoke test of SlpModularCms.Api.SlpSoftware locally (setup flow, login)

Full traceability (requirements, decisions, design, per-stage Q&A) is documented under idlc-docs/features/slpsoftware-api/.

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

## Summary - Unit 1 of the slpsoftware-api feature (FR-1/FR-2/FR-3): adds a new SlpModularCms.Api.SlpSoftware Client project, intended to eventually become the deployed API for est.slpsoftware.nl/slpsoftware.nl - Extracts the hosting-pipeline composition from SlpModularCms.Api/Program.cs into shared SlpModularCms.Core.Hosting.CmsHost (ConfigureServices/ConfigurePipeline), so both Client projects call the same code instead of duplicating it - Moves StaticContentExtensions.cs + WebsitePlaceholder.html from Api into Core (required since Core cannot depend on Api) - Adds SlpModularCms.Api.Tests with WebApplicationFactory-based pipeline regression tests (security headers, health check, SPA fallback, rate limiting) - Adds a dev:slpsoftware frontend pnpm script mirroring the existing dev:slave - Fixes GlobalExceptionHandler logging routine 401s (e.g. an expired/missing refresh token) as unhandled errors -- pre-existing, unrelated to this feature, found while testing the new instance ## Test plan - [x] Full solution build succeeds - [x] SlpModularCms.Core.Tests: 196/196 passed (no regression from the file move) - [x] SlpModularCms.Api.Tests (new): 4/4 passed - [x] Manual smoke test of SlpModularCms.Api.SlpSoftware locally (setup flow, login) Full traceability (requirements, decisions, design, per-stage Q&A) is documented under idlc-docs/features/slpsoftware-api/. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sluijsens added 1 commit 2026-08-02 01:33:08 +02:00
Adds SlpModularCms.Api.SlpSoftware and extracts shared CmsHost composition
Continuous Integration / config (pull_request) Successful in 11s
Continuous Integration / changes (pull_request) Successful in 21s
Continuous Integration / backend-build (pull_request) Successful in 6m10s
Continuous Integration / vulnerability-scan (pull_request) Successful in 4m59s
Continuous Integration / frontend-prepare (pull_request) Successful in 1m27s
Continuous Integration / backend-test (pull_request) Failing after 7m48s
Continuous Integration / frontend-build (pull_request) Successful in 2m5s
Continuous Integration / frontend-test (pull_request) Successful in 4m24s
Continuous Integration / frontend-lint (pull_request) Successful in 2m0s
Continuous Integration / publish-test (pull_request) Skipped
Continuous Integration / publish-production (pull_request) Skipped
Continuous Integration / deploy-test (pull_request) Skipped
Continuous Integration / deploy-production (pull_request) Skipped
fa389e42ee
Unit 1 of the slpsoftware-api feature (FR-1/FR-2/FR-3): a new Client project
in the Clients solution folder, intended to eventually become the deployed
API for test.slpsoftware.nl/slpsoftware.nl, hosting the same four modules as
SlpModularCms.Api plus a future Offerings module.

- Extracts SlpModularCms.Api/Program.cs's hosting-pipeline composition into
  SlpModularCms.Core.Hosting.CmsHost (ConfigureServices/ConfigurePipeline),
  shared by both Client projects so they cannot drift apart
- Moves StaticContentExtensions.cs + WebsitePlaceholder.html from Api into
  Core, since CmsHost cannot live in Api but Core cannot depend on Api
- Adds SlpModularCms.Api.SlpSoftware with its own isolated local dev database
  and dev ports (5286/7223, distinct from Api's and Api.Slave's)
- Adds SlpModularCms.Api.Tests with WebApplicationFactory-based pipeline
  regression tests (security headers, health check, SPA fallback, rate
  limiting), scoped to Api per NFR Design
- Adds a frontend dev:slpsoftware pnpm script mirroring dev:slave
- Fixes GlobalExceptionHandler logging routine 401s (e.g. an expired/missing
  refresh token) as unhandled errors -- pre-existing, unrelated to this
  feature's own scope, found while testing the new instance

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FWyStNL2ZsjrS7FLd7xvvN
Sluijsens added 1 commit 2026-08-02 10:47:19 +02:00
Adds a MariaDB service to backend-test for SlpModularCms.Api.Tests
Continuous Integration / config (pull_request) Successful in 12s
Continuous Integration / changes (pull_request) Successful in 22s
Continuous Integration / backend-build (pull_request) Successful in 5m52s
Continuous Integration / vulnerability-scan (pull_request) Successful in 5m6s
Continuous Integration / frontend-prepare (pull_request) Successful in 1m24s
Continuous Integration / backend-test (pull_request) Failing after 8m24s
Continuous Integration / frontend-build (pull_request) Successful in 2m14s
Continuous Integration / frontend-test (pull_request) Successful in 4m28s
Continuous Integration / frontend-lint (pull_request) Successful in 2m5s
Continuous Integration / publish-test (pull_request) Skipped
Continuous Integration / publish-production (pull_request) Skipped
Continuous Integration / deploy-test (pull_request) Skipped
Continuous Integration / deploy-production (pull_request) Skipped
0feedf9c01
The new pipeline regression tests boot the real Api host via
WebApplicationFactory, which unconditionally runs the startup database
migration -- unlike every other test project here, which mocks or uses EF
Core InMemory. CI had no MariaDB service at all, so those tests failed on
the connection itself. Adds a mariadb service container to the backend-test
job plus a ConnectionStrings__DefaultConnection override for that step,
which overrides the appsettings.Development.json placeholder via standard
config layering without touching any committed appsettings file or
affecting local test runs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FWyStNL2ZsjrS7FLd7xvvN
Sluijsens added 1 commit 2026-08-02 11:35:09 +02:00
Replaces the backend-test MariaDB service with an explicit docker run
Continuous Integration / config (pull_request) Successful in 12s
Continuous Integration / changes (pull_request) Successful in 22s
Continuous Integration / backend-build (pull_request) Successful in 5m41s
Continuous Integration / vulnerability-scan (pull_request) Successful in 5m8s
Continuous Integration / frontend-prepare (pull_request) Successful in 1m52s
Continuous Integration / backend-test (pull_request) Successful in 7m35s
Continuous Integration / frontend-build (pull_request) Successful in 2m18s
Continuous Integration / frontend-test (pull_request) Successful in 4m43s
Continuous Integration / frontend-lint (pull_request) Successful in 2m15s
Continuous Integration / publish-production (pull_request) Skipped
Continuous Integration / deploy-production (pull_request) Skipped
Continuous Integration / publish-test (pull_request) Successful in 7m7s
Continuous Integration / deploy-test (pull_request) Skipped
b6e9c07c06
The services: block was silently broken on this runner: job and service
containers both use host networking here, so the ports: mapping was
ignored and the mariadb:11 service ended up sharing the host's own port
3306 -- which something else on this runner already answers on (root auth
was rejected with a password nothing but this job ever set). Replaced with
an explicit `docker run` on host port 3307, bypassing that collision, plus
a readiness loop. Also fixes the readiness command itself: mariadb:11 does
not provide a `mysqladmin` alias, the correct binary is `mariadb-admin`
(verified locally against the exact image before pushing this).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FWyStNL2ZsjrS7FLd7xvvN
Sluijsens added 1 commit 2026-08-02 16:28:30 +02:00
Adds the Offerings module and retargets the CI/CD pipeline to Api.SlpSoftware
Continuous Integration / config (pull_request) Successful in 12s
Continuous Integration / changes (pull_request) Successful in 22s
Continuous Integration / backend-build (pull_request) Successful in 5m53s
Continuous Integration / vulnerability-scan (pull_request) Successful in 5m46s
Continuous Integration / frontend-prepare (pull_request) Successful in 1m54s
Continuous Integration / backend-test (pull_request) Successful in 7m37s
Continuous Integration / frontend-build (pull_request) Successful in 2m14s
Continuous Integration / frontend-test (pull_request) Successful in 4m59s
Continuous Integration / frontend-lint (pull_request) Successful in 2m2s
Continuous Integration / publish-production (pull_request) Skipped
Continuous Integration / deploy-production (pull_request) Skipped
Continuous Integration / publish-test (pull_request) Successful in 7m34s
Continuous Integration / deploy-test (pull_request) Skipped
cfb06b28b6
Implements Unit 2 "Offerings" (backend module, admin CRUD UI with
drag-and-drop reordering, public GET /api/v1/offerings endpoint) and
executes the feature's D-15 CI/CD cutover, switching the deploy
pipeline's build/publish target from SlpModularCms.Api to
SlpModularCms.Api.SlpSoftware.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FWyStNL2ZsjrS7FLd7xvvN
Sluijsens added 2 commits 2026-08-02 16:38:31 +02:00
Confirms existing tag-based Sentry alerting and domain-based UptimeRobot/
Umami monitoring already cover the Offerings module and the Api.SlpSoftware
cutover with no new configuration. Closes the SECURITY-13 audit-trail open
item and records the final production-readiness traceability, completing
the slpsoftware-api feature's AI-DLC lifecycle.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FWyStNL2ZsjrS7FLd7xvvN
Cancels superseded PR CI runs on a new push, never during a live deploy
Continuous Integration / config (pull_request) Successful in 11s
Continuous Integration / changes (pull_request) Successful in 22s
Continuous Integration / backend-build (pull_request) Successful in 5m33s
Continuous Integration / vulnerability-scan (pull_request) Successful in 4m50s
Continuous Integration / frontend-prepare (pull_request) Successful in 2m0s
Continuous Integration / backend-test (pull_request) Successful in 7m54s
Continuous Integration / frontend-build (pull_request) Successful in 2m9s
Continuous Integration / frontend-test (pull_request) Successful in 5m4s
Continuous Integration / frontend-lint (pull_request) Successful in 1m56s
Continuous Integration / publish-production (pull_request) Skipped
Continuous Integration / deploy-production (pull_request) Skipped
Continuous Integration / publish-test (pull_request) Successful in 7m14s
Continuous Integration / deploy-test (pull_request) Skipped
c43528b7b2
A new push to a PR previously left the prior CI attempt running
independently instead of superseding it. Scoped strictly to
pull_request events, since deploy-test/deploy-production only ever
run on a push to master or a manual workflow_dispatch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FWyStNL2ZsjrS7FLd7xvvN
Sluijsens merged commit 1ba945fa45 into master 2026-08-02 23:46:01 +02:00
Sluijsens deleted branch feature/slpsoftware-api 2026-08-02 23:46:01 +02:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: SLP_Software/slp-modular-cms#9