MastoSearch/MastoSearchCore/Sources/MastoSearchCore/SyncController.swift

71 lines
2.3 KiB
Swift

//
// 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<Void, Never>()
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)
}
}
}
}