2020-10-21 18:14:34 +00:00
|
|
|
import 'package:flutter_sodium/flutter_sodium.dart';
|
|
|
|
import 'package:photos/core/configuration.dart';
|
2020-10-24 10:25:02 +00:00
|
|
|
import 'package:photos/db/files_db.dart';
|
2020-10-21 18:14:34 +00:00
|
|
|
import 'package:photos/models/collection.dart';
|
2020-06-19 23:03:26 +00:00
|
|
|
import 'package:photos/models/file.dart';
|
2020-10-21 18:14:34 +00:00
|
|
|
import 'package:photos/services/collections_service.dart';
|
|
|
|
import 'package:photos/utils/crypto_util.dart';
|
|
|
|
import 'package:photos/utils/file_uploader.dart';
|
2020-05-06 16:43:03 +00:00
|
|
|
|
2020-10-03 17:56:18 +00:00
|
|
|
class FavoritesService {
|
2020-10-21 18:14:34 +00:00
|
|
|
Configuration _config;
|
|
|
|
CollectionsService _collectionsService;
|
|
|
|
FileUploader _fileUploader;
|
2020-10-24 10:25:02 +00:00
|
|
|
FilesDB _filesDB;
|
2020-10-30 20:17:06 +00:00
|
|
|
int _cachedFavoritesCollectionID;
|
2020-10-21 18:14:34 +00:00
|
|
|
|
|
|
|
FavoritesService._privateConstructor() {
|
|
|
|
_config = Configuration.instance;
|
|
|
|
_collectionsService = CollectionsService.instance;
|
|
|
|
_fileUploader = FileUploader.instance;
|
2020-10-24 10:25:02 +00:00
|
|
|
_filesDB = FilesDB.instance;
|
2020-10-21 18:14:34 +00:00
|
|
|
}
|
|
|
|
static FavoritesService instance = FavoritesService._privateConstructor();
|
2020-05-06 16:43:03 +00:00
|
|
|
|
2020-10-30 20:17:06 +00:00
|
|
|
Future<bool> isFavorite(File file) async {
|
|
|
|
final collection = await _getFavoritesCollection();
|
|
|
|
if (collection == null) {
|
|
|
|
return false;
|
2020-10-24 10:25:02 +00:00
|
|
|
}
|
2020-10-30 20:17:06 +00:00
|
|
|
return _filesDB.doesFileExistInCollection(
|
|
|
|
file.uploadedFileID, collection.id);
|
2020-05-06 16:43:03 +00:00
|
|
|
}
|
2020-10-21 18:14:34 +00:00
|
|
|
|
|
|
|
Future<void> addToFavorites(File file) async {
|
2020-10-24 23:10:37 +00:00
|
|
|
final collectionID = await _getOrCreateFavoriteCollectionID();
|
2020-10-24 23:39:46 +00:00
|
|
|
if (file.uploadedFileID == null) {
|
2020-10-21 18:14:34 +00:00
|
|
|
file.collectionID = collectionID;
|
2020-10-24 23:39:46 +00:00
|
|
|
final uploadedFile = (await _fileUploader.encryptAndUploadFile(file));
|
|
|
|
await _filesDB.update(uploadedFile);
|
2020-10-21 22:36:55 +00:00
|
|
|
} else {
|
2020-10-24 10:25:02 +00:00
|
|
|
await _collectionsService.addToCollection(collectionID, [file]);
|
2020-10-21 18:14:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-23 16:18:38 +00:00
|
|
|
Future<void> removeFromFavorites(File file) async {
|
2020-10-24 23:10:37 +00:00
|
|
|
final collectionID = await _getOrCreateFavoriteCollectionID();
|
2020-10-23 16:18:38 +00:00
|
|
|
var fileID = file.uploadedFileID;
|
|
|
|
if (fileID == null) {
|
|
|
|
// Do nothing, ignore
|
|
|
|
} else {
|
2020-10-24 10:25:02 +00:00
|
|
|
await _collectionsService.removeFromCollection(collectionID, [file]);
|
2020-10-23 16:18:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-30 20:17:06 +00:00
|
|
|
Future<Collection> _getFavoritesCollection() async {
|
|
|
|
if (_cachedFavoritesCollectionID == null) {
|
2020-10-28 15:25:32 +00:00
|
|
|
final collections = _collectionsService.getCollections();
|
2020-10-26 09:58:08 +00:00
|
|
|
for (final collection in collections) {
|
|
|
|
if (collection.type == CollectionType.favorites) {
|
2020-10-30 20:17:06 +00:00
|
|
|
_cachedFavoritesCollectionID = collection.id;
|
2020-10-26 09:58:08 +00:00
|
|
|
return collection;
|
|
|
|
}
|
|
|
|
}
|
2020-10-24 23:10:37 +00:00
|
|
|
return null;
|
|
|
|
}
|
2020-10-30 20:17:06 +00:00
|
|
|
return _collectionsService.getCollectionByID(_cachedFavoritesCollectionID);
|
2020-10-24 23:10:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Future<int> _getOrCreateFavoriteCollectionID() async {
|
2020-10-30 20:17:06 +00:00
|
|
|
if (_cachedFavoritesCollectionID != null) {
|
|
|
|
return _cachedFavoritesCollectionID;
|
2020-10-21 18:14:34 +00:00
|
|
|
}
|
|
|
|
final key = CryptoUtil.generateKey();
|
|
|
|
final encryptedKeyData = CryptoUtil.encryptSync(key, _config.getKey());
|
|
|
|
final collection =
|
|
|
|
await _collectionsService.createAndCacheCollection(Collection(
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
Sodium.bin2base64(encryptedKeyData.encryptedData),
|
|
|
|
Sodium.bin2base64(encryptedKeyData.nonce),
|
|
|
|
"Favorites",
|
|
|
|
CollectionType.favorites,
|
2020-10-21 22:22:09 +00:00
|
|
|
CollectionAttributes(),
|
2020-10-21 18:14:34 +00:00
|
|
|
null,
|
|
|
|
));
|
2020-10-30 20:17:06 +00:00
|
|
|
_cachedFavoritesCollectionID = collection.id;
|
2020-10-21 18:14:34 +00:00
|
|
|
return collection.id;
|
|
|
|
}
|
2020-05-06 16:43:03 +00:00
|
|
|
}
|