Prevent duplicate uploads across collections

This commit is contained in:
Vishnu Mohandas 2020-10-25 01:35:50 +05:30
parent ab9d84d011
commit 805e5a8550
3 changed files with 52 additions and 16 deletions

View file

@ -113,6 +113,18 @@ class FilesDB {
return await batch.commit();
}
Future<File> getFile(int generatedID) async {
final db = await instance.database;
final results = await db.query(table,
where: '$columnGeneratedID = ?', whereArgs: [generatedID]);
final convertedResults = _convertToFiles(results);
if (convertedResults.length == 0) {
return null;
} else {
return convertedResults[1];
}
}
Future<List<File>> getOwnedFiles(int ownerID) async {
final db = await instance.database;
final whereArgs = List<dynamic>();

View file

@ -201,24 +201,37 @@ class SyncService {
file.collectionID = (await CollectionsService.instance
.getOrCreateForPath(file.deviceFolder))
.id;
var uploadedFile;
if (Configuration.instance.hasOptedForE2E()) {
uploadedFile = await _uploader.encryptAndUploadFile(file);
final existingFile = await _db.getFile(file.generatedID);
if (existingFile.uploadedFileID != null) {
// The file was uploaded outside this loop
// Eg: Addition to an album or favorites
await CollectionsService.instance
.addToCollection(file.collectionID, [existingFile]);
} else if (_uploader.getCurrentUploadStatus(file.generatedID) !=
null) {
// The file is currently being uploaded outside this loop
// Eg: Addition to an album or favorites
await _uploader.getCurrentUploadStatus(file.generatedID);
await CollectionsService.instance
.addToCollection(file.collectionID, [existingFile]);
} else {
uploadedFile = await _uploader.uploadFile(file);
// TODO: The file might be currently being uploaded leading to two
// deep copies
final uploadedFile = await _uploader.encryptAndUploadFile(file);
await _db.update(
file.generatedID,
uploadedFile.uploadedFileID,
uploadedFile.ownerID,
uploadedFile.collectionID,
uploadedFile.updationTime,
file.encryptedKey,
file.keyDecryptionNonce,
file.fileDecryptionHeader,
file.thumbnailDecryptionHeader,
file.metadataDecryptionHeader,
);
}
await _db.update(
file.generatedID,
uploadedFile.uploadedFileID,
uploadedFile.ownerID,
uploadedFile.collectionID,
uploadedFile.updationTime,
file.encryptedKey,
file.keyDecryptionNonce,
file.fileDecryptionHeader,
file.thumbnailDecryptionHeader,
file.metadataDecryptionHeader,
);
Bus.instance.fire(PhotoUploadEvent(
completed: i + 1, total: filesToBeUploaded.length));
} catch (e) {

View file

@ -15,10 +15,15 @@ import 'package:photos/utils/file_util.dart';
class FileUploader {
final _logger = Logger("FileUploader");
final _dio = Dio();
final _currentlyUploading = Map<int, Future<File>>();
FileUploader._privateConstructor();
static FileUploader instance = FileUploader._privateConstructor();
Future<File> getCurrentUploadStatus(int generatedID) {
return _currentlyUploading[generatedID];
}
Future<UploadURL> getUploadURL() {
return Dio()
.get(
@ -53,6 +58,11 @@ class FileUploader {
}
Future<File> encryptAndUploadFile(File file) async {
_currentlyUploading[file.generatedID] = _encryptAndUploadFile(file);
return _currentlyUploading[file.generatedID];
}
Future<File> _encryptAndUploadFile(File file) async {
_logger.info("Uploading " + file.toString());
final encryptedFileName = file.generatedID.toString() + ".encrypted";
final tempDirectory = Configuration.instance.getTempDirectory();
@ -137,6 +147,7 @@ class FileUploader {
file.fileDecryptionHeader = fileDecryptionHeader;
file.thumbnailDecryptionHeader = thumbnailDecryptionHeader;
file.metadataDecryptionHeader = metadataDecryptionHeader;
_currentlyUploading.remove(file.generatedID);
return file;
});
}