diff --git a/backend/src/models.rs b/backend/src/models.rs index 5abdd6a..14d6d9e 100644 --- a/backend/src/models.rs +++ b/backend/src/models.rs @@ -123,7 +123,6 @@ pub struct DocumentVersion { pub size_bytes: i64, pub checksum: String, pub created_at: NaiveDateTime, - pub operations_summary: serde_json::Value, pub metadata: serde_json::Value, pub tenant_id: Uuid, } @@ -137,7 +136,6 @@ pub struct NewDocumentVersion { pub s3_key: String, pub size_bytes: i64, pub checksum: String, - pub operations_summary: serde_json::Value, pub metadata: serde_json::Value, pub tenant_id: Uuid, } diff --git a/backend/src/openapi.rs b/backend/src/openapi.rs index 38b7bf0..c16fa19 100644 --- a/backend/src/openapi.rs +++ b/backend/src/openapi.rs @@ -658,8 +658,6 @@ pub mod schemas { pub created_at: String, pub metadata: Value, #[schema(nullable)] - pub operations_summary: Option, - #[schema(nullable)] pub assets: Option>, pub download_path: String, } diff --git a/backend/src/routes/documents.rs b/backend/src/routes/documents.rs index b28fbe4..3903f3c 100644 --- a/backend/src/routes/documents.rs +++ b/backend/src/routes/documents.rs @@ -20,7 +20,7 @@ use uuid::Uuid; use super::folders::gather_descendant_folder_ids; use crate::auth::TenantScopedConn; use crate::error::{AppError, AppResult}; -use crate::jobs::{enqueue_job, JOB_ANALYZE_DOCUMENT}; +use crate::jobs::{enqueue_job, JOB_ANALYZE_DOCUMENT, JOB_INDEX_DOCUMENT_TEXT}; use crate::models::{ Correspondent, Document, DocumentAsset, DocumentAssetObject, DocumentCorrespondent, DocumentVersion, NewDocument, NewDocumentCorrespondent, NewDocumentTag, NewDocumentVersion, @@ -138,8 +138,6 @@ pub struct DocumentVersionResponse { pub checksum: String, pub created_at: String, pub metadata: Value, - #[serde(skip_serializing_if = "Option::is_none")] - pub operations_summary: Option, } #[derive(Serialize, Clone, ToSchema)] @@ -749,7 +747,7 @@ pub async fn get_document( drop(conn); let assets = load_asset_responses(&state, tenant_id, version_id).await?; - let version_response = to_version_response(current_version, true); + let version_response = to_version_response(current_version); Ok(Json(DocumentDetailResponse { document: to_document_response( @@ -1303,6 +1301,7 @@ pub async fn update_document( let mut changes = DocumentUpdateChangeset::default(); let mut has_changes = false; + let mut title_changed = false; if let Some(ref candidate) = title { let trimmed = candidate.trim(); @@ -1317,6 +1316,7 @@ pub async fn update_document( changes.filename = Some(new_filename); } has_changes = true; + title_changed = true; } } @@ -1391,13 +1391,33 @@ pub async fn update_document( .find(document.current_version_id) .first(&mut conn)?; + if title_changed { + if let Err(err) = enqueue_job( + &mut conn, + tenant_id, + JOB_INDEX_DOCUMENT_TEXT, + json!({ + "document_id": document.id, + "document_version_id": current_version.id, + }), + None, + ) { + warn!( + document_id = %document.id, + version_id = %current_version.id, + error = %err, + "failed to enqueue reindex job after title change" + ); + } + } + let tags_map = load_tags_for_documents(&mut conn, &[document_id])?; let mut correspondents_map = load_correspondents_for_documents(&mut conn, &[document_id])?; let version_id = current_version.id; drop(conn); let assets = load_asset_responses(&state, tenant_id, version_id).await?; - let version_response = to_version_response(current_version, true); + let version_response = to_version_response(current_version); Ok(Json(DocumentDetailResponse { document: to_document_response( @@ -2133,7 +2153,7 @@ async fn process_upload( let correspondents = correspondents_map.remove(&document.id).unwrap_or_default(); drop(conn); let assets = load_asset_responses(state, tenant_id, version.id).await?; - let version_response = to_version_response(version.clone(), true); + let version_response = to_version_response(version.clone()); info!( document_id = %document.id, @@ -2204,7 +2224,6 @@ async fn process_upload( size_bytes, checksum: checksum_hex.clone(), metadata: Value::Object(Default::default()), - operations_summary: Value::Object(Default::default()), tenant_id, }; @@ -2250,7 +2269,7 @@ async fn process_upload( document, tags, correspondents, - Some((to_version_response(version.clone(), true), Vec::new())), + Some((to_version_response(version.clone()), Vec::new())), )?, } }; @@ -2538,7 +2557,7 @@ pub(crate) async fn load_primary_assets( for (doc_id, version_id) in doc_to_version { if let Some(version) = version_map.remove(&version_id) { let assets = assets_by_version.remove(&version_id).unwrap_or_default(); - result.insert(doc_id, (to_version_response(version, false), assets)); + result.insert(doc_id, (to_version_response(version), assets)); } } diff --git a/backend/src/routes/documents/asset_utils.rs b/backend/src/routes/documents/asset_utils.rs index 57d48ac..ee683e7 100644 --- a/backend/src/routes/documents/asset_utils.rs +++ b/backend/src/routes/documents/asset_utils.rs @@ -24,10 +24,7 @@ pub fn build_download_path( .map_err(|err| AppError::internal(format!("failed to generate download token: {err}"))) } -pub fn to_version_response( - version: DocumentVersion, - include_operations_summary: bool, -) -> DocumentVersionResponse { +pub fn to_version_response(version: DocumentVersion) -> DocumentVersionResponse { DocumentVersionResponse { id: version.id, version_number: version.version_number, @@ -36,11 +33,6 @@ pub fn to_version_response( checksum: version.checksum, created_at: to_iso(version.created_at), metadata: version.metadata, - operations_summary: if include_operations_summary { - Some(version.operations_summary) - } else { - None - }, } } diff --git a/backend/src/schema.rs b/backend/src/schema.rs index e492d1a..13a3217 100644 --- a/backend/src/schema.rs +++ b/backend/src/schema.rs @@ -69,7 +69,6 @@ diesel::table! { #[max_length = 64] checksum -> Varchar, created_at -> Timestamptz, - operations_summary -> Jsonb, metadata -> Jsonb, tenant_id -> Uuid, } diff --git a/backend/src/workers/analyze.rs b/backend/src/workers/analyze.rs index c4a40be..f6c7430 100644 --- a/backend/src/workers/analyze.rs +++ b/backend/src/workers/analyze.rs @@ -3,7 +3,7 @@ use std::{collections::HashSet, sync::Arc, time::Duration}; use async_trait::async_trait; use diesel::prelude::*; use serde::Deserialize; -use serde_json::{json, Map, Value}; +use serde_json::json; use tokio::task; use tracing::{error, warn}; use uuid::Uuid; @@ -104,7 +104,7 @@ fn analyze_document( let tenant_id = document.tenant_id; - let (supported, reason) = determine_thumbnail_support(&document); + let (supported, _reason) = determine_thumbnail_support(&document); let ocr_supported = document_is_pdf(&document); let existing_ocr: Option = document_assets::table @@ -117,32 +117,6 @@ fn analyze_document( let skip_ocr = existing_ocr.is_some() && !payload.force; - let mut summary_map = match version.operations_summary { - Value::Object(map) => map, - _ => Map::new(), - }; - summary_map.insert("thumbnail_supported".to_string(), Value::Bool(supported)); - if let Some(reason) = reason { - summary_map.insert("thumbnail_reason".to_string(), Value::String(reason)); - } else { - summary_map.remove("thumbnail_reason"); - } - - summary_map.insert("ocr_supported".to_string(), Value::Bool(ocr_supported)); - if ocr_supported { - summary_map.remove("ocr_reason"); - } else { - summary_map.insert( - "ocr_reason".to_string(), - Value::String("document is not a PDF".into()), - ); - } - - diesel::update(document_versions::table.find(version.id)) - .set(document_versions::operations_summary.eq(Value::Object(summary_map))) - .execute(&mut conn) - .map_err(|err| format!("{err:?}"))?; - if supported { let enqueue_result = enqueue_job( &mut conn,