// // SyncController.swift // MastoSearchCore // // Created by Shadowfacts on 7/3/22. // import Foundation import Combine import OSLog public class SyncController { private init() {} public static let shared = SyncController() public let onSync = PassthroughSubject() private let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "Sync") private var syncTotal = 0 public func syncStatuses(errorHandler: @escaping (APIController.Error) -> Void) { DatabaseController.shared.getNewestStatus { status in guard let status else { return } self.logger.log("Starting sync...") self.syncTotal = 0 self.syncStatuses(range: .after(status.id), errorHandler: errorHandler) } } private func syncStatuses(range: APIController.RequestRange, errorHandler: @escaping (APIController.Error) -> Void) { APIController.shared.getStatuses(range: range) { response in switch response { case .failure(let error): self.logger.error("Erorr syncing statuses: \(String(describing: error), privacy: .public)") DispatchQueue.main.async { errorHandler(error) } case .success(let statuses): guard statuses.count > 0 else { DispatchQueue.main.async { self.logger.log("Finished sync of \(self.syncTotal, privacy: .public) statuses") self.onSync.send() } return } DatabaseController.shared.addStatuses(statuses.compactMap { if $0.hasReblog { return nil } else { return Status(id: $0.id, url: $0.url, summary: $0.spoiler_text, content: $0.content, published: $0.created_at) } }) DispatchQueue.main.async { self.onSync.send() } self.syncTotal += statuses.count self.syncStatuses(range: .after(statuses.first!.id), errorHandler: errorHandler) } } } }