浏览代码

fix groupfolders

Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>
Marino Faggiana 1 年之前
父节点
当前提交
eae6bbc5c9

+ 24 - 4
iOSClient/Data/NCManageDatabase+Metadata.swift

@@ -1085,11 +1085,31 @@ extension NCManageDatabase {
         return num
     }
 
-    func getGroupFoldersMetadata(account: String, serverUrl: String) -> [tableMetadata] {
+    func getMetadataFromDirectory(account: String, serverUrl: String) -> tableMetadata? {
 
         let realm = try! Realm()
 
-        let result = realm.objects(tableMetadata.self).filter("mountType == 'group' && directory == true && serverUrl == %@", serverUrl)
-        return Array(result.map { tableMetadata.init(value: $0) })
-    } 
+        guard let directory = realm.objects(tableDirectory.self).filter("account == %@ AND serverUrl == %@", account, serverUrl).first else { return nil }
+        guard let result = realm.objects(tableMetadata.self).filter("ocId == %@", directory.ocId).first else { return nil }
+
+        return tableMetadata.init(value: result)
+    }
+
+    func getMetadatasFromGroupfolders(account: String, urlBase: String, userId: String) -> [tableMetadata] {
+
+        let realm = try! Realm()
+        var metadatas: [tableMetadata] = []
+        let homeServerUrl = NCUtilityFileSystem.shared.getHomeServer(urlBase: urlBase, userId: userId)
+
+        let groupfolders = realm.objects(TableGroupfolders.self).filter("account == %@", account)
+        for groupfolder in groupfolders {
+            let serverUrlFileName = homeServerUrl + "/" + groupfolder.mountPoint
+            if let directory = realm.objects(tableDirectory.self).filter("account == %@ AND serverUrl == %@", account, serverUrlFileName).first,
+               let metadata = realm.objects(tableMetadata.self).filter("ocId == %@", directory.ocId).first {
+                metadatas.append(tableMetadata(value: metadata))
+            }
+        }
+
+        return metadatas
+    }
 }

+ 57 - 19
iOSClient/Groupfolders/NCGroupfolders.swift

@@ -46,6 +46,29 @@ class NCGroupfolders: NCCollectionViewCommon {
         super.viewWillAppear(animated)
 
         navigationController?.setFileAppreance()
+
+        NotificationCenter.default.addObserver(self, selector: #selector(readFile(_:)), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterOperationReadFile), object: nil)
+    }
+
+    override func viewWillDisappear(_ animated: Bool) {
+        super.viewWillDisappear(animated)
+
+        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterOperationReadFile), object: nil)
+    }
+
+    // MARK: - NotificationCenter
+
+    @objc func readFile(_ notification: NSNotification) {
+
+        guard let userInfo = notification.userInfo as NSDictionary?,
+              let ocId = userInfo["ocId"] as? String,
+              let metadata = NCManageDatabase.shared.getMetadataFromOcId(ocId)
+        else {
+            return
+        }
+
+        dataSource.addMetadata(metadata)
+        self.collectionView?.reloadData()
     }
 
     // MARK: - DataSource + NC Endpoint
