Skip to content

Commit a499dc3

Browse files
Merge pull request #206 from nextcloud/searchMedia
Search media
2 parents eb1d4eb + 35063ec commit a499dc3

2 files changed

Lines changed: 17 additions & 129 deletions

File tree

Sources/NextcloudKit/Models/NKProperties.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public enum NKProperties: String, CaseIterable {
6565
/// open-cloud-mesh.org
6666
case sharepermissionscloudmesh = "<share-permissions xmlns=\"http://open-cloud-mesh.org/ns\"/>"
6767

68-
static func properties(createProperties: [NKProperties]?, removeProperties: [NKProperties] = []) -> String {
68+
static public func properties(createProperties: [NKProperties]?, removeProperties: [NKProperties] = []) -> String {
6969
var properties = allCases.map { $0.rawValue }.joined()
7070
if let createProperties {
7171
properties = ""

Sources/NextcloudKit/NextcloudKit+WebDAV.swift

Lines changed: 16 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -725,119 +725,7 @@ public extension NextcloudKit {
725725
}
726726
}
727727

728-
/// Searches media files within a specified date range on the server.
729-
///
730-
/// - Parameters:
731-
/// - path: The directory path to search within (default is empty string for root).
732-
/// - lessDate: The upper bound date filter (files older than this).
733-
/// - greaterDate: The lower bound date filter (files newer than this).
734-
/// - elementDate: The file date attribute to filter on (e.g., "created", "modified").
735-
/// - limit: Maximum number of files to return.
736-
/// - account: The Nextcloud account identifier.
737-
/// - options: Optional request options (headers, queue, etc.).
738-
/// - taskHandler: Callback for monitoring the underlying `URLSessionTask`.
739-
/// - completion: Completion handler returning:
740-
/// - account: The account used for the request.
741-
/// - files: Optional array of matching `NKFile` objects.
742-
/// - responseData: Raw Alamofire response data.
743-
/// - error: An `NKError` describing success or failure.
744-
func searchMedia(path: String = "",
745-
lessDate: Any,
746-
greaterDate: Any,
747-
elementDate: String,
748-
limit: Int,
749-
account: String,
750-
options: NKRequestOptions = NKRequestOptions(),
751-
taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in },
752-
completion: @escaping (_ account: String, _ files: [NKFile]?, _ responseData: AFDataResponse<Data>?, _ error: NKError) -> Void) {
753-
guard let nkSession = nkCommonInstance.nksessions.session(forAccount: account) else {
754-
return options.queue.async { completion(account, nil, nil, .urlError) }
755-
}
756-
let files: [NKFile] = []
757-
let elementDate = elementDate + "/"
758-
var greaterDateString: String?, lessDateString: String?
759-
let href = "/files/" + nkSession.userId + path
760-
if let lessDate = lessDate as? Date {
761-
lessDateString = lessDate.formatted(using: "yyyy-MM-dd'T'HH:mm:ssZZZZZ")
762-
} else if let lessDate = lessDate as? Int {
763-
lessDateString = String(lessDate)
764-
}
765-
if let greaterDate = greaterDate as? Date {
766-
greaterDateString = greaterDate.formatted(using: "yyyy-MM-dd'T'HH:mm:ssZZZZZ")
767-
} else if let greaterDate = greaterDate as? Int {
768-
greaterDateString = String(greaterDate)
769-
}
770-
guard let lessDateString, let greaterDateString else {
771-
return options.queue.async { completion(account, files, nil, .invalidDate) }
772-
}
773-
774-
let httpBodyString = String(format: NKDataFileXML(nkCommonInstance: self.nkCommonInstance).getRequestBodySearchMedia(createProperties: options.createProperties, removeProperties: options.removeProperties), href, elementDate, elementDate, lessDateString, elementDate, greaterDateString, String(limit))
775-
776-
guard let httpBody = httpBodyString.data(using: .utf8) else {
777-
return options.queue.async {
778-
completion(account, files, nil, .invalidData)
779-
}
780-
}
781-
782-
783-
search(serverUrl: nkSession.urlBase, httpBody: httpBody, showHiddenFiles: false, includeHiddenFiles: [], account: account, options: options) { task in
784-
taskHandler(task)
785-
} completion: { account, files, responseData, error in
786-
options.queue.async { completion(account, files, responseData, error) }
787-
}
788-
}
789-
790-
/// Asynchronously searches media files with date filters.
791-
///
792-
/// - Parameters:
793-
/// - path: Directory path to search.
794-
/// - lessDate: Upper date bound filter.
795-
/// - greaterDate: Lower date bound filter.
796-
/// - elementDate: File date attribute to filter on.
797-
/// - limit: Maximum number of results.
798-
/// - account: Nextcloud account identifier.
799-
/// - options: Optional request options.
800-
/// - taskHandler: Callback for URLSessionTask monitoring.
801-
///
802-
/// - Returns: A tuple containing:
803-
/// - account: Account used for the request.
804-
/// - files: Optional array of `NKFile` matching results.
805-
/// - responseData: Raw server response data.
806-
/// - error: Resulting `NKError`.
807-
func searchMediaAsync(path: String = "",
808-
lessDate: Any,
809-
greaterDate: Any,
810-
elementDate: String,
811-
limit: Int,
812-
account: String,
813-
options: NKRequestOptions = NKRequestOptions(),
814-
taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }
815-
) async -> (
816-
account: String,
817-
files: [NKFile]?,
818-
responseData: AFDataResponse<Data>?,
819-
error: NKError
820-
) {
821-
await withCheckedContinuation { continuation in
822-
searchMedia(path: path,
823-
lessDate: lessDate,
824-
greaterDate: greaterDate,
825-
elementDate: elementDate,
826-
limit: limit,
827-
account: account,
828-
options: options,
829-
taskHandler: taskHandler) { account, files, responseData, error in
830-
continuation.resume(returning: (
831-
account: account,
832-
files: files,
833-
responseData: responseData,
834-
error: error
835-
))
836-
}
837-
}
838-
}
839-
840-
/// Performs a private search request with a custom HTTP body on the server.
728+
/// Performs a search request with a custom HTTP body on the server.
841729
///
842730
/// - Parameters:
843731
/// - serverUrl: The base URL of the Nextcloud server.
@@ -852,14 +740,14 @@ public extension NextcloudKit {
852740
/// - files: Optional array of `NKFile` matching the search.
853741
/// - responseData: Raw response data from Alamofire.
854742
/// - error: An `NKError` indicating success or failure.
855-
private func search(serverUrl: String,
856-
httpBody: Data,
857-
showHiddenFiles: Bool,
858-
includeHiddenFiles: [String],
859-
account: String,
860-
options: NKRequestOptions = NKRequestOptions(),
861-
taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in },
862-
completion: @escaping (_ account: String, _ files: [NKFile]?, _ responseData: AFDataResponse<Data>?, _ error: NKError) -> Void) {
743+
func search(serverUrl: String,
744+
httpBody: Data,
745+
showHiddenFiles: Bool,
746+
includeHiddenFiles: [String],
747+
account: String,
748+
options: NKRequestOptions = NKRequestOptions(),
749+
taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in },
750+
completion: @escaping (_ account: String, _ files: [NKFile]?, _ responseData: AFDataResponse<Data>?, _ error: NKError) -> Void) {
863751
guard let nkSession = nkCommonInstance.nksessions.session(forAccount: account),
864752
let headers = nkCommonInstance.getStandardHeaders(account: account, options: options, contentType: "application/xml", accept: "application/xml") else {
865753
return options.queue.async { completion(account, nil, nil, .urlError) }
@@ -914,13 +802,13 @@ public extension NextcloudKit {
914802
/// - files: Optional array of `NKFile` results.
915803
/// - responseData: Raw response data.
916804
/// - error: Resulting `NKError`.
917-
private func searchAsync(serverUrl: String,
918-
httpBody: Data,
919-
showHiddenFiles: Bool,
920-
includeHiddenFiles: [String],
921-
account: String,
922-
options: NKRequestOptions = NKRequestOptions(),
923-
taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }
805+
func searchAsync(serverUrl: String,
806+
httpBody: Data,
807+
showHiddenFiles: Bool,
808+
includeHiddenFiles: [String],
809+
account: String,
810+
options: NKRequestOptions = NKRequestOptions(),
811+
taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }
924812
) async -> (
925813
account: String,
926814
files: [NKFile]?,

0 commit comments

Comments
 (0)