소스 검색

Add API to create a collection

Vishnu Mohandas 4 년 전
부모
커밋
b12f746567
1개의 변경된 파일55개의 추가작업 그리고 4개의 파일을 삭제
  1. 55 4
      lib/services/collections_service.dart

+ 55 - 4
lib/services/collections_service.dart

@@ -1,3 +1,4 @@
+import 'dart:convert';
 import 'dart:io';
 import 'dart:typed_data';
 
@@ -7,7 +8,6 @@ import 'package:logging/logging.dart';
 import 'package:photos/core/configuration.dart';
 import 'package:photos/db/collections_db.dart';
 import 'package:photos/models/collection.dart';
-import 'package:photos/services/user_service.dart';
 import 'package:photos/utils/crypto_util.dart';
 
 class CollectionsService {
@@ -15,12 +15,11 @@ class CollectionsService {
 
   CollectionsDB _db;
   Configuration _config;
-  UserService _userService;
+  Map<String, Collection> _localCollections;
 
   CollectionsService._privateConstructor() {
     _db = CollectionsDB.instance;
     _config = Configuration.instance;
-    _userService = UserService.instance;
   }
 
   static final CollectionsService instance =
@@ -29,8 +28,18 @@ class CollectionsService {
   Future<void> sync() async {
     final lastCollectionCreationTime =
         await _db.getLastCollectionCreationTime();
-    final collections = await getCollections(lastCollectionCreationTime ?? 0);
+    var collections = await getCollections(lastCollectionCreationTime ?? 0);
     await _db.insert(collections);
+    collections = await _db.getAll();
+    for (final collection in collections) {
+      if (collection.ownerID == _config.getUserID()) {
+        var path = utf8.decode(CryptoUtil.decryptSync(
+            Sodium.base642bin(collection.encryptedPath),
+            _config.getKey(),
+            Sodium.base642bin(collection.pathDecryptionNonce)));
+        _localCollections[path] = collection;
+      }
+    }
   }
 
   Future<Collection> getFolder(String path) async {
@@ -88,4 +97,46 @@ class CollectionsService {
       return collections;
     });
   }
+
+  Future<Collection> getOrCreateForPath(String path) async {
+    if (_localCollections.containsKey(path)) {
+      return _localCollections[path];
+    }
+    var collection = await getFolder(path);
+    if (collection.id == null) {
+      final key = CryptoUtil.generateKey();
+      final encryptedKeyData = CryptoUtil.encryptSync(key, _config.getKey());
+      final encryptedPath =
+          CryptoUtil.encryptSync(utf8.encode(path), _config.getKey());
+      collection = await createCollection(Collection(
+        null,
+        null,
+        Sodium.bin2base64(encryptedKeyData.encryptedData),
+        Sodium.bin2base64(encryptedKeyData.nonce),
+        path,
+        CollectionType.folder,
+        Sodium.bin2base64(encryptedPath.encryptedData),
+        Sodium.bin2base64(encryptedPath.nonce),
+        null,
+        null,
+      ));
+      _localCollections[path] = collection;
+      return collection;
+    } else {
+      return collection;
+    }
+  }
+
+  Future<Collection> createCollection(Collection collection) async {
+    return Dio()
+        .post(
+      Configuration.instance.getHttpEndpoint() + "/collections/",
+      data: collection.toMap(),
+      options:
+          Options(headers: {"X-Auth-Token": Configuration.instance.getToken()}),
+    )
+        .then((response) {
+      return Collection.fromMap(response.data["collection"]);
+    });
+  }
 }