Properly handle renaming folders in FileProviderExtension modifyItem
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 27 Feb 2023 22:04:36 +0000 (23:04 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:19 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift

index 3cc2a13d2c0748005ac665e498745795499247b8..f3b22cc8eea12a64414511f7004ba0ef2ee9497e 100644 (file)
@@ -357,6 +357,48 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension, NKComm
 
         NSLog("About to upload item with identifier: %@ of type: %@ (is folder: %@) and filename: %@ to server url: %@ with contents located at: %@", item.itemIdentifier.rawValue, item.contentType?.identifier ?? "UNKNOWN", itemTemplateIsFolder ? "yes" : "no", item.filename, newServerUrlFileName, fileNameLocalPath)
 
+        if itemTemplateIsFolder {
+            let ocId = item.itemIdentifier.rawValue
+
+            guard changedFields.contains(.filename) else {
+                NSLog("System requested modification for folder with ocID %@ (%@) of something other than folder name.", ocId, newServerUrlFileName)
+                completionHandler(item, [], false, nil)
+                return Progress()
+            }
+
+            guard let metadata = dbManager.itemMetadataFromOcId(ocId) else {
+                NSLog("Could not acquire metadata of item with identifier: %@", ocId)
+                completionHandler(nil, [], false, NSFileProviderError(.noSuchItem))
+                return Progress()
+            }
+
+            let oldServerUrlFileName = metadata.serverUrl + "/" + metadata.fileName
+
+            self.ncKit.moveFileOrFolder(serverUrlFileNameSource: oldServerUrlFileName,
+                                        serverUrlFileNameDestination: newServerUrlFileName,
+                                        overwrite: false) { account, error in
+                guard error == .success else {
+                    NSLog("Could not move folder with name: %@, received error: %@", item.filename, error.errorDescription)
+                    completionHandler(nil, [], false, NSFileProviderError(.serverUnreachable))
+                    return
+                }
+
+                dbManager.renameDirectoryAndPropagateToChildren(ocId: ocId, newServerUrl: newServerUrlFileName, newFileName: item.filename)
+
+                guard let newMetadata = dbManager.itemMetadataFromOcId(ocId) else {
+                    NSLog("Could not acquire metadata of item with identifier: %@", ocId)
+                    completionHandler(nil, [], false, NSFileProviderError(.noSuchItem))
+                    return
+                }
+
+                let fpItem = FileProviderItem(metadata: newMetadata, parentItemIdentifier: parentItemIdentifier, ncKit: self.ncKit)
+
+                completionHandler(fpItem, [], false, nil)
+            }
+
+            return Progress()
+        }
+
         self.ncKit.upload(serverUrlFileName: newServerUrlFileName,
                           fileNameLocalPath: fileNameLocalPath,
                           requestHandler: { _ in