From 7abc10acde9c48cb9c4486052abbb0c246da060d Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Tue, 28 Oct 2025 00:01:40 +0100 Subject: [PATCH] backend --- .../down.sql | 2 + .../up.sql | 2 + backend/src/openapi.rs | 1 - backend/tests/documents_flow.rs | 87 +++++++++++++++---- 4 files changed, 76 insertions(+), 16 deletions(-) create mode 100644 backend/migrations/202512010020_drop_document_version_operations_summary/down.sql create mode 100644 backend/migrations/202512010020_drop_document_version_operations_summary/up.sql diff --git a/backend/migrations/202512010020_drop_document_version_operations_summary/down.sql b/backend/migrations/202512010020_drop_document_version_operations_summary/down.sql new file mode 100644 index 0000000..128b066 --- /dev/null +++ b/backend/migrations/202512010020_drop_document_version_operations_summary/down.sql @@ -0,0 +1,2 @@ +ALTER TABLE document_versions + ADD COLUMN operations_summary JSONB NOT NULL DEFAULT '{}'::jsonb; diff --git a/backend/migrations/202512010020_drop_document_version_operations_summary/up.sql b/backend/migrations/202512010020_drop_document_version_operations_summary/up.sql new file mode 100644 index 0000000..5528dd9 --- /dev/null +++ b/backend/migrations/202512010020_drop_document_version_operations_summary/up.sql @@ -0,0 +1,2 @@ +ALTER TABLE document_versions + DROP COLUMN IF EXISTS operations_summary; diff --git a/backend/src/openapi.rs b/backend/src/openapi.rs index fe85d02..4ec3234 100644 --- a/backend/src/openapi.rs +++ b/backend/src/openapi.rs @@ -675,7 +675,6 @@ pub mod schemas { pub struct DocumentVersionResponse { pub id: Uuid, pub version_number: i32, - pub s3_key: String, pub size_bytes: i64, pub checksum: String, pub created_at: String, diff --git a/backend/tests/documents_flow.rs b/backend/tests/documents_flow.rs index 81f5c33..7856043 100644 --- a/backend/tests/documents_flow.rs +++ b/backend/tests/documents_flow.rs @@ -27,20 +27,25 @@ struct DocumentInfo { #[serde(default)] correspondents: Vec, #[serde(default)] - current_version: Option, + current_version: Option, } #[derive(Deserialize)] -struct DocumentVersion { +struct DocumentVersionPayload { id: Uuid, - s3_key: String, - size_bytes: i64, version_number: i32, + size_bytes: i64, download_path: String, #[serde(default)] assets: Vec, } +#[derive(Deserialize)] +struct DocumentVersionListItem { + id: Uuid, + version_number: i32, +} + #[allow(dead_code)] #[derive(Deserialize)] struct DocumentAssetInfo { @@ -52,12 +57,11 @@ struct DocumentAssetInfo { struct DocumentListItem { id: Uuid, #[serde(default)] - current_version: Option, + current_version: Option, } #[derive(Deserialize)] struct DocumentDownload { - url: String, filename: String, } @@ -205,13 +209,6 @@ async fn upload_and_list_document() -> Result<()> { assert_eq!(current_version.size_bytes, file_bytes.len() as i64); assert!(current_version.assets.is_empty()); - let storage_key = app.storage_key_for(¤t_version.s3_key).await?; - let stored = app - .storage() - .get(&storage_key) - .await - .expect("object stored"); - assert_eq!(stored.bytes, file_bytes); assert_eq!(app.storage().object_count().await, 1); let response = app.get("/api/documents", Some(&token)).await?; @@ -257,7 +254,6 @@ async fn upload_and_list_document() -> Result<()> { } let body = body_to_vec(download.into_body()).await?; let download_info: DocumentDownload = serde_json::from_slice(&body)?; - assert!(download_info.url.contains(¤t_version.s3_key)); assert_eq!(download_info.filename, "doc.txt"); let redirect = app.get(¤t_version.download_path, None).await?; @@ -267,7 +263,7 @@ async fn upload_and_list_document() -> Result<()> { .get("location") .expect("redirect location header"); let location = location.to_str().expect("location header utf8"); - assert!(location.contains(¤t_version.s3_key)); + assert!(!location.is_empty()); app.cleanup().await?; Ok(()) @@ -1789,3 +1785,64 @@ async fn restore_document_to_original_and_custom_folder() -> Result<()> { app.cleanup().await?; Ok(()) } + +#[tokio::test] +async fn list_document_versions_and_fetch_detail() -> Result<()> { + let _lock = acquire_db_lock().await; + let app = TestApp::new().await?; + + let password = "versionlist"; + app.insert_user("versions", password, "admin").await?; + let token = app.login_token("versions", password).await?; + + let upload = app + .upload_document( + "/api/documents", + "versioned.txt", + "text/plain", + b"versioned", + None, + &token, + ) + .await?; + let upload_body = body_to_vec(upload.into_body()).await?; + let detail: DocumentDetail = serde_json::from_slice(&upload_body)?; + + let version_id = detail + .document + .current_version + .as_ref() + .expect("current version") + .id; + + let list_resp = app + .get( + &format!("/api/documents/{}/versions", detail.document.id), + Some(&token), + ) + .await?; + assert!(list_resp.status().is_success()); + let list_body = body_to_vec(list_resp.into_body()).await?; + let versions: Vec = serde_json::from_slice(&list_body)?; + assert_eq!(versions.len(), 1); + assert_eq!(versions[0].id, version_id); + + let detail_resp = app + .get( + &format!( + "/api/documents/{}/versions/{}", + detail.document.id, version_id + ), + Some(&token), + ) + .await?; + assert!(detail_resp.status().is_success()); + let detail_body = body_to_vec(detail_resp.into_body()).await?; + let version_detail: DocumentVersionPayload = serde_json::from_slice(&detail_body)?; + assert_eq!(version_detail.id, version_id); + assert!(version_detail.download_path.starts_with("/download/")); + assert!(version_detail.assets.is_empty()); + + app.cleanup().await?; + Ok(()) +}