From 12e0e3cdfd37c38146761931c90bedd5367867e0 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Tue, 11 Jan 2022 11:54:57 -0500 Subject: [PATCH] Sync item read state to server --- Fervor/FervorClient.swift | 12 ++++++++++++ Reader/FervorController.swift | 12 ++++++++++++ Reader/SceneDelegate.swift | 4 ++++ 3 files changed, 28 insertions(+) diff --git a/Fervor/FervorClient.swift b/Fervor/FervorClient.swift index c88b2e0..a8c42bd 100644 --- a/Fervor/FervorClient.swift +++ b/Fervor/FervorClient.swift @@ -119,6 +119,18 @@ public class FervorClient { } } + public func read(item id: FervorID) async throws -> Item { + var request = URLRequest(url: buildURL(path: "/api/v1/items/\(id)/read")) + request.httpMethod = "POST" + return try await performRequest(request) + } + + public func unread(item id: FervorID) async throws -> Item { + var request = URLRequest(url: buildURL(path: "/api/v1/items/\(id)/unread")) + request.httpMethod = "POST" + return try await performRequest(request) + } + public struct Auth { public let accessToken: String public let refreshToken: String? diff --git a/Reader/FervorController.swift b/Reader/FervorController.swift index 5888363..af96d66 100644 --- a/Reader/FervorController.swift +++ b/Reader/FervorController.swift @@ -66,4 +66,16 @@ class FervorController { try! await persistentContainer.updateLastSyncDate(update.syncTimestamp) } + @MainActor + func syncReadToServer() async throws { + var count = 0 + for case let item as Item in self.persistentContainer.viewContext.updatedObjects { + count += 1 + let f = item.read ? client.read(item:) : client.unread(item:) + let _ = try await f(item.id!) + } + logger.info("Synced \(count, privacy: .public) read/unread to server") + try self.persistentContainer.viewContext.save() + } + } diff --git a/Reader/SceneDelegate.swift b/Reader/SceneDelegate.swift index 8a6d040..4eb8823 100644 --- a/Reader/SceneDelegate.swift +++ b/Reader/SceneDelegate.swift @@ -49,6 +49,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func sceneWillResignActive(_ scene: UIScene) { // Called when the scene will move from an active state to an inactive state. // This may occur due to temporary interruptions (ex. an incoming phone call). + + Task(priority: .userInitiated) { + try await self.fervorController.syncReadToServer() + } } func sceneWillEnterForeground(_ scene: UIScene) {