From 06b59b675621d2090cbe56641da6bf394f2a65e8 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Tue, 7 Mar 2023 01:15:09 +0100 Subject: [PATCH] Correctly fulfill delete item requests on server Signed-off-by: Claudio Cambra --- .../FileProviderExtension.swift | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift index d3d1d9cf3..2a5dbd87e 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift @@ -491,8 +491,51 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension, NKComm func deleteItem(identifier: NSFileProviderItemIdentifier, baseVersion version: NSFileProviderItemVersion, options: NSFileProviderDeleteItemOptions = [], request: NSFileProviderRequest, completionHandler: @escaping (Error?) -> Void) -> Progress { // TODO: an item was deleted on disk, process the item's deletion - - completionHandler(NSError(domain: NSCocoaErrorDomain, code: NSFeatureUnsupportedError, userInfo:[:])) + + NSLog("Received delete item request for item with identifier: %@", identifier.rawValue) + + guard ncAccount != nil else { + NSLog("Not deleting item: %@ as account not set up yet", identifier.rawValue) + completionHandler(NSFileProviderError(.notAuthenticated)) + return Progress() + } + + let dbManager = NextcloudFilesDatabaseManager.shared + let ocId = identifier.rawValue + guard let itemMetadata = dbManager.itemMetadataFromOcId(ocId) else { + completionHandler(NSFileProviderError(.noSuchItem)) + return Progress() + } + + let serverFileNameUrl = itemMetadata.serverUrl + "/" + itemMetadata.fileName + guard serverFileNameUrl != "" else { + completionHandler(NSFileProviderError(.noSuchItem)) + return Progress() + } + + self.ncKit.deleteFileOrFolder(serverUrlFileName: serverFileNameUrl) { account, error in + guard error == .success else { + NSLog("Could not delete item with ocId %@ and fileName %@, received error: %@", error.error.localizedDescription) + completionHandler(NSFileProviderError(.serverUnreachable)) + return + } + + NSLog("Successfully delete item with identifier: %@ and filename: %@", ocId, serverFileNameUrl) + + let serverUrl = itemMetadata.serverUrl + dbManager.deleteItemMetadata(account: account, serverUrl: serverUrl) + + if itemMetadata.directory && dbManager.directoryMetadata(ocId: ocId) != nil { + dbManager.deleteDirectoryAndSubdirectoriesMetadata(account: account, serverUrl: serverUrl) + } + + if dbManager.localFileMetadataFromOcId(ocId) != nil { + dbManager.deleteLocalFileMetadata(ocId: ocId) + } + + completionHandler(nil) + } + return Progress() } -- 2.30.2