Simplify the OfflineSync handler for LinkedItems

This commit is contained in:
Jackson Harper
2022-05-31 17:04:43 -07:00
parent 6f27b31cb4
commit ca49ce5106
4 changed files with 41 additions and 42 deletions

View File

@ -10,17 +10,17 @@ private struct UploadFileRequestPayload {
}
private extension DataService {
public func uploadFileRequest(item: LinkedItem) async throws -> URL {
public func uploadFileRequest(id: String, url: String) async throws -> URL {
enum MutationResult {
case success(payload: UploadFileRequestPayload)
case error(errorCode: Enums.UploadFileRequestErrorCode?)
}
let input = InputObjects.UploadFileRequestInput(
url: item.unwrappedPageURLString,
url: url,
contentType: "application/pdf",
createPageEntry: OptionalArgument(true),
clientRequestId: OptionalArgument(item.unwrappedID)
clientRequestId: OptionalArgument(id)
)
let selection = Selection<MutationResult, Unions.UploadFileRequestResult> {
@ -78,8 +78,8 @@ private extension DataService {
}
}
public func uploadFile(item: LinkedItem, url: URL) -> URLSessionTask? {
if let localPdfURL = item.localPdfURL, let localUrl = URL(string: localPdfURL) {
public func uploadFile(localPdfURL: String?, url: URL) -> URLSessionTask? {
if let localPdfURL = localPdfURL, let localUrl = URL(string: localPdfURL) {
var request = URLRequest(url: url)
request.httpMethod = "PUT"
request.setValue("application/pdf", forHTTPHeaderField: "content-type")

View File

@ -3,23 +3,23 @@ import Models
import SwiftGraphQL
public extension DataService {
func savePage(item: LinkedItem) async throws {
func savePage(id: String, url: String, title: String, originalHtml: String) async throws {
enum MutationResult {
case saved(requestId: String, url: String)
case error(errorCode: Enums.SaveErrorCode)
}
let input = InputObjects.SavePageInput(
url: item.unwrappedPageURLString,
url: url,
source: "ios-page",
clientRequestId: item.unwrappedID,
title: OptionalArgument(item.title),
originalContent: item.originalHtml!
clientRequestId: id,
title: OptionalArgument(title),
originalContent: originalHtml
)
let selection = Selection<MutationResult, Unions.SaveResult> {
try $0.on(
saveSuccess: .init { .saved(requestId: item.unwrappedID, url: (try? $0.url()) ?? "") },
saveSuccess: .init { .saved(requestId: id, url: (try? $0.url()) ?? "") },
saveError: .init {
.error(errorCode: (try? $0.errorCodes().first) ?? .unknown)
}

View File

@ -3,23 +3,21 @@ import Models
import SwiftGraphQL
public extension DataService {
func saveURL(item: LinkedItem) async throws {
func saveURL(id: String, url: String) async throws {
enum MutationResult {
case saved(requestId: String, url: String)
case error(errorCode: Enums.SaveErrorCode)
}
let input = InputObjects.SaveUrlInput(
url: item.unwrappedPageURLString,
url: url,
source: "ios-url",
clientRequestId: item.unwrappedID
clientRequestId: id
)
print("UPLOADING ITEM:", item.unwrappedID, item)
let requestId = item.unwrappedID
let selection = Selection<MutationResult, Unions.SaveResult> {
try $0.on(
saveSuccess: .init { .saved(requestId: requestId, url: (try? $0.url()) ?? "") },
saveSuccess: .init { .saved(requestId: id, url: (try? $0.url()) ?? "") },
saveError: .init { .error(errorCode: (try? $0.errorCodes().first) ?? .unknown) }
)
}

View File

@ -35,38 +35,40 @@ extension DataService {
}
}
public func syncLocalCreatedLinkedItem(item: LinkedItem) async -> Bool {
public func syncLocalCreatedLinkedItem(item: LinkedItem) {
switch item.contentReader {
case "PDF":
// SaveFile
do {
let uploadRequest = try await uploadFileRequest(item: item)
uploadFile(item: item, url: uploadRequest)
} catch {
logger.debug("Failed to upload PDF LinkedItem: \(error.localizedDescription)")
return false
let id = item.unwrappedID
let localPdfURL = item.localPdfURL
let url = item.unwrappedPageURLString
Task {
let uploadRequestUrl = try await uploadFileRequest(id: id, url: url)
await uploadFile(localPdfURL: localPdfURL, url: uploadRequestUrl)
try await backgroundContext.perform {
item.serverSyncStatus = Int64(ServerSyncStatus.isNSync.rawValue)
try self.backgroundContext.save()
}
}
case "WEB":
do {
if item.originalHtml != nil {
try await savePage(item: item)
let id = item.unwrappedID
let url = item.unwrappedPageURLString
let title = item.unwrappedTitle
let originalHtml = item.originalHtml
Task {
if let originalHtml = originalHtml {
try await savePage(id: id, url: url, title: title, originalHtml: originalHtml)
} else {
try await saveURL(item: item)
try await saveURL(id: id, url: url)
}
try await backgroundContext.perform {
item.serverSyncStatus = Int64(ServerSyncStatus.isNSync.rawValue)
try self.backgroundContext.save()
}
item.serverSyncStatus = Int64(ServerSyncStatus.isNSync.rawValue)
print("ITEMS SYNCED")
try backgroundContext.save()
return true
} catch {
print("Error saving", error)
backgroundContext.rollback()
logger.debug("Failed to sync LinkedItem: \(error.localizedDescription)")
return false
}
default:
return false
break
}
return false
}
private func syncLinkedItems(unsyncedLinkedItems: [LinkedItem]) {
@ -78,8 +80,7 @@ extension DataService {
// TODO: We will want to sync items that need creation in the background
// these items are forced to sync when saved, but should be re-tried in
// the background.
// syncLocalCreatedLinkedItem(item: item)
break
syncLocalCreatedLinkedItem(item: item)
case .isNSync, .isSyncing:
break
case .needsDeletion: