59 lines
1.7 KiB
Swift
59 lines
1.7 KiB
Swift
//
|
|
// FetchStatusService.swift
|
|
// Tusker
|
|
//
|
|
// Created by Shadowfacts on 1/17/23.
|
|
// Copyright © 2023 Shadowfacts. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import Pachyderm
|
|
|
|
@MainActor
|
|
class FetchStatusService {
|
|
let statusID: String
|
|
let mastodonController: MastodonController
|
|
|
|
init(statusID: String, mastodonController: MastodonController) {
|
|
self.statusID = statusID
|
|
self.mastodonController = mastodonController
|
|
}
|
|
|
|
func run() async -> Result {
|
|
let response = await mastodonController.runResponse(Client.getStatus(id: statusID))
|
|
switch response {
|
|
case .success(let status, _):
|
|
return .loaded(status)
|
|
case .failure(let error):
|
|
switch error.type {
|
|
case .unexpectedStatus(404), .mastodonError(404, _):
|
|
self.handleStatusNotFound()
|
|
return .notFound
|
|
default:
|
|
return .error(error)
|
|
}
|
|
}
|
|
}
|
|
|
|
private func handleStatusNotFound() {
|
|
var reblogIDs = [String]()
|
|
if let cached = mastodonController.persistentContainer.status(for: statusID) {
|
|
let reblogsReq = StatusMO.fetchRequest()
|
|
reblogsReq.predicate = NSPredicate(format: "reblog = %@", cached)
|
|
if let reblogs = try? mastodonController.persistentContainer.viewContext.fetch(reblogsReq) {
|
|
reblogIDs = reblogs.map(\.id)
|
|
}
|
|
}
|
|
|
|
NotificationCenter.default.post(name: .statusDeleted, object: mastodonController, userInfo: [
|
|
"statusIDs": [statusID] + reblogIDs
|
|
])
|
|
}
|
|
|
|
enum Result {
|
|
case loaded(Status)
|
|
case notFound
|
|
case error(Client.Error)
|
|
}
|
|
}
|