feat(kc): commit extraction pipeline + metadata API (Phase 1) #149

Merged
forbes merged 2 commits from feat/kc-extraction-pipeline into main 2026-02-18 22:40:00 +00:00
Owner

Implements issue #141 — .kc server-side metadata integration Phase 1.

When a .kc file is uploaded, the server extracts silo/manifest.json and silo/metadata.json from the ZIP archive and indexes them into the item_metadata table (created in migration 018, PR #148). Plain .fcstd files continue to work unchanged. Extraction is best-effort: failures are logged but do not block the upload.

New packages

  • internal/kc: ZIP extraction library (Extract, Manifest, Metadata types) with 6 unit tests
  • internal/db/item_metadata.go: ItemMetadataRepository (Get, Upsert, UpdateFields, UpdateLifecycle, SetTags)

New API endpoints

Under /api/items/{partNumber}:

Method Path Auth Description
GET /metadata viewer Read indexed metadata
PUT /metadata editor Merge fields into JSONB
PATCH /metadata/lifecycle editor Transition lifecycle state
PATCH /metadata/tags editor Add/remove tags

Extraction pipeline

Hooked into HandleUploadFile — after file storage + revision creation:

  1. Read file back from storage
  2. Open as ZIP, look for silo/ directory
  3. Parse silo/manifest.json + silo/metadata.json
  4. Validate manifest UUID matches item
  5. Upsert item_metadata row
  6. Broadcast SSE metadata.updated event

SSE events

  • metadata.updated — on extraction and PUT
  • metadata.lifecycle — on lifecycle transition
  • metadata.tags — on tag changes

Lifecycle transitions (Phase 1)

draft → review → released → obsolete, plus review → draft (reject).

Closes #141

Implements issue #141 — .kc server-side metadata integration Phase 1. When a .kc file is uploaded, the server extracts `silo/manifest.json` and `silo/metadata.json` from the ZIP archive and indexes them into the `item_metadata` table (created in migration 018, PR #148). Plain `.fcstd` files continue to work unchanged. Extraction is best-effort: failures are logged but do not block the upload. ## New packages - **`internal/kc`**: ZIP extraction library (`Extract`, `Manifest`, `Metadata` types) with 6 unit tests - **`internal/db/item_metadata.go`**: `ItemMetadataRepository` (Get, Upsert, UpdateFields, UpdateLifecycle, SetTags) ## New API endpoints Under `/api/items/{partNumber}`: | Method | Path | Auth | Description | |--------|------|------|-------------| | GET | `/metadata` | viewer | Read indexed metadata | | PUT | `/metadata` | editor | Merge fields into JSONB | | PATCH | `/metadata/lifecycle` | editor | Transition lifecycle state | | PATCH | `/metadata/tags` | editor | Add/remove tags | ## Extraction pipeline Hooked into `HandleUploadFile` — after file storage + revision creation: 1. Read file back from storage 2. Open as ZIP, look for `silo/` directory 3. Parse `silo/manifest.json` + `silo/metadata.json` 4. Validate manifest UUID matches item 5. Upsert `item_metadata` row 6. Broadcast SSE `metadata.updated` event ## SSE events - `metadata.updated` — on extraction and PUT - `metadata.lifecycle` — on lifecycle transition - `metadata.tags` — on tag changes ## Lifecycle transitions (Phase 1) `draft → review → released → obsolete`, plus `review → draft` (reject). Closes #141
forbes added 1 commit 2026-02-18 22:37:55 +00:00
Implements issue #141 — .kc server-side metadata integration Phase 1.

When a .kc file is uploaded, the server extracts silo/manifest.json and
silo/metadata.json from the ZIP archive and indexes them into the
item_metadata table. Plain .fcstd files continue to work unchanged.
Extraction is best-effort: failures are logged but do not block the upload.

New packages:
- internal/kc: ZIP extraction library (Extract, Manifest, Metadata types)
- internal/db: ItemMetadataRepository (Get, Upsert, UpdateFields,
  UpdateLifecycle, SetTags)

New API endpoints under /api/items/{partNumber}:
- GET    /metadata           — read indexed metadata (viewer)
- PUT    /metadata           — merge fields into JSONB (editor)
- PATCH  /metadata/lifecycle — transition lifecycle state (editor)
- PATCH  /metadata/tags      — add/remove tags (editor)

SSE events: metadata.updated, metadata.lifecycle, metadata.tags

Lifecycle transitions (Phase 1): draft→review→released→obsolete,
review→draft (reject).

Closes #141
forbes added 1 commit 2026-02-18 22:39:52 +00:00
forbes merged commit 28f133411e into main 2026-02-18 22:40:00 +00:00
forbes deleted branch feat/kc-extraction-pipeline 2026-02-18 22:40:00 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kindred/silo#149