From 64e9902f576cfecc927f8cdf665f6d8fbfa7282e Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 25 Apr 2025 12:36:33 +0530 Subject: [PATCH] Model & schema for local mapping --- mobile/lib/db/remote/db.dart | 4 +- mobile/lib/db/remote/schema.dart | 27 ++++++++-- .../remote/localMapper/upload_local_map.dart | 50 +++++++++++++++++++ 3 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 mobile/lib/services/remote/localMapper/upload_local_map.dart diff --git a/mobile/lib/db/remote/db.dart b/mobile/lib/db/remote/db.dart index 3556788236..649ab21b37 100644 --- a/mobile/lib/db/remote/db.dart +++ b/mobile/lib/db/remote/db.dart @@ -85,11 +85,11 @@ class RemoteDB with SqlDbBase { } await Future.wait([ _sqliteDB.executeBatch( - 'INSERT OR REPLACE INTO collection_files ($collectionFilesColumns) values(?, ?, ?, ?, ?, ?, ?)', + 'INSERT INTO collection_files ($collectionFilesColumns) values(?, ?, ?, ?, ?, ?) ON CONFLICT(file_id, collection_id) DO UPDATE SET $collectionFilesUpdateColumns', collectionFileValues, ), _sqliteDB.executeBatch( - 'INSERT INTO files ($filesColumns) values(${getParams(17)}) ON CONFLICT(id) DO UPDATE SET $filesUpdateColumns', + 'INSERT INTO files ($filesColumns) values(${getParams(15)}) ON CONFLICT(id) DO UPDATE SET $filesUpdateColumns', fileValues, ), ]); diff --git a/mobile/lib/db/remote/schema.dart b/mobile/lib/db/remote/schema.dart index 278d96108e..084a308cdb 100644 --- a/mobile/lib/db/remote/schema.dart +++ b/mobile/lib/db/remote/schema.dart @@ -11,10 +11,21 @@ final String updateCollectionColumns = collectionColumns .join(', '); const collectionFilesColumns = - 'collection_id, file_id, enc_key, enc_key_nonce, created_at, updated_at, is_deleted'; + 'collection_id, file_id, enc_key, enc_key_nonce, created_at, updated_at'; + +final String collectionFilesUpdateColumns = collectionFilesColumns + .split(', ') + .where( + (column) => + column != 'collection_id' || + column != 'file_id' || + column != 'created_at', + ) + .map((column) => '$column = excluded.$column') // Use excluded virtual table + .join(', '); const filesColumns = 'id, owner_id, file_header, thumb_header, creation_time, modification_time, title, size, hash, lat, lng, ' - 'metadata, priv_metadata, pub_metadata, info, local_id, local_mapping_src'; + 'metadata, priv_metadata, pub_metadata, info'; final String filesUpdateColumns = filesColumns .split(', ') @@ -83,9 +94,7 @@ class RemoteDBMigration { metadata TEXT NOT NULL, priv_metadata TEXT, pub_metadata TEXT, - info TEXT, - local_id TEXT DEFAULT NULL, - local_mapping_src TEXT DEFAULT NULL + info TEXT ) ''', ''' @@ -107,6 +116,14 @@ class RemoteDBMigration { DELETE FROM files WHERE id = OLD.file_id; END; ''', + ''' + CREATE TABLE upload_mapping ( + file_id INTEGER PRIMARY KEY, + local_id TEXT DEFAULT NOT NULL, + -- icloud identifier if available + local_clould_id TEXT, + local_mapping_src TEXT DEFAULT NULL + )''' ]; } diff --git a/mobile/lib/services/remote/localMapper/upload_local_map.dart b/mobile/lib/services/remote/localMapper/upload_local_map.dart new file mode 100644 index 0000000000..8f2b358992 --- /dev/null +++ b/mobile/lib/services/remote/localMapper/upload_local_map.dart @@ -0,0 +1,50 @@ +enum MappingType { + remote, + cloudIdMatched, + deviceUpload, + deviceHashMatched, +} + +extension MappingTypeExtension on MappingType { + String get name { + switch (this) { + case MappingType.remote: + return "remote"; + case MappingType.cloudIdMatched: + return "cloudIdMatched"; + case MappingType.deviceUpload: + return "deviceUpload"; + case MappingType.deviceHashMatched: + return "deviceHashMatched"; + } + } + + MappingType fromName(String name) { + switch (name) { + case "remote": + return MappingType.remote; + case "cloudIdMatched": + return MappingType.cloudIdMatched; + case "deviceUpload": + return MappingType.deviceUpload; + case "deviceHashMatched": + return MappingType.deviceHashMatched; + default: + throw Exception("Unknown mapping type: $name"); + } + } +} + +class UploadLocalMapping { + final int remoteUploadID; + final String localID; + final String? localCloudID; + final MappingType mappingType; + + UploadLocalMapping({ + required this.remoteUploadID, + required this.localID, + required this.localCloudID, + required this.mappingType, + }); +}