Skip to content

Storage-object deposit model: the registered deposit extension#32

Open
johnf wants to merge 4 commits into
mainfrom
deposit-extension-spec
Open

Storage-object deposit model: the registered deposit extension#32
johnf wants to merge 4 commits into
mainfrom
deposit-extension-spec

Conversation

@johnf

@johnf johnf commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds the storage-object deposit model as a registered extension (deposit) — the API's first write pathway. Spec bumped to 0.3.0 (openapi.yaml + CHANGELOG.md) with a new docs subcategory (docs/extensions/deposit/).

This supersedes the v1 read–write discussion paper's entity-granular writes, which the Technology Committee pushed back on because one crate spans many entities. Charted and decided on the wayfinder map Map: Storage-object deposit model.

The model

  • A storage object is the real thing on disk: an RO-Crate plus all files it references. It is the sole write pathway — no entity CRUD, no standalone file endpoints.
  • Deposit is a session: POST /deposits (create) or POST /storage-object/{id}/deposits (update) → stage crate and files (PUT /deposit/{id}/crate, PUT /deposit/{id}/file/{fileId}, inline or presigned) → POST /deposit/{id}/finalise (sync 200 or async 202; validation failure returns the deposit to open).
  • The backend materialises catalog entities from the storage object via implementation-specific rules (PARADISEC: one item + files; LDaCA: exploded collections/subcollections), including many-to-one merges. Entities are projections; linkage is bidirectional (storageObjectIds on Entity, entityIds on StorageObject, optional storageObjectId on File).
  • Updates use crate-as-manifest carry-forward: stage only changed files; at finalise each file entity resolves staged → carried-forward-by-@id → permitted-dangling. Last finalise wins as a unit, with an optional stale-finalise 409.
  • Reads: minimal GET /storage-objects, lean GET /storage-object/{id}, GET /storage-object/{id}/crate returning the deposited crate verbatim; /entity/{id}/rocrate re-specced as implementation-defined provenance (stored or virtualised) but always a valid RO-Crate.
  • Deletion: plain DELETE /storage-object/{id} (implementation-defined 409-with-reason), constrained DELETE /entity/{id} for contributor-less entities only, one 410/404 tombstone policy per implementation with a Tombstone schema.
  • Discovery: the whole surface is one extension keyed in capabilities.extensions.deposit — required idMinting, fileUpload, tombstonePolicy; optional depositTtlSeconds, maxFileSizeBytes. Auth is a new coarse OAuth2 write scope.

Docs

An "Extension: deposit" sidebar subcategory: the extension guide (model, materialisation worked examples, capability field guidance, both visibility patterns) plus three flow pages — Depositing, Updating a Storage Object, and Deletion & Lifecycle. Extension registry table and capability examples updated.

Key decisions

Open points for the committee

  • Entity lifecycle on re-deposit (implementation-defined pruning) and the update-deposit concurrency model — on the agenda for the tech meeting of Thursday 2026-07-23.
  • Conformance placement of deposit (mandatory / core-but-optional / extension — drafted as an extension) — being socialised on Slack.

Verification

pnpm lint (tsc, Biome, Redocly) and the full Docusaurus build (onBrokenLinks: 'throw') pass.

This was referenced Jul 21, 2026
johnf added 4 commits July 21, 2026 11:44
Adds the deposit extension to the spec: deposit sessions (create/stage/
finalise/abort), the storage-object read surface, crate-as-manifest
carry-forward for updates, deletion with a per-implementation tombstone
policy, catalog↔storage-object linkage fields, the DepositCapability
declaration, and the OAuth2 write scope. Bumps the spec to 0.3.0.

Implements the decisions on the wayfinder map #22 (tickets #23#28).
Part of #29.
Adds an 'Extension: deposit' section under Extensions: the model page
(storage objects, materialisation contract with PARADISEC/LDaCA examples,
capability declaration, visibility patterns), the deposit-session
walkthrough (both upload modes, sync/async finalise, failure handling),
the carry-forward update flow, and deletion/lifecycle (tombstones,
curation storage objects, constrained entity delete). Registers the
extension in the registry table and refreshes capability examples.
@johnf
johnf marked this pull request as ready for review July 21, 2026 09:45
@johnf
johnf requested review from alvinsw, moisbo, ptsefton and r-tae July 21, 2026 09:45
@johnf
johnf force-pushed the deposit-extension-spec branch from fd92448 to 0ee1fe7 Compare July 23, 2026 04:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant