diff --git a/crates/api/src/admin_search.rs b/crates/api/src/admin_search.rs index fc03aa0..944e7f7 100644 --- a/crates/api/src/admin_search.rs +++ b/crates/api/src/admin_search.rs @@ -30,6 +30,7 @@ pub(crate) struct SearchHitView { pub brief_description: Option, #[schema(value_type = domain::Visibility)] pub visibility: String, + pub recording_date: Option, pub snippet: Option, } @@ -103,6 +104,7 @@ pub(crate) async fn search_objects( object_name: h.object_name, brief_description: h.brief_description, visibility: h.visibility, + recording_date: h.recording_date, snippet: h.snippet, }) .collect(), diff --git a/crates/search/src/lib.rs b/crates/search/src/lib.rs index 286a1c3..fc3df63 100644 --- a/crates/search/src/lib.rs +++ b/crates/search/src/lib.rs @@ -34,6 +34,7 @@ pub struct SearchDocument { pub brief_description: Option, pub current_owner: Option, pub recorder: Option, + pub recording_date: Option, /// Filterable: "draft" | "internal" | "public". pub visibility: String, /// Flexible field values flattened to searchable text. @@ -55,6 +56,7 @@ pub struct SearchHit { pub object_name: String, pub brief_description: Option, pub visibility: String, + pub recording_date: Option, pub snippet: Option, } @@ -233,6 +235,7 @@ impl SearchClient { object_name: doc.object_name, brief_description: doc.brief_description, visibility: doc.visibility, + recording_date: doc.recording_date, snippet, } }) @@ -367,6 +370,7 @@ pub async fn build_document( brief_description: object.brief_description.clone(), current_owner: object.current_owner.clone(), recorder: object.recorder.clone(), + recording_date: object.recording_date.map(|d| d.to_string()), visibility: object.visibility.as_str().to_owned(), fields_text, }) diff --git a/crates/search/tests/search.rs b/crates/search/tests/search.rs index dec4543..61b9174 100644 --- a/crates/search/tests/search.rs +++ b/crates/search/tests/search.rs @@ -19,6 +19,7 @@ fn doc(id: &str, object_name: &str, fields_text: &[&str]) -> SearchDocument { brief_description: None, current_owner: None, recorder: None, + recording_date: None, visibility: "draft".to_string(), fields_text: fields_text.iter().map(|s| s.to_string()).collect(), } @@ -66,6 +67,7 @@ async fn search_objects_returns_hits_with_highlight_filter_and_paging() { &["cast bronze with green patina"], ); bronze_a.visibility = "public".to_string(); + bronze_a.recording_date = Some("1962-04-03".to_string()); let mut bronze_b = doc(&b.to_string(), "Ceremonial bowl", &["bronze alloy rim"]); bronze_b.visibility = "public".to_string(); let mut bronze_c = doc(&c.to_string(), "Door fitting", &["bronze hinge"]); @@ -87,6 +89,7 @@ async fn search_objects_returns_hits_with_highlight_filter_and_paging() { "snippet must mark the match" ); assert!(snippet.contains(search::HL_POST)); + assert_eq!(hit.recording_date.as_deref(), Some("1962-04-03")); let public = client .search_objects("bronze", Some("public"), 0, 20) diff --git a/web/src/api/schema.d.ts b/web/src/api/schema.d.ts index 0121ff5..1c9a011 100644 --- a/web/src/api/schema.d.ts +++ b/web/src/api/schema.d.ts @@ -603,6 +603,7 @@ export interface components { id: string; object_name: string; object_number: string; + recording_date?: string | null; snippet?: string | null; visibility: components["schemas"]["Visibility"]; };