diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift index c0e9e186e..c5b53b58e 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift @@ -4,6 +4,7 @@ import Models import SwiftGraphQL public struct UploadFileRequestPayload { + public let pageId: String public let uploadID: String? public let uploadFileID: String? public let urlString: String? @@ -29,6 +30,7 @@ public extension DataService { uploadFileRequestSuccess: .init { .success( payload: UploadFileRequestPayload( + pageId: (try $0.createdPageId()) ?? id, uploadID: try $0.id(), uploadFileID: try $0.uploadFileId(), urlString: try $0.uploadSignedUrl() diff --git a/apple/OmnivoreKit/Sources/Services/DataService/OfflineSync.swift b/apple/OmnivoreKit/Sources/Services/DataService/OfflineSync.swift index c5c5e2777..73dce5a04 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/OfflineSync.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/OfflineSync.swift @@ -54,18 +54,14 @@ public extension DataService { try await updateLinkedItemStatus(id: id, newId: nil, status: .isSyncing) let uploadRequest = try await uploadFileRequest(id: id, url: url) + print("UPLOAD REQUEST, ORIGINAL ID, NEW ID", id, uploadRequest.pageId) if let urlString = uploadRequest.urlString, let uploadUrl = URL(string: urlString) { - let attr = try? FileManager.default.attributesOfItem(atPath: localPdfURL.path) - if let attr = attr { - print("ATTR", attr[.size]) - } - - try await uploadFile(id: id, localPdfURL: localPdfURL, url: uploadUrl) + try await uploadFile(id: uploadRequest.pageId, localPdfURL: localPdfURL, url: uploadUrl) } else { throw SaveArticleError.badData } - try await updateLinkedItemStatus(id: id, newId: nil, status: .isNSync) + try await updateLinkedItemStatus(id: id, newId: uploadRequest.pageId, status: .isNSync) try backgroundContext.performAndWait { try backgroundContext.save() } diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift b/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift index 8c3b98c57..843239a1f 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift @@ -195,6 +195,8 @@ public extension DataService { } internal func persistArticleContent(item: InternalLinkedItem, htmlContent: String, highlights: [InternalHighlight]) async throws { + var needsPDFDownload = false + try await backgroundContext.perform { [weak self] in guard let self = self else { return } let fetchRequest: NSFetchRequest = LinkedItem.fetchRequest() @@ -226,19 +228,53 @@ public extension DataService { linkedItem.isArchived = item.isArchived linkedItem.contentReader = item.contentReader linkedItem.serverSyncStatus = Int64(ServerSyncStatus.isNSync.rawValue) + + if item.isPDF { + needsPDFDownload = true + + // Check if we already have the PDF item locally. Either in temporary + // space, or in the documents directory + if let localPDF = existingItem?.localPDF { + if PDFUtils.exists(filename: localPDF) { + linkedItem.localPDF = localPDF + needsPDFDownload = false + } + } + + if let tempPDFURL = existingItem?.tempPDFURL { + linkedItem.localPDF = try? PDFUtils.moveToLocal(url: tempPDFURL) + PDFUtils.exists(filename: linkedItem.localPDF) + if linkedItem.localPDF != nil { + needsPDFDownload = false + } + } + } } if item.isPDF { - try await fetchPDFData(slug: item.slug, pageURLString: item.pageURLString) + if needsPDFDownload { + print("PDF does not exist, downloading", item.id, item.title) + try await backgroundContext.perform { + let fetchRequest: NSFetchRequest = LinkedItem.fetchRequest() + fetchRequest.predicate = NSPredicate(format: "id == %@", item.id) + + let existingItem = try? self.backgroundContext.fetch(fetchRequest).first + print("EXISTING ITEM", existingItem) + } + + try await fetchPDFData(slug: item.slug, pageURLString: item.pageURLString) + } else { + print("PDF already exists, not downloading", item.id) + } } try await backgroundContext.perform { [weak self] in do { try self?.backgroundContext.save() - logger.debug("ArticleContent saved succesfully") + // logger.debug("ArticleContent saved succesfully") } catch { self?.backgroundContext.rollback() - logger.debug("Failed to save ArticleContent") + // logger.debug("Failed to save ArticleContent") throw error } } @@ -275,6 +311,7 @@ public extension DataService { try data.write(to: tempPath) let localPDF = try PDFUtils.moveToLocal(url: tempPath) localPdfURL = PDFUtils.localPdfURL(filename: localPDF) + linkedItem.tempPDFURL = nil linkedItem.localPDF = localPDF try self?.backgroundContext.save() } catch { diff --git a/apple/OmnivoreKit/Sources/Utils/PDFUtils.swift b/apple/OmnivoreKit/Sources/Utils/PDFUtils.swift index d7c89cd68..1919377fc 100644 --- a/apple/OmnivoreKit/Sources/Utils/PDFUtils.swift +++ b/apple/OmnivoreKit/Sources/Utils/PDFUtils.swift @@ -35,12 +35,14 @@ public enum PDFUtils { let url = FileManager.default .urls(for: .documentDirectory, in: .userDomainMask)[0] .appendingPathComponent(filename) + return url } public static func exists(filename: String?) -> Bool { if let filename = filename, let localPdfURL = localPdfURL(filename: filename) { - return FileManager.default.fileExists(atPath: localPdfURL.absoluteString) + let result = FileManager.default.fileExists(atPath: localPdfURL.path) + return result } return false }