1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
//
// ShareController.swift
// FileProviderUIExt
//
// SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
// SPDX-License-Identifier: GPL-2.0-or-later
//
import Combine
import Foundation
import NextcloudFileProviderKit
import NextcloudKit
import OSLog
class ShareController: ObservableObject {
@Published private(set) var share: NKShare
private let kit: NextcloudKit
private let account: Account
let log: any FileProviderLogging
let logger: FileProviderLogger
static func create(
account: Account,
kit: NextcloudKit,
shareType: NKShare.ShareType,
itemServerRelativePath: String,
shareWith: String?,
password: String? = nil,
expireDate: String? = nil,
permissions: Int = 1,
publicUpload: Bool = false,
note: String? = nil,
label: String? = nil,
hideDownload: Bool,
attributes: String? = nil,
options: NKRequestOptions = NKRequestOptions()
) async -> NKError? {
return await withCheckedContinuation { continuation in
if shareType == .publicLink {
kit.createShare(
path: itemServerRelativePath,
shareType: ShareType.publicLink.rawValue,
shareWith: nil,
publicUpload: publicUpload,
hideDownload: hideDownload,
password: password,
permissions: permissions,
account: account.ncKitAccount,
options: options
) { account, share, data, error in
continuation.resume(returning: error)
}
} else {
guard let shareWith = shareWith else {
let error = NKError(statusCode: 0, fallbackDescription: "No recipient for share!")
continuation.resume(returning: error)
return
}
kit.createShare(
path: itemServerRelativePath,
shareType: shareType.rawValue,
shareWith: shareWith,
password: password,
permissions: permissions,
attributes: attributes,
account: account.ncKitAccount
) { account, share, data, error in
continuation.resume(returning: error)
}
}
}
}
init(share: NKShare, account: Account, kit: NextcloudKit, log: any FileProviderLogging) {
self.account = account
self.share = share
self.kit = kit
self.log = log
self.logger = FileProviderLogger(category: "ShareController", log: log)
}
func save(
password: String? = nil,
expireDate: String? = nil,
permissions: Int = 1,
publicUpload: Bool = false,
note: String? = nil,
label: String? = nil,
hideDownload: Bool,
attributes: String? = nil,
options: NKRequestOptions = NKRequestOptions()
) async -> NKError? {
logger.info("Saving share.", [.url: self.share.url])
return await withCheckedContinuation { continuation in
kit.updateShare(
idShare: share.idShare,
password: password,
expireDate: expireDate,
permissions: permissions,
publicUpload: publicUpload,
note: note,
label: label,
hideDownload: hideDownload,
attributes: attributes,
account: account.ncKitAccount,
options: options
) { account, share, data, error in
self.logger.info("Received update response: \(share?.url ?? "")")
defer {
continuation.resume(returning: error)
}
guard error == .success, let share = share else {
self.logger.error("Error updating save.", [.error: error])
return
}
self.share = share
}
}
}
func delete() async -> NKError? {
logger.info("Deleting share: \(self.share.url)")
return await withCheckedContinuation { continuation in
kit.deleteShare(idShare: share.idShare, account: account.ncKitAccount) { account, _, error in
self.logger.info("Received delete response: \(self.share.url)")
defer {
continuation.resume(returning: error)
}
guard error == .success else {
self.logger.error("Error deleting save: \(error.errorDescription)")
return
}
}
}
}
}
|