Ensure that the location is saved to the metadata if unavailable before uploading

This commit is contained in:
Vishnu Mohandas 2020-10-25 05:09:46 +05:30
parent 3d56f71be3
commit 6cabe8c21a
4 changed files with 23 additions and 63 deletions

View file

@ -267,34 +267,13 @@ class FilesDB {
}
}
Future<int> update(
int generatedID,
int uploadedID,
int ownerID,
int collectionID,
int updationTime,
String encryptedKey,
String keyDecryptionNonce,
String fileDecryptionHeader,
String thumbnailDecryptionHeader,
String metadataDecryptionHeader,
) async {
Future<int> update(File file) async {
final db = await instance.database;
final values = new Map<String, dynamic>();
values[columnUploadedFileID] = uploadedID;
values[columnOwnerID] = ownerID;
values[columnCollectionID] = collectionID;
values[columnUpdationTime] = updationTime;
values[columnEncryptedKey] = encryptedKey;
values[columnKeyDecryptionNonce] = keyDecryptionNonce;
values[columnFileDecryptionHeader] = fileDecryptionHeader;
values[columnThumbnailDecryptionHeader] = thumbnailDecryptionHeader;
values[columnMetadataDecryptionHeader] = metadataDecryptionHeader;
return await db.update(
table,
values,
_getRowForFile(file),
where: '$columnGeneratedID = ?',
whereArgs: [generatedID],
whereArgs: [file.generatedID],
);
}

View file

@ -48,22 +48,10 @@ class FavoritesService {
Future<void> addToFavorites(File file) async {
final collectionID = await _getOrCreateFavoriteCollectionID();
var fileID = file.uploadedFileID;
if (fileID == null) {
if (file.uploadedFileID == null) {
file.collectionID = collectionID;
fileID = (await _fileUploader.encryptAndUploadFile(file)).uploadedFileID;
await _filesDB.update(
file.generatedID,
file.uploadedFileID,
file.ownerID,
file.collectionID,
file.updationTime,
file.encryptedKey,
file.keyDecryptionNonce,
file.fileDecryptionHeader,
file.thumbnailDecryptionHeader,
file.metadataDecryptionHeader,
);
final uploadedFile = (await _fileUploader.encryptAndUploadFile(file));
await _filesDB.update(uploadedFile);
} else {
await _collectionsService.addToCollection(collectionID, [file]);
_cachedFavoriteFiles.add(file);

View file

@ -216,18 +216,7 @@ class SyncService {
.addToCollection(file.collectionID, [existingFile]);
} else {
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(uploadedFile);
}
Bus.instance.fire(PhotoUploadEvent(
completed: i + 1, total: filesToBeUploaded.length));
@ -244,18 +233,16 @@ class SyncService {
final existingFile = await _db.getMatchingFile(file.localID, file.title,
file.deviceFolder, file.creationTime, file.modificationTime,
alternateTitle: getHEICFileNameForJPG(file));
await _db.update(
existingFile.generatedID,
file.uploadedFileID,
file.ownerID,
file.collectionID,
file.updationTime,
file.encryptedKey,
file.keyDecryptionNonce,
file.fileDecryptionHeader,
file.thumbnailDecryptionHeader,
file.metadataDecryptionHeader,
);
file.localID = existingFile.localID;
if (existingFile.collectionID == null ||
existingFile.collectionID == file.collectionID) {
// Uploaded for the first time || updated within the same collection
file.generatedID = existingFile.generatedID;
await _db.update(file);
} else {
// If an existing file was added to a collection
await _db.insert(file);
}
} catch (e) {
file.localID = null; // File uploaded from a different device
await _db.insert(file);

View file

@ -6,6 +6,7 @@ import 'package:logging/logging.dart';
import 'package:photos/core/configuration.dart';
import 'package:photos/core/constants.dart';
import 'package:photos/models/file.dart';
import 'package:photos/models/location.dart';
import 'package:photos/models/upload_url.dart';
import 'package:photos/services/collections_service.dart';
import 'package:photos/utils/crypto_util.dart';
@ -93,6 +94,11 @@ class FileUploader {
String thumbnailObjectKey =
await putFile(thumbnailUploadURL, io.File(encryptedThumbnailPath));
if (file.location.latitude == 0 && file.location.longitude == 0) {
final latLong = await (await file.getAsset()).latlngAsync();
file.location = Location(latLong.latitude, latLong.longitude);
}
final encryptedMetadataData = CryptoUtil.encryptChaCha(
utf8.encode(jsonEncode(file.getMetadata())), fileAttributes.key);