diff --git a/Sources/InternxtSwiftCore/Services/HttpAPI/DriveAPI.swift b/Sources/InternxtSwiftCore/Services/HttpAPI/DriveAPI.swift index c9c5108..ae8f28c 100644 --- a/Sources/InternxtSwiftCore/Services/HttpAPI/DriveAPI.swift +++ b/Sources/InternxtSwiftCore/Services/HttpAPI/DriveAPI.swift @@ -414,6 +414,62 @@ public struct DriveAPI { return try await apiClient.fetch(type: GetUpdatedFoldersResponse.self, endpoint, debugResponse: debug) } + + public func getFilesSync( + updatedAt: Date? = nil, + cursor: String? = nil, + limit: Int = 1000, + status: String? = nil, + debug: Bool = false + ) async throws -> GetFilesSyncResponse { + var queryParts: [String] = ["limit=\(limit)"] + + if let cursor = cursor { + let encoded = cursor.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? cursor + queryParts.append("cursor=\(encoded)") + } else if let updatedAt = updatedAt { + let formatter = ISO8601DateFormatter() + formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] + queryParts.append("updatedAt=\(formatter.string(from: updatedAt))") + } + + if let status = status { + queryParts.append("status=\(status)") + } + + let path = "\(self.baseUrl)/files/sync?\(queryParts.joined(separator: "&"))" + let endpoint = Endpoint(path: path, method: .GET) + return try await apiClient.fetch(type: GetFilesSyncResponse.self, endpoint, debugResponse: debug) + } + + + public func getFoldersSync( + updatedAt: Date? = nil, + cursor: String? = nil, + limit: Int = 1000, + status: String? = nil, + debug: Bool = false + ) async throws -> GetFoldersSyncResponse { + var queryParts: [String] = ["limit=\(limit)"] + + if let cursor = cursor { + let encoded = cursor.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? cursor + queryParts.append("cursor=\(encoded)") + } else if let updatedAt = updatedAt { + let formatter = ISO8601DateFormatter() + formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] + queryParts.append("updatedAt=\(formatter.string(from: updatedAt))") + } + + if let status = status { + queryParts.append("status=\(status)") + } + + let path = "\(self.baseUrl)/folders/sync?\(queryParts.joined(separator: "&"))" + let endpoint = Endpoint(path: path, method: .GET) + return try await apiClient.fetch(type: GetFoldersSyncResponse.self, endpoint, debugResponse: debug) + } + public func getFileInFolderByPlainName(folderId: Int, plainName: String, type: String, debug: Bool = false) async throws -> GetFileInFolderByPlainNameResponse { let endpoint = Endpoint( path: "\(self.baseUrl)/folders/\(folderId)/file?name=\(plainName)&type=\(type)", diff --git a/Sources/InternxtSwiftCore/Types/DriveTypes.swift b/Sources/InternxtSwiftCore/Types/DriveTypes.swift index c1e6d64..80d3df3 100644 --- a/Sources/InternxtSwiftCore/Types/DriveTypes.swift +++ b/Sources/InternxtSwiftCore/Types/DriveTypes.swift @@ -566,6 +566,39 @@ public struct UpdatedFolder: Decodable { public typealias GetUpdatedFoldersResponse = [UpdatedFolder] +public struct SyncedFile: Decodable { + public let uuid: String + public let folderId: Int + public let plainName: String? + public let name: String? + public let type: String? + public let size: String? + public let status: String + public let updatedAt: String + public let createdAt: String +} + +public struct GetFilesSyncResponse: Decodable { + public let files: [SyncedFile] + public let nextCursor: String? +} + +public struct SyncedFolder: Decodable { + public let id: Int + public let parentId: Int? + public let plainName: String? + public let name: String? + public let status: String + public let updatedAt: String + public let createdAt: String +} + +public struct GetFoldersSyncResponse: Decodable { + public let folders: [SyncedFolder] + public let nextCursor: String? +} + + public struct ReplaceFileIdPayload: Encodable { public let fileId: String? public let size: Int