From 2aaf98794f09427fb6238e9b0ccf218e89fc74e7 Mon Sep 17 00:00:00 2001 From: Anders Olsson Date: Tue, 2 Jun 2026 10:54:49 +0200 Subject: [PATCH] feat(db): add object.fields jsonb column, read it into CatalogueObject Co-Authored-By: Claude Opus 4.8 (1M context) --- crates/db/Cargo.toml | 1 + crates/db/migrations/0005_object_fields.sql | 2 ++ crates/db/src/catalog.rs | 3 ++- crates/db/tests/catalog.rs | 13 +++++++++++++ crates/db/tests/migrate.rs | 13 +++++++++++++ crates/domain/src/object.rs | 2 ++ 6 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 crates/db/migrations/0005_object_fields.sql diff --git a/crates/db/Cargo.toml b/crates/db/Cargo.toml index b263b5a..9d12772 100644 --- a/crates/db/Cargo.toml +++ b/crates/db/Cargo.toml @@ -15,3 +15,4 @@ serde_json.workspace = true [dev-dependencies] tokio.workspace = true time.workspace = true +serde_json.workspace = true diff --git a/crates/db/migrations/0005_object_fields.sql b/crates/db/migrations/0005_object_fields.sql new file mode 100644 index 0000000..44430cb --- /dev/null +++ b/crates/db/migrations/0005_object_fields.sql @@ -0,0 +1,2 @@ +-- Flexible field values for a catalogue object, keyed by field-definition key. +ALTER TABLE object ADD COLUMN fields JSONB NOT NULL DEFAULT '{}'::jsonb; diff --git a/crates/db/src/catalog.rs b/crates/db/src/catalog.rs index faad1c9..b9a3394 100644 --- a/crates/db/src/catalog.rs +++ b/crates/db/src/catalog.rs @@ -15,7 +15,7 @@ const ENTITY_TYPE: &str = "object"; const OBJECT_COLUMNS: &str = "id, object_number, object_name, number_of_objects, \ brief_description, current_location, current_owner, recorder, recording_date, \ - visibility, created_at, updated_at"; + visibility, fields, created_at, updated_at"; /// Create an object and record a `created` audit entry, both on `conn` /// (pass a transaction connection `&mut *tx` so they commit atomically). @@ -110,6 +110,7 @@ fn map_object(row: sqlx::postgres::PgRow) -> Result = sqlx::query_scalar( + "SELECT true FROM information_schema.columns \ + WHERE table_name = 'object' AND column_name = 'fields'", + ) + .fetch_optional(db.pool()) + .await + .unwrap(); + assert_eq!(exists, Some(true)); +} diff --git a/crates/domain/src/object.rs b/crates/domain/src/object.rs index 3a43616..b8d1f47 100644 --- a/crates/domain/src/object.rs +++ b/crates/domain/src/object.rs @@ -62,6 +62,8 @@ pub struct CatalogueObject { pub recorder: Option, pub recording_date: Option, pub visibility: Visibility, + /// Flexible field values (field key -> value), validated against the registry. + pub fields: serde_json::Value, pub created_at: OffsetDateTime, pub updated_at: OffsetDateTime, }