diff --git a/backend/sync_server/src/app_state/database.rs b/backend/sync_server/src/app_state/database.rs index 1e26e142..2ef03ba1 100644 --- a/backend/sync_server/src/app_state/database.rs +++ b/backend/sync_server/src/app_state/database.rs @@ -135,8 +135,7 @@ impl Database { vault: &VaultId, transaction: Option<&mut Transaction<'_>>, ) -> Result> { - let query = sqlx::query_as!( - DocumentVersionWithoutContent, + let query = sqlx::query!( r#" select vault_update_id, @@ -145,7 +144,8 @@ impl Database { updated_date as "updated_date: chrono::DateTime", is_deleted, user_id, - device_id + device_id, + length(content) as "content_size: u64" from latest_document_versions order by vault_update_id "#, @@ -159,6 +159,22 @@ impl Database { .await } .context("Cannot fetch latest documents") + .map(|rows| { + rows.into_iter() + .map(|row| DocumentVersionWithoutContent { + vault_update_id: row.vault_update_id, + document_id: row.document_id.into(), + relative_path: row.relative_path, + updated_date: row.updated_date, + is_deleted: row.is_deleted, + user_id: row.user_id, + device_id: row.device_id, + content_size: row + .content_size + .expect("Content size can't be null but sqlx can't infer it"), + }) + .collect() + }) } /// Return the latest state of all documents (including deleted) in the @@ -169,8 +185,7 @@ impl Database { vault_update_id: VaultUpdateId, transaction: Option<&mut Transaction<'_>>, ) -> Result> { - let query = sqlx::query_as!( - DocumentVersionWithoutContent, + let query = sqlx::query!( r#" select vault_update_id, @@ -179,7 +194,8 @@ impl Database { updated_date as "updated_date: chrono::DateTime", is_deleted, user_id, - device_id + device_id, + length(content) as "content_size: u64" from latest_document_versions where vault_update_id > ? order by vault_update_id @@ -197,6 +213,22 @@ impl Database { .with_context(|| { format!("Cannot fetch latest documents since vault_update_id {vault_update_id}") }) + .map(|rows| { + rows.into_iter() + .map(|row| DocumentVersionWithoutContent { + vault_update_id: row.vault_update_id, + document_id: row.document_id.into(), + relative_path: row.relative_path, + updated_date: row.updated_date, + is_deleted: row.is_deleted, + user_id: row.user_id, + device_id: row.device_id, + content_size: row + .content_size + .expect("Content size can't be null but sqlx can't infer it"), + }) + .collect() + }) } pub async fn get_max_update_id_in_vault( diff --git a/backend/sync_server/src/app_state/database/models.rs b/backend/sync_server/src/app_state/database/models.rs index 9f896ac5..62ba66b6 100644 --- a/backend/sync_server/src/app_state/database/models.rs +++ b/backend/sync_server/src/app_state/database/models.rs @@ -35,6 +35,7 @@ pub struct DocumentVersionWithoutContent { pub is_deleted: bool, pub user_id: UserId, pub device_id: DeviceId, + pub content_size: u64, } impl From for DocumentVersionWithoutContent { @@ -47,6 +48,7 @@ impl From for DocumentVersionWithoutContent { is_deleted: value.is_deleted, user_id: value.user_id, device_id: value.device_id, + content_size: value.content.len() as u64, } } } diff --git a/frontend/sync-client/src/services/types.ts b/frontend/sync-client/src/services/types.ts index 4fff201c..893eea70 100644 --- a/frontend/sync-client/src/services/types.ts +++ b/frontend/sync-client/src/services/types.ts @@ -516,6 +516,8 @@ export interface components { /** @description Response to an update document request. */ DocumentUpdateResponse: | { + /** Format: uint64 */ + contentSize: number; deviceId: string; /** Format: uuid */ documentId: string; @@ -558,6 +560,8 @@ export interface components { vaultUpdateId: number; }; DocumentVersionWithoutContent: { + /** Format: uint64 */ + contentSize: number; deviceId: string; /** Format: uuid */ documentId: string;