Prevent duplicate uploads across collections
This commit is contained in:
parent
ab9d84d011
commit
805e5a8550
3 changed files with 52 additions and 16 deletions
|
@ -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>();
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue