feat: admin settings API — GET/PUT settings, test connectivity #104

Merged
forbes merged 3 commits from feat-admin-settings-api into feat-module-system 2026-02-15 08:48:05 +00:00
Owner

Summary

Adds four admin-only API endpoints for reading and modifying server settings at runtime.

Endpoints

  • GET /api/admin/settings — full config grouped by module, secrets redacted
  • GET /api/admin/settings/{module} — single module config block
  • PUT /api/admin/settings/{module} — toggle modules + persist config overrides
  • POST /api/admin/settings/{module}/test — test external connectivity (database, storage)

Key behaviors

  • Secret redaction: passwords, API keys, session secrets shown as ****
  • Module toggle: PUT with {"enabled": false} disables a module via registry + DB persistence
  • Dependency validation: cannot enable DAG without Jobs, cannot disable required modules
  • Config overrides: persisted to settings_overrides table for future hot-reload; changes to database/storage/server/schemas return restart_required: true
  • SSE broadcast: settings.changed event published on every PUT
  • Connectivity test: database and storage pings with latency measurement

New files

  • internal/db/settings.go — SettingsRepository (module_state + settings_overrides CRUD)
  • internal/api/settings_handlers.go — 4 handlers + config build helpers
  • internal/api/settings_handlers_test.go — 8 integration tests

Modified files

  • internal/api/handlers.go — add settings field, wire in NewServer
  • internal/api/routes.go — add /api/admin/settings route group

Closes #99
Depends on #102 (module system)

## Summary Adds four admin-only API endpoints for reading and modifying server settings at runtime. ### Endpoints - `GET /api/admin/settings` — full config grouped by module, secrets redacted - `GET /api/admin/settings/{module}` — single module config block - `PUT /api/admin/settings/{module}` — toggle modules + persist config overrides - `POST /api/admin/settings/{module}/test` — test external connectivity (database, storage) ### Key behaviors - **Secret redaction**: passwords, API keys, session secrets shown as `****` - **Module toggle**: PUT with `{"enabled": false}` disables a module via registry + DB persistence - **Dependency validation**: cannot enable DAG without Jobs, cannot disable required modules - **Config overrides**: persisted to `settings_overrides` table for future hot-reload; changes to database/storage/server/schemas return `restart_required: true` - **SSE broadcast**: `settings.changed` event published on every PUT - **Connectivity test**: database and storage pings with latency measurement ### New files - `internal/db/settings.go` — SettingsRepository (module_state + settings_overrides CRUD) - `internal/api/settings_handlers.go` — 4 handlers + config build helpers - `internal/api/settings_handlers_test.go` — 8 integration tests ### Modified files - `internal/api/handlers.go` — add `settings` field, wire in NewServer - `internal/api/routes.go` — add `/api/admin/settings` route group Closes #99 Depends on #102 (module system)
forbes added 3 commits 2026-02-14 21:16:34 +00:00
Provides CRUD operations on the module_state and settings_overrides
tables (created in migration 016).

- GetModuleStates / SetModuleState — upsert module enabled/disabled
- GetOverrides / SetOverride / DeleteOverride — JSONB config overrides

Part of #99
Add four admin-only endpoints under /api/admin/settings:

- GET  /                — full config (secrets redacted)
- GET  /{module}        — single module config
- PUT  /{module}        — toggle modules + persist config overrides
- POST /{module}/test   — test external connectivity (database, storage)

PUT publishes a settings.changed SSE event. Config overrides are
persisted for future hot-reload support; changes to database/storage/
server/schemas namespaces return restart_required: true.

Wires SettingsRepository into Server struct.

Closes #99
- TestGetAllSettings — all module keys present, secrets redacted
- TestGetModuleSettings — single module response
- TestGetModuleSettings_Unknown — 404 for unknown module
- TestToggleModule — disable projects, verify registry state
- TestToggleModule_DependencyError — enable dag without jobs, expect 400
- TestToggleRequiredModule — disable core, expect 400
- TestTestConnectivity_Database — ping database, expect success
- TestTestConnectivity_NotTestable — core module, expect 400
forbes merged commit a6267ba3d5 into feat-module-system 2026-02-15 08:48:05 +00:00
forbes deleted branch feat-admin-settings-api 2026-02-15 08:48:05 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kindred/silo#104