From 12aa457e3a839b18314b7a6f559d2609672ad37d Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Sun, 19 Oct 2025 11:47:55 +0100 Subject: [PATCH] Add has_been_merged to DB --- sync-server/src/app_state/database.rs | 9 ++++++--- .../20251019103154_add_has_been_merged.sql | 13 +++++++++++++ sync-server/src/app_state/database/models.rs | 2 ++ sync-server/src/server/create_document.rs | 1 + sync-server/src/server/delete_document.rs | 1 + sync-server/src/server/update_document.rs | 8 +++++--- 6 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 sync-server/src/app_state/database/migrations/20251019103154_add_has_been_merged.sql diff --git a/sync-server/src/app_state/database.rs b/sync-server/src/app_state/database.rs index f8940140..2fc47ccb 100644 --- a/sync-server/src/app_state/database.rs +++ b/sync-server/src/app_state/database.rs @@ -278,7 +278,8 @@ impl Database { content, is_deleted, user_id, - device_id + device_id, + has_been_merged from latest_document_versions where relative_path = ? order by vault_update_id desc -- `latest_document_versions` only contains a single latest version of each document, however, @@ -317,7 +318,8 @@ impl Database { content, is_deleted, user_id, - device_id + device_id, + has_been_merged from latest_document_versions where document_id = ? "#, @@ -351,7 +353,8 @@ impl Database { content, is_deleted, user_id, - device_id + device_id, + has_been_merged from documents where vault_update_id = ?"#, vault_update_id diff --git a/sync-server/src/app_state/database/migrations/20251019103154_add_has_been_merged.sql b/sync-server/src/app_state/database/migrations/20251019103154_add_has_been_merged.sql new file mode 100644 index 00000000..5259c175 --- /dev/null +++ b/sync-server/src/app_state/database/migrations/20251019103154_add_has_been_merged.sql @@ -0,0 +1,13 @@ +ALTER TABLE documents ADD COLUMN has_been_merged BOOLEAN NOT NULL DEFAULT False; + +DROP VIEW latest_document_versions; + +CREATE VIEW IF NOT EXISTS latest_document_versions AS --recreate view as it now includes one more field +SELECT d.* +FROM documents d +INNER JOIN ( + SELECT MAX(vault_update_id) AS max_version_id + FROM documents + GROUP BY document_id +) max_versions +ON d.vault_update_id = max_versions.max_version_id; diff --git a/sync-server/src/app_state/database/models.rs b/sync-server/src/app_state/database/models.rs index 24c0c370..a216125a 100644 --- a/sync-server/src/app_state/database/models.rs +++ b/sync-server/src/app_state/database/models.rs @@ -20,6 +20,8 @@ pub struct StoredDocumentVersion { pub is_deleted: bool, pub user_id: UserId, pub device_id: DeviceId, + #[allow(dead_code)] // This is for manual analysis + pub has_been_merged: bool, } impl PartialEq for StoredDocumentVersion { diff --git a/sync-server/src/server/create_document.rs b/sync-server/src/server/create_document.rs index 7018d8cf..d8083410 100644 --- a/sync-server/src/server/create_document.rs +++ b/sync-server/src/server/create_document.rs @@ -77,6 +77,7 @@ pub async fn create_document( is_deleted: false, user_id: user.name, device_id: device_id.0, + has_been_merged: false, }; state diff --git a/sync-server/src/server/delete_document.rs b/sync-server/src/server/delete_document.rs index 5b7cd6ef..a9fd1d4d 100644 --- a/sync-server/src/server/delete_document.rs +++ b/sync-server/src/server/delete_document.rs @@ -66,6 +66,7 @@ pub async fn delete_document( is_deleted: true, user_id: user.name, device_id: device_id.0, + has_been_merged: false }; state diff --git a/sync-server/src/server/update_document.rs b/sync-server/src/server/update_document.rs index 99d3f490..04ba8b63 100644 --- a/sync-server/src/server/update_document.rs +++ b/sync-server/src/server/update_document.rs @@ -120,11 +120,12 @@ pub async fn update_document( ))); } - let merged_content = if is_file_type_mergable(&sanitized_relative_path) + let are_all_participants_mergable = is_file_type_mergable(&sanitized_relative_path) && !is_binary(&parent_document.content) && !is_binary(&latest_version.content) - && !is_binary(&content) - { + && !is_binary(&content); + + let merged_content = if are_all_participants_mergable { reconcile( str::from_utf8(&parent_document.content) .expect("parent must be valid UTF-8 because it's not binary"), @@ -177,6 +178,7 @@ pub async fn update_document( is_deleted: false, user_id: user.name, device_id: device_id.0, + has_been_merged: are_all_participants_mergable && is_different_from_request_content, }; state