ADR: diploma upload stored in the ZGW Documenten API, fronted by the ACL (S-10b) #107
Closed
opened 2026-07-20 09:50:52 +00:00 by not
·
1 comment
No Branch/Tag Specified
main
ci/175-deploy-on-merge
feat/177-public-tls-edge
ci/168-helm-chart-ci-gate
docs/169-mkdocs-nav
feat/25-helm-kubernetes-caddy
fix/161-e2e-bounded-and-diagnosable
feat/162-werkbak-live-refresh
feat/132-medewerker-mfa
fix/156-tempo-ingester-healthcheck
feat/153-projection-sourced-from-objecten
feat/152-objecten-publishes-to-nrc
feat/149-acl-writes-registerrecord
feat/141-registerrecord-objecttype
perf/verify-stack-uwsgi-oz-nrc
fix/144-verify-stack-uwsgi
feat/140-objecten-up
feat/139-objecttypen-up
feat/131-default-fill-crud
chore/136-ci-job-summaries
fix/134-verify-stack-scheduling
feat/130-beheer-catalogi
feat/124-metrics-dashboards
ci/127-parallel-jobs
feat/123-distributed-traces
feat/111-self-service-resume
feat/113-acl-zaaktype-by-identificatie
fix/110-compose-local-flow
fix/115-e2e-single-worker
docs/111-backlog-s26
feat/106-close-zaak-on-timeout
feat/103-diploma-upload-documenten
feat/102-document-wait-timeout
feat/14-dmn-diploma-eligibility
feat/15-beoordeling-escalation
fix/portal-nginx-resolver
fix/local-eventsubscriber-acl
feat/12-withdrawal-portal
fix/91-local-compose-parity
feat/12-withdrawal-bff
feat/12-withdrawal-workflow
feat/12-withdrawal
feat/13-behandel-portal
feat/13-behandel-decide
feat/13-behandel-bff-auth-werkbak
feat/13-workflow-user-tasks
feat/13-behandel-decision-model
chore/release-2026.07.0
feat/78-reference-correlation
feat/75-approval-flow
feat/10-openbaar-portal
chore/73-ci-speedups
feat/68-e2e
feat/67-self-service-form
feat/66-api-client
feat/65-nx-workspace
feat/8-bff
feat/6-domain-service
feat/7-event-subscriber-projection
feat/56-nrc-notification-wiring
test/46-acl-openzaak-integration
feat/47-acl-mutation-baseline
ci/30-gitea-actions-ci
feat/5-acl-open-zaak
feat/4-flowable
feat/3-keycloak
feat/2-opennotificaties
feat/2-catalogus-seed
feat/10-openzaak-compose
feat/32-docs-scaffold
feat/31-contributor-workflow
feat/30-gitea-actions-ci
feat/29-bff-docker-compose
chore/remove-bootstrap-scripts
feat/28-bff-health
docs/split-s00
v2026.07.0
Milestone
No items
No Milestone
Iteration 2 — Flow Completeness
Projects
Clear projects
No projects
Assignees
eho (Edwin van den Houdt)
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: eho/register-referentie#107
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Context. S-10b (#103) stores an uploaded diploma in the ZGW Documenten (DRC) API and relates it to the zaak. §8.1 makes the ACL the only code that talks to ZGW. The non-obvious decisions (§14):
The ACL fronts the Documenten API. A new ACL gateway method creates an
enkelvoudiginformatieobject(POST /documenten/api/v1/enkelvoudiginformatieobjecten) and relates it to the zaak (POST /zaken/api/v1/zaakinformatieobjecten), mirroring the existingOpenZaakGatewaypatterns (Bearer ZGW JWT,LoadIntoBufferAsyncfor a Content-Length, no CRS headers on non-geo APIs, problem-details error surfacing). No new ZGW scopes needed (the seed applicatie hasheeft_alle_autorisaties). A newinformatieobjecttypeis seeded in the catalogus and related to the zaaktype; its URL is injected into the ACL likeACL_ZAAKTYPE_URL.How the file bytes travel. Proposed: the browser uploads to the BFF as multipart/form-data (
IFormFile) — natural for a file input; the BFF forwards to the domain and the domain to the ACL as base64 in JSON (both are JSON-only services today; a small placeholder PDF base64-encodes cheaply), and the ACL sendsinhoud(base64) to the Documenten API. This keeps the existing JSON contracts on the domain/ACL and confines multipart to the portal→BFF hop. Alternative: multipart end-to-end (rejected — adds multipart plumbing to two more services for a small file).Where storing sits in the flow. The existing
ProvideDocumentsuse case (S-10a) already completes theWachtOpDocumentenwait. S-10b makes it store the document via the ACL first, then complete the wait — so a registration only advances to beoordeling once its diploma is stored. Owner-scoping by bsn is unchanged.Scope boundary. Setting the ZGW zaak to a cancellation status on 30-day expiry is not in S-10b — carved to #106 (S-10c). S-10b is the upload-storage vertical only.
Decision to record in the ADR (lands in the PR for #103): items 1–3 as proposed; item 4 as the boundary.
Bends no §8 rule (the ACL stays the only ZGW caller; portals still only talk to the BFF). Opening per §13/§14 before coding.
Decision recorded in
docs/architecture/adr-0018-diploma-upload-via-acl-documenten.md(merged with S-10b, PR #108, closing #103). Closing this ADR-proposal tracking issue as done.