dorfteich/apps/api/src
Claude Fable 5 c2a4dde5cc
Some checks failed
CI / Lint, typecheck, test (pull_request) Successful in 6m50s
CI / Build container images (pull_request) Successful in 3m57s
CI / Auth e2e pack (pull_request) Failing after 6m18s
CI / Import/export fidelity gate (pull_request) Has been skipped
Invitation flow with per-user quota (#332)
Any authenticated user can invite an e-mail address; the mailed
single-use token lets exactly one signup through even while
registration is closed. Open (pending, unexpired) invitations count
against the new instance setting invitations.maxOpenPerUser (default 5,
0 disables inviting) — plus a 20/day per-user rate limit so a
revoke-and-recreate loop cannot become a mail cannon. Only the SHA-256
token hash is stored (auth-tokens pattern); a failed signup (taken
username) un-redeems the token so the invitee can retry.

Surfaces: invitations section in the user settings (list, invite,
revoke, quota line; wide table in a focusable .table-scroll region),
signup page reads ?invitation=<token> (preview banner, e-mail prefill,
closed-mode gate opens only for a previewed-valid token), admin general
card gets the quota field (flat RHF name per #322; VS-NfD marked and
hideable).

Governance: audit actions invitation.created/revoked/accepted
(catalogue 1.10), VS-NfD profile entry (compliant: 0) + hardening-guide
row, i18n de+en including the invitation mail template.

Tests: api e2e-db (mail link, closed-mode single-use signup with
un-redeem on failure, quota + revoke frees slot, quota 0 = 403, auth
matrix), new web e2e pack invitations.spec.ts (full UI loop through
Mailpit, wired into ci.yml with its own rate-limit reset), a11y scan
waits for the new section. Full api suite (107 files / 607 tests),
auth/admin-settings/a11y packs green against a fresh local stack.

Closes #332
2026-08-05 12:44:20 +02:00
..
admin Admin can create user accounts directly (#331) 2026-08-05 12:23:01 +02:00
audit Invitation flow with per-user quota (#332) 2026-08-05 12:44:20 +02:00
auth Invitation flow with per-user quota (#332) 2026-08-05 12:44:20 +02:00
backup #192: deploy-level backup target allowlist 2026-07-30 12:17:14 +02:00
branding #307: pond-level branding overrides the instance logo and favicon 2026-08-01 20:44:02 +02:00
comments Notify watchers about page changes and comments, with an in-app center (#94) 2026-07-11 23:20:25 +02:00
common #197: security response headers and an explicitly restrictive CORS policy 2026-07-30 17:13:24 +02:00
compaction Fix compaction test Bytes typing for strict typecheck (#40) 2026-07-09 08:23:55 +02:00
config Add backup sidecar: nightly dump, volume archive, prune, status, restore (#83) 2026-07-11 17:29:15 +02:00
favorites Favorites: personal page stars, golden icons, sidebar filter (#132) 2026-07-16 12:03:55 +02:00
files #302: configurable pond start page, created with every new pond 2026-08-01 08:06:35 +02:00
fonts #304: declare the font-list route's access rule explicitly 2026-08-01 18:46:47 +02:00
grants #217: map IdP groups and roles onto the permission model 2026-07-31 13:09:11 +02:00
health Nextcloud backup target: admin-configured, manual + scheduled uploads, in-app restore (#103) 2026-07-12 10:39:18 +02:00
home Editable landing page for the Site Admin 2026-07-12 23:50:16 +02:00
i18n #302: configurable pond start page, created with every new pond 2026-08-01 08:06:35 +02:00
import-export #305: a full pond archive before deletion and before purge 2026-08-01 20:24:35 +02:00
inspector Add effective-permissions inspector (#57) 2026-07-10 00:00:27 +02:00
invitations Invitation flow with per-user quota (#332) 2026-08-05 12:44:20 +02:00
labels Wire real permissions into collab tokens and revocation (#53) 2026-07-09 18:48:42 +02:00
legal Add instance legal pages with public rendering and footer links (#82) 2026-07-11 16:40:04 +02:00
links Fix latenten Flake in links.service.db.test (Phantom-Sortierung) 2026-07-19 06:12:55 +02:00
mail Invitation flow with per-user quota (#332) 2026-08-05 12:44:20 +02:00
mcp #222: read-access trail for classified pages 2026-07-31 12:12:55 +02:00
members #302: configurable pond start page, created with every new pond 2026-08-01 08:06:35 +02:00
notifications #296: remove the unsubscribe-token dual-verify window early 2026-07-31 23:03:03 +02:00
pages test: give the 10k-iteration sort-key property test its own timeout 2026-08-02 14:01:14 +02:00
permissions #302: configurable pond start page, created with every new pond 2026-08-01 08:06:35 +02:00
plugins #302: configurable pond start page, created with every new pond 2026-08-01 08:06:35 +02:00
ponds #302: configurable pond start page, created with every new pond 2026-08-01 08:06:35 +02:00
prisma Add Prisma with PostgreSQL, automatic migrations, and /readyz 2026-07-04 19:16:44 +02:00
public #222: read-access trail for classified pages 2026-07-31 12:12:55 +02:00
public-api #222: read-access trail for classified pages 2026-07-31 12:12:55 +02:00
quotas Quota foundation: overrides, resolution, race-safe consumption (#22) 2026-07-05 20:55:59 +02:00
rate-limit Add DB-backed rate limiting with guard and decorator 2026-07-05 00:43:54 +02:00
read-trail #215: trusted reverse-proxy header / mTLS client-certificate path 2026-07-31 12:50:09 +02:00
scheduler Nextcloud backup target: admin-configured, manual + scheduled uploads, in-app restore (#103) 2026-07-12 10:39:18 +02:00
search #211: classification through feeds, public API, search and the no-JS shell 2026-07-31 07:23:53 +02:00
settings Invitation flow with per-user quota (#332) 2026-08-05 12:44:20 +02:00
setup Self-hosting findings: URL-safe password advice, operator-readable pre-seed errors (#324, #325) 2026-08-04 12:44:16 +02:00
testing #302: configurable pond start page, created with every new pond 2026-08-01 08:06:35 +02:00
trash #307: pond-level branding overrides the instance logo and favicon 2026-08-01 20:44:02 +02:00
users #216: hard AUTH_LOCAL_ENABLED switch over every local credential flow 2026-07-31 12:58:07 +02:00
versions Editor shortcuts: "e" edits, the platform chord+S snapshots versions 2026-07-15 13:17:09 +02:00
watches Add watches: follow pages and ponds with auto-watch preferences (#93) 2026-07-11 22:59:11 +02:00
app.module.ts #306: instance branding — logo and favicon, cropped in the browser 2026-08-01 19:30:52 +02:00
main.ts Remove an unused eslint-disable directive in main.ts 2026-07-12 20:45:29 +02:00