All checks were successful
CI / Unit & Component Tests (pull_request) Successful in 3m20s
CI / OCR Service Tests (pull_request) Successful in 22s
CI / Backend Unit Tests (pull_request) Successful in 3m48s
CI / fail2ban Regex (pull_request) Successful in 45s
CI / Semgrep Security Scan (pull_request) Successful in 22s
CI / Compose Bucket Idempotency (pull_request) Successful in 1m6s
## Summary Implements the backend JourneyItem CRUD API on top of the data model from #750, building towards the full Lesereisen feature (#751). **Completed in this PR:** - `jackson-databind-nullable` 0.2.6 + `JacksonConfig` (`@Bean Module`) for three-way PATCH semantics (`JsonNullable`) - `AuditKind`: `JOURNEY_ITEM_ADDED`, `JOURNEY_ITEM_REMOVED`, `JOURNEY_ITEMS_REORDERED` (last is rollup-eligible) - `ErrorCode`: `JOURNEY_ITEM_NOT_FOUND`, `JOURNEY_ITEM_POSITION_CONFLICT` - V73 migration: `UNIQUE (geschichte_id, position) DEFERRABLE INITIALLY DEFERRED` + `CHECK (position > 0)` on `journey_items` - `JourneyItemConstraintsTest`: verifies deferrable flag via `pg_constraint` query; position check; duplicate position rejection (3 passing tests) - Read models: `DocumentSummary`, `JourneyItemView`, `GeschichteView` (with `AuthorView` to prevent AppUser email leak) - `DocumentService.getSummaryById` — lean lookup without tag-color resolution - `JourneyItemRepository`: extended with `findByGeschichteIdOrderByPosition`, `findByIdAndGeschichteId` (IDOR-safe), `findIdsByGeschichteId`, `findMaxPositionByGeschichteId`, `countByGeschichteId` - DTOs: `JourneyItemCreateDTO`, `JourneyItemUpdateDTO` (`JsonNullable<String> note`), `JourneyReorderDTO` **Still in progress (WIP):** - `JourneyItemService` — `append`, `updateNote`, `delete`, `reorder`, `toSummary`, `toView` (Task 6) - `GeschichteService.getById` → returns `GeschichteView` (Task 7) - New endpoints on `GeschichteController` + slice tests (Task 8) - Frontend error codes + i18n + `npm run generate:api` (Task 9) ## Commits - `0b177247` feat(config): add jackson-databind-nullable for JsonNullable PATCH DTO support - `408ae334` feat(audit,error): add JourneyItem AuditKind values and ErrorCodes - `7b06c3ad` feat(migration): V73 adds UNIQUE DEFERRABLE and CHECK position > 0 on journey_items - `160ca1c3` feat(geschichte): add DocumentSummary, JourneyItemView, GeschichteView read models - `2ad5c36e` feat(geschichte): extend JourneyItemRepository and add item DTOs ## Test plan - [ ] `./mvnw test -Dtest=JourneyItemConstraintsTest` — all 3 constraint tests pass - [ ] `./mvnw clean package -DskipTests` — builds clean after remaining tasks are merged - [ ] Frontend: `npm run generate:api` after Task 9 endpoint additions Co-authored-by: Marcel <marcel@familienarchiv> Reviewed-on: #788
C4-PlantUML Diagrams
Architecture diagrams in C4-PlantUML format. These are the authoritative source for layout-accurate diagrams. The companion c4-diagrams.md in the parent directory keeps Mermaid versions for inline Gitea rendering.
Render in Gitea
Gitea is configured to render .puml files as diagrams. Open any .puml file in the Gitea UI to see the rendered diagram.
Note:
plantumlcode fences inside Markdown files do not render inline in Gitea — this is a Gitea limitation unrelated to the server configuration. The.mdfiles in this repo use Mermaid for that reason.
Render in VS Code
Install the PlantUML extension (jebbs.plantuml). The project's .vscode/settings.json already points at the shared server:
plantuml.server = http://heim-nas:8500
Open any .puml file and press Alt+D to preview.
Files
| File | Diagram |
|---|---|
l1-context.puml |
Level 1 — System Context |
l2-containers.puml |
Level 2 — Containers |
l3-backend-3a-security.puml |
L3 Backend: Security & Authentication |
l3-backend-3b-document-management.puml |
L3 Backend: Document Management & Import |
l3-backend-3c-transcription.puml |
L3 Backend: Document Transcription Pipeline |
l3-backend-3d-users-groups.puml |
L3 Backend: Users, Groups & Administration |
l3-backend-3e-persons.puml |
L3 Backend: Persons & Family Graph |
l3-backend-3f-ocr.puml |
L3 Backend: OCR Orchestration |
l3-backend-3g-supporting.puml |
L3 Backend: Supporting Domains |
l3-frontend-3a-middleware-auth.puml |
L3 Frontend: Middleware, Auth & Layout |
l3-frontend-3b-document-workflows.puml |
L3 Frontend: Document Workflows |
l3-frontend-3c-people-stories.puml |
L3 Frontend: People, Stories & Discovery |
l3-frontend-3d-administration.puml |
L3 Frontend: Administration & Help |
seq-auth-flow.puml |
Sequence: Authentication Flow |
seq-document-upload.puml |
Sequence: Document Upload Flow |