From 77f9a8e2c8662f841d5e4349a67bc58075675ed5 Mon Sep 17 00:00:00 2001 From: patricioxavier8 <116120453+patricioxavier8@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:01:32 -0500 Subject: [PATCH 1/3] feat: add endpoints and models for cursor-based file and folder sync - Add SyncedFile, SyncedFolder, GetFilesSyncResponse, and GetFoldersSyncResponse models. - Support database entity fields (id, parentId, folderId, plainName, status, etc.). - Add getFilesSync and getFoldersSync methods to DriveAPI using cursor-based pagination. - Remove dependency on offset and bucket filtering for change enumeration. --- .../Services/HttpAPI/DriveAPI.swift | 56 +++++++++++++++++++ .../InternxtSwiftCore/Types/DriveTypes.swift | 37 ++++++++++++ 2 files changed, 93 insertions(+) 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..895d163 100644 --- a/Sources/InternxtSwiftCore/Types/DriveTypes.swift +++ b/Sources/InternxtSwiftCore/Types/DriveTypes.swift @@ -566,6 +566,43 @@ public struct UpdatedFolder: Decodable { public typealias GetUpdatedFoldersResponse = [UpdatedFolder] +public struct SyncedFile: Decodable { + public let id: Int? + public let uuid: String + public let folderId: Int? + public let folderUuid: String? + public let name: String? + public let plainName: 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 uuid: String? + public let parentId: Int? + public let parentUuid: String? + public let name: String? + public let plainName: 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 From d136d71eb08d38d4216dc8e0e18dae62a49f6d44 Mon Sep 17 00:00:00 2001 From: patricioxavier8 <116120453+patricioxavier8@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:14:26 -0500 Subject: [PATCH 2/3] update drive types --- Sources/InternxtSwiftCore/Types/DriveTypes.swift | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Sources/InternxtSwiftCore/Types/DriveTypes.swift b/Sources/InternxtSwiftCore/Types/DriveTypes.swift index 895d163..6ec0443 100644 --- a/Sources/InternxtSwiftCore/Types/DriveTypes.swift +++ b/Sources/InternxtSwiftCore/Types/DriveTypes.swift @@ -567,11 +567,8 @@ public typealias GetUpdatedFoldersResponse = [UpdatedFolder] public struct SyncedFile: Decodable { - public let id: Int? public let uuid: String - public let folderId: Int? - public let folderUuid: String? - public let name: String? + public let folderId: Int public let plainName: String? public let type: String? public let size: String? @@ -586,12 +583,10 @@ public struct GetFilesSyncResponse: Decodable { } public struct SyncedFolder: Decodable { - public let id: Int? - public let uuid: String? + public let id: Int public let parentId: Int? - public let parentUuid: String? - public let name: String? public let plainName: String? + public let name: String? public let status: String public let updatedAt: String public let createdAt: String From 8cbe5c4e89fe4b394d2b463daa1e75fc21b1965e Mon Sep 17 00:00:00 2001 From: patricioxavier8 <116120453+patricioxavier8@users.noreply.github.com> Date: Fri, 18 Sep 2026 20:12:03 -0500 Subject: [PATCH 3/3] fix : add name type --- Sources/InternxtSwiftCore/Types/DriveTypes.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/InternxtSwiftCore/Types/DriveTypes.swift b/Sources/InternxtSwiftCore/Types/DriveTypes.swift index 6ec0443..80d3df3 100644 --- a/Sources/InternxtSwiftCore/Types/DriveTypes.swift +++ b/Sources/InternxtSwiftCore/Types/DriveTypes.swift @@ -570,6 +570,7 @@ 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