Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -256,10 +256,11 @@ confirmation — and a declaration marked `preventDestroy: true` blocks even tha
| Auto-groups (dynamic groups) | the `dynamic` block on a group | [dynamic groups](docs/handbuch/dynamic-groups.md) |
| Group member field definitions (group-scoped, never deleted implicitly) | the `memberFields` block on a group | [group member fields](docs/handbuch/group-member-fields.md) |
| Repeated structure, parametrized | a plain function over the DSL | [blueprints](docs/handbuch/blueprints.md) |
| Permission scope master data (Bereiche, security levels, comment viewers) | `ct.department`, `ct.securityLevel`, `ct.commentViewer` | [permissions](docs/handbuch/permissions.md) |

Read-only by design: the person master-data model, security levels and
custom-field _definitions_ (`ct get person-masterdata`, `ct get data-fields`) —
schema in scope, per-record values never. See
Read-only by design: the person master-data model and custom-field
_definitions_ (`ct get person-masterdata`, `ct get data-fields`) — schema in
scope, per-record values never. See
[field definitions](docs/handbuch/field-definitions.md).

References are logical throughout: `groupType: "ministry_team"` resolves to that
Expand Down
11 changes: 6 additions & 5 deletions docs/api-coverage.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,12 @@ API-client libraries (5pm-HDH `churchtools-api` @ CT 3.104, bensteUEM
`src/api/schema.d.ts` is git-ignored and was not available offline. Re-verify per
the runbook's re-audit procedure once the schema is regenerated.

| Resource | Matched path(s) | GET | POST/PUT/PATCH/DELETE | Verdict |
| ------------------------------------ | ----------------------------------------- | ------------------ | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Person master-data model | `/person/masterdata` | ✅ (single object) | ❌ | **Read-only.** Versionable master-data model incl. the `securityLevels` enumeration. No write endpoint (edited in the CT master-data admin UI). |
| Data-field definitions (Datenfelder) | `/dbfields`, `/dbfields/{id}` | list ✅ / by-id ✅ | ❌ | **Read-only.** Unified person + group field definitions, discriminated by `fieldCategory`. Mutation only via legacy churchdb AJAX (`db_insert/update/deletefields`), not REST. |
| Security levels | `/securitylevels`, `/securitylevels/{id}` | list ✅ / by-id ✅ | ✅ POST, PATCH, DELETE | **Full CRUD — but not on the usual paths.** Live-probed 2026-08-14 (eqrm-dev, CT 3.135.2): `/securitylevels` is GET-only, and **create is `POST /securitylevels/{id}`** (body `{name}`), update is `PATCH /securitylevels/{id}` (body `{name, newid, forcereorder}` — reordering is first-class), delete is `DELETE /securitylevels/{id}`. **Managed since #110** — the registry gained a `createPath` hook and a `callerAssignedId` flag for it; `ct.securityLevel({ key, id, name })` declares one, `ct adopt security-level <id>` adopts one. Changing a declared id is refused at plan time (that is a renumber, which rewrites what every numeric `cc_securitylevel` scope means). Resolvable by name as a scope ref since #110. The ids are NOT protocol constants — `cc_securitylevel` is an editable master-data table with an auto-increment id. |
| Resource | Matched path(s) | GET | POST/PUT/PATCH/DELETE | Verdict |
| ------------------------------------ | ------------------------------------------------------- | ------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Person master-data model | `/person/masterdata` | ✅ (single object) | ❌ | **Read-only.** Versionable master-data model incl. the `securityLevels` enumeration. No write endpoint (edited in the CT master-data admin UI). |
| Data-field definitions (Datenfelder) | `/dbfields`, `/dbfields/{id}` | list ✅ / by-id ✅ | ❌ | **Read-only.** Unified person + group field definitions, discriminated by `fieldCategory`. Mutation only via legacy churchdb AJAX (`db_insert/update/deletefields`), not REST. |
| Security levels | `/securitylevels`, `/securitylevels/{id}` | list ✅ / by-id ✅ | ✅ POST, PATCH, DELETE | **Full CRUD — but not on the usual paths.** Live-probed 2026-08-14 (eqrm-dev, CT 3.135.2): `/securitylevels` is GET-only, and **create is `POST /securitylevels/{id}`** (body `{name}`), update is `PATCH /securitylevels/{id}` (body `{name, newid, forcereorder}` — reordering is first-class), delete is `DELETE /securitylevels/{id}`. **Managed since #110** — the registry gained a `createPath` hook and a `callerAssignedId` flag for it; `ct.securityLevel({ key, id, name })` declares one, `ct adopt security-level <id>` adopts one. Changing a declared id is refused at plan time (that is a renumber, which rewrites what every numeric `cc_securitylevel` scope means). Resolvable by name as a scope ref since #110. The ids are NOT protocol constants — `cc_securitylevel` is an editable master-data table with an auto-increment id. |
| Comment viewers (Kommentare-Viewer) | `/person/commentviewers`, `/person/commentviewers/{id}` | list ✅ / by-id ✅ | ✅ POST, PUT, DELETE | **Full CRUD on conventional paths.** Fully live-probed 2026-08-26 (eqrm-dev, CT 3.135.2 — one throwaway row created, read, updated and deleted): `GET /person/commentviewers` returns a flat `[{id, name, nameTranslated, sortKey}]` (`id: 0` — "Alle" — is a real, built-in row), **create is a plain `POST /person/commentviewers`** with CT minting the id, and the item path takes GET/PUT/DELETE (an absent id gives a clean 404 `error.notfound`). `nameTranslated` is derived from `name`, not independently writable. **Managed since #151** — `ct.commentViewer({ key, name, sortKey })` declares one, `ct adopt comment-viewer <id>` adopts one; no registry machinery was needed (CT mints the id, and the writes are REST). `cdb_comment_viewer` is the scope dimension of `churchdb:view comments`, and it was the last one a config could not express portably: the ids differ across hosts of the same deployment, and before #151 a config had only the raw numeric `dataId`. The minted id is an auto-increment that does not reuse deleted rows, so it can never be caller-assigned. |

See [`docs/handbuch/field-definitions.md`](handbuch/field-definitions.md) for the full writability
decision, evidence, and the schema/values boundary.
4 changes: 2 additions & 2 deletions docs/handbuch/blueprints.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ sources:
- src/config/context.ts
- src/engine/graph.ts
- src/engine/hierarchy.ts
sources_hash: ed5171960e9206fa
reviewed: 2026-08-17
sources_hash: bb6f89956ace833d
reviewed: 2026-08-26
---

# Blueprints (parametrized, reusable config)
Expand Down
4 changes: 2 additions & 2 deletions docs/handbuch/group-member-fields.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
---
sources_hash: 0dd7d04768dda2d2
sources_hash: 777badbcc7fbbd7f
title: Group member fields
sources:
- src/engine/member-fields.ts
- src/engine/synthetic.ts
- src/config/context.ts
- src/commands/adopt-group.ts
- src/commands/destroy.ts
reviewed: 2026-08-24
reviewed: 2026-08-26
---

# Group member fields (#135)
Expand Down
Loading
Loading