backend: reduce assets detail in DocumentVersionResponse

This commit is contained in:
2025-10-20 14:26:11 +02:00
parent 5619bb27a1
commit 96a6d0ee5d
+62 -20
View File
@@ -109,7 +109,8 @@ pub struct DocumentVersionResponse {
pub checksum: String, pub checksum: String,
pub created_at: String, pub created_at: String,
pub metadata: Value, pub metadata: Value,
pub operations_summary: Value, #[serde(skip_serializing_if = "Option::is_none")]
pub operations_summary: Option<Value>,
} }
#[derive(Serialize, Clone)] #[derive(Serialize, Clone)]
@@ -117,10 +118,12 @@ pub struct DocumentAssetResponse {
pub id: Uuid, pub id: Uuid,
pub asset_type: String, pub asset_type: String,
pub mime_type: String, pub mime_type: String,
pub metadata: Value, #[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>, pub url: Option<String>,
pub created_at: String, #[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
} }
#[derive(Serialize, Clone)] #[derive(Serialize, Clone)]
@@ -606,7 +609,7 @@ pub async fn get_document(
drop(conn); drop(conn);
let assets = load_asset_responses(&state, version_id).await?; let assets = load_asset_responses(&state, version_id).await?;
let version_response = to_version_response(current_version); let version_response = to_version_response(current_version, true);
Ok(Json(DocumentDetailResponse { Ok(Json(DocumentDetailResponse {
document: to_document_response( document: to_document_response(
@@ -887,6 +890,7 @@ pub async fn get_document_asset(
asset, asset,
Some(object_metadata), Some(object_metadata),
Some(presigned_url), Some(presigned_url),
AssetResponseScope::Detailed,
))) )))
} }
@@ -1045,7 +1049,7 @@ pub async fn update_document(
drop(conn); drop(conn);
let assets = load_asset_responses(&state, version_id).await?; let assets = load_asset_responses(&state, version_id).await?;
let version_response = to_version_response(current_version); let version_response = to_version_response(current_version, true);
Ok(Json(DocumentDetailResponse { Ok(Json(DocumentDetailResponse {
document: to_document_response( document: to_document_response(
@@ -1584,7 +1588,7 @@ async fn process_upload(
let correspondents = correspondents_map.remove(&document.id).unwrap_or_default(); let correspondents = correspondents_map.remove(&document.id).unwrap_or_default();
drop(conn); drop(conn);
let assets = load_asset_responses(state, version.id).await?; let assets = load_asset_responses(state, version.id).await?;
let version_response = to_version_response(version.clone()); let version_response = to_version_response(version.clone(), true);
info!( info!(
document_id = %document.id, document_id = %document.id,
@@ -1677,7 +1681,7 @@ async fn process_upload(
document, document,
None, None,
Vec::new(), Vec::new(),
Some((to_version_response(version.clone()), Vec::new())), Some((to_version_response(version.clone(), true), Vec::new())),
)?, )?,
}; };
@@ -1817,7 +1821,12 @@ pub(crate) async fn load_primary_assets(
let mut assets_by_version: HashMap<Uuid, Vec<DocumentAssetResponse>> = HashMap::new(); let mut assets_by_version: HashMap<Uuid, Vec<DocumentAssetResponse>> = HashMap::new();
for (asset, object) in assets { for (asset, object) in assets {
let version_id = asset.document_version_id; let version_id = asset.document_version_id;
let response = to_asset_response(asset, object.map(|o| o.metadata), None); let response = to_asset_response(
asset,
object.map(|o| o.metadata),
None,
AssetResponseScope::Summary,
);
assets_by_version assets_by_version
.entry(version_id) .entry(version_id)
.or_default() .or_default()
@@ -1831,7 +1840,7 @@ pub(crate) async fn load_primary_assets(
for (doc_id, version_id) in doc_to_version { for (doc_id, version_id) in doc_to_version {
if let Some(version) = version_map.remove(&version_id) { if let Some(version) = version_map.remove(&version_id) {
let assets = assets_by_version.remove(&version_id).unwrap_or_default(); let assets = assets_by_version.remove(&version_id).unwrap_or_default();
result.insert(doc_id, (to_version_response(version), assets)); result.insert(doc_id, (to_version_response(version, false), assets));
} }
} }
@@ -1887,7 +1896,10 @@ fn build_download_path(state: &AppState, document_id: Uuid, user_id: Uuid) -> Ap
.map_err(|err| AppError::internal(format!("failed to generate download token: {err}"))) .map_err(|err| AppError::internal(format!("failed to generate download token: {err}")))
} }
fn to_version_response(version: DocumentVersion) -> DocumentVersionResponse { fn to_version_response(
version: DocumentVersion,
include_operations_summary: bool,
) -> DocumentVersionResponse {
DocumentVersionResponse { DocumentVersionResponse {
id: version.id, id: version.id,
version_number: version.version_number, version_number: version.version_number,
@@ -1896,7 +1908,11 @@ fn to_version_response(version: DocumentVersion) -> DocumentVersionResponse {
checksum: version.checksum, checksum: version.checksum,
created_at: to_iso(version.created_at), created_at: to_iso(version.created_at),
metadata: version.metadata, metadata: version.metadata,
operations_summary: version.operations_summary, operations_summary: if include_operations_summary {
Some(version.operations_summary)
} else {
None
},
} }
} }
@@ -1914,19 +1930,38 @@ fn merge_metadata(base: &Value, overlay: Option<&Value>) -> Value {
} }
} }
#[derive(Clone, Copy)]
enum AssetResponseScope {
Summary,
Detailed,
}
fn to_asset_response( fn to_asset_response(
asset: DocumentAsset, asset: DocumentAsset,
object_metadata: Option<Value>, object_metadata: Option<Value>,
url: Option<String>, url: Option<String>,
scope: AssetResponseScope,
) -> DocumentAssetResponse { ) -> DocumentAssetResponse {
let metadata = merge_metadata(&asset.metadata, object_metadata.as_ref()); match scope {
DocumentAssetResponse { AssetResponseScope::Summary => DocumentAssetResponse {
id: asset.id, id: asset.id,
asset_type: asset.asset_type, asset_type: asset.asset_type,
mime_type: asset.mime_type, mime_type: asset.mime_type,
metadata, metadata: None,
url, url: None,
created_at: to_iso(asset.created_at), created_at: None,
},
AssetResponseScope::Detailed => {
let metadata = merge_metadata(&asset.metadata, object_metadata.as_ref());
DocumentAssetResponse {
id: asset.id,
asset_type: asset.asset_type,
mime_type: asset.mime_type,
metadata: Some(metadata),
url,
created_at: Some(to_iso(asset.created_at)),
}
}
} }
} }
@@ -1988,7 +2023,14 @@ async fn load_asset_responses(
Ok(assets Ok(assets
.into_iter() .into_iter()
.map(|(asset, object)| to_asset_response(asset, object.map(|o| o.metadata), None)) .map(|(asset, object)| {
to_asset_response(
asset,
object.map(|o| o.metadata),
None,
AssetResponseScope::Detailed,
)
})
.collect()) .collect())
} }