@@ -58,8 +81,7 @@ class NCGroupfolders: NCCollectionViewCommon {
             var metadatas: [tableMetadata] = []
 
             if self.serverUrl.isEmpty {
-                let serverUrl = NCUtilityFileSystem.shared.getHomeServer(urlBase: self.appDelegate.urlBase, userId: self.appDelegate.userId)
-                metadatas = NCManageDatabase.shared.getGroupFoldersMetadata(account: self.appDelegate.account, serverUrl: serverUrl)
+                metadatas = NCManageDatabase.shared.getMetadatasFromGroupfolders(account: self.appDelegate.account, urlBase: self.appDelegate.urlBase, userId: self.appDelegate.userId)
             } else {
                 metadatas = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", self.appDelegate.account, self.serverUrl))
             }
@@ -86,29 +108,45 @@ class NCGroupfolders: NCCollectionViewCommon {
     override func reloadDataSourceNetwork(forced: Bool = false) {
         super.reloadDataSourceNetwork(forced: forced)
 
-        guard !serverUrl.isEmpty else {
-            self.reloadDataSource()
-            return
-        }
-
         isReloadDataSourceNetworkInProgress = true
         collectionView?.reloadData()
 
-        networkReadFolder(forced: forced) { tableDirectory, metadatas, metadatasUpdate, metadatasDelete, error in
-            if error == .success, let metadatas = metadatas {
-                for metadata in metadatas where (!metadata.directory && NCManageDatabase.shared.isDownloadMetadata(metadata, download: true)) {
-                    NCOperationQueue.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorDownloadFile)
+        if serverUrl.isEmpty {
+
+            let homeServerUrl = NCUtilityFileSystem.shared.getHomeServer(urlBase: self.appDelegate.urlBase, userId: self.appDelegate.userId)
+            let options = NKRequestOptions(queue: NextcloudKit.shared.nkCommonInstance.backgroundQueue)
+
+            NextcloudKit.shared.getGroupfolders(options: options) { account, results, _, error in
+
+                DispatchQueue.main.async {
+                    self.refreshControl.endRefreshing()
+                    self.isReloadDataSourceNetworkInProgress = false
                 }
+
+                if error == .success, let groupfolders = results {
+                    NCManageDatabase.shared.addGroupfolders(account: account, groupfolders: groupfolders)
+                    for groupfolder in groupfolders {
+                        let serverUrlFileName = homeServerUrl + "/" + groupfolder.mountPoint
+                        if NCManageDatabase.shared.getMetadataFromDirectory(account: self.appDelegate.account, serverUrl: serverUrlFileName) == nil {
+                            NCOperationQueue.shared.readFile(serverUrlFileName: serverUrlFileName)
+                        }
+                    }
+                }
+                self.reloadDataSource()
             }
+        } else {
 
-            DispatchQueue.main.async {
-                self.refreshControl.endRefreshing()
-                self.isReloadDataSourceNetworkInProgress = false
-                self.richWorkspaceText = tableDirectory?.richWorkspace
-                if metadatasUpdate?.count ?? 0 > 0 || metadatasDelete?.count ?? 0 > 0 || forced {
-                    self.reloadDataSource()
-                } else {
-                    self.collectionView?.reloadData()
+            networkReadFolder(forced: forced) { _, _, metadatasUpdate, metadatasDelete, _ in
+
+                DispatchQueue.main.async {
+                    self.refreshControl.endRefreshing()
+                    self.isReloadDataSourceNetworkInProgress = false
+
+                    if !(metadatasUpdate?.isEmpty ?? true) || !(metadatasDelete?.isEmpty ?? true) || forced {
+                        self.reloadDataSource()
+                    } else {
+                        self.collectionView?.reloadData()
+                    }
                 }
             }
         }

+ 2 - 0
iOSClient/NCGlobal.swift

@@ -354,6 +354,8 @@ class NCGlobal: NSObject {
     let notificationCenterCopyFile                              = "copyFile"                        // userInfo: ocId, serverUrlTo
     let notificationCenterFavoriteFile                          = "favoriteFile"                    // userInfo: ocId, serverUrl
 
+    let notificationCenterOperationReadFile                     = "operationReadFile"               // userInfo: ocId
+
     let notificationCenterMenuSearchTextPDF                     = "menuSearchTextPDF"
     let notificationCenterMenuGotToPageInPDF                    = "menuGotToPageInPDF"
     let notificationCenterMenuDetailClose                       = "menuDetailClose"

+ 46 - 2
iOSClient/Networking/NCOperationQueue.swift

@@ -40,8 +40,7 @@ import NextcloudKit
     private let downloadThumbnailActivityQueue = Queuer(name: "downloadThumbnailActivityQueue", maxConcurrentOperationCount: 10, qualityOfService: .default)
     private let downloadAvatarQueue = Queuer(name: "downloadAvatarQueue", maxConcurrentOperationCount: 10, qualityOfService: .default)
     private let unifiedSearchQueue = Queuer(name: "unifiedSearchQueue", maxConcurrentOperationCount: 1, qualityOfService: .default)
-
-    private var timerReadFileForMediaQueue: Timer?
+    private let readFileQueue = Queuer(name: "unifiedSearchQueue", maxConcurrentOperationCount: 10, qualityOfService: .default)
 
     @objc func cancelAllQueue() {
         downloadCancelAll()
@@ -52,6 +51,7 @@ import NextcloudKit
         downloadThumbnailActivityCancelAll()
         downloadAvatarCancelAll()
         unifiedSearchCancelAll()
+        readFileCancelAll()
     }
 
     // MARK: - Download file
@@ -226,6 +226,21 @@ import NextcloudKit
     func unifiedSearchCancelAll() {
         unifiedSearchQueue.cancelAll()
     }
+
+    // MARK: - Read file
+
+    func readFile(serverUrlFileName: String) {
+
+        for case let operation as NCOperationReadFile in readFileQueue.operations where operation.serverUrlFileName == serverUrlFileName {
+            return
+        }
+
+        readFileQueue.addOperation(NCOperationReadFile(serverUrlFileName: serverUrlFileName))
+    }
+
+    func readFileCancelAll() {
+        readFileQueue.cancelAll()
+    }
 }
 
 // MARK: -
@@ -637,3 +652,32 @@ class NCOperationUnifiedSearch: ConcurrentOperation {
         }
     }
 }
+
+// MARK: -
+
+class NCOperationReadFile: ConcurrentOperation {
+
+    var serverUrlFileName: String
+
+    init(serverUrlFileName: String) {
+        self.serverUrlFileName = serverUrlFileName
+    }
+
+    override func start() {
+
+        if isCancelled {
+            self.finish()
+        } else {
+
+            NCNetworking.shared.readFile(serverUrlFileName: serverUrlFileName) { account, metadata, error in
+                if error == .success, let metadata = metadata {
+                    NCManageDatabase.shared.addMetadata(metadata)
+                    if metadata.directory {
+                        NCManageDatabase.shared.addDirectory(encrypted: metadata.e2eEncrypted, favorite: metadata.favorite, ocId: metadata.ocId, fileId: metadata.fileId, etag: nil, permissions: metadata.permissions, serverUrl: self.serverUrlFileName, account: account)
+                    }
+                    NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterOperationReadFile, userInfo: ["ocId": metadata.ocId])
+                }
+            }
+        }
+    }
+}