forked from zelo72/mastodon-ios
77 lines
2.1 KiB
Swift
77 lines
2.1 KiB
Swift
![]() |
//
|
||
|
// APIService+CoreData+Instance.swift
|
||
|
// Mastodon
|
||
|
//
|
||
|
// Created by Cirno MainasuK on 2021-10-9.
|
||
|
//
|
||
|
|
||
|
import os.log
|
||
|
import Foundation
|
||
|
import CoreData
|
||
|
import CoreDataStack
|
||
|
import MastodonSDK
|
||
|
|
||
|
extension APIService.CoreData {
|
||
|
|
||
|
static func createOrMergeInstance(
|
||
|
into managedObjectContext: NSManagedObjectContext,
|
||
|
domain: String,
|
||
|
entity: Mastodon.Entity.Instance,
|
||
|
networkDate: Date,
|
||
|
log: OSLog
|
||
|
) -> (instance: Instance, isCreated: Bool) {
|
||
|
// fetch old mastodon user
|
||
|
let old: Instance? = {
|
||
|
let request = Instance.sortedFetchRequest
|
||
|
request.predicate = Instance.predicate(domain: domain)
|
||
|
request.fetchLimit = 1
|
||
|
request.returnsObjectsAsFaults = false
|
||
|
do {
|
||
|
return try managedObjectContext.fetch(request).first
|
||
|
} catch {
|
||
|
assertionFailure(error.localizedDescription)
|
||
|
return nil
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
if let old = old {
|
||
|
// merge old
|
||
|
APIService.CoreData.merge(
|
||
|
instance: old,
|
||
|
entity: entity,
|
||
|
domain: domain,
|
||
|
networkDate: networkDate
|
||
|
)
|
||
|
return (old, false)
|
||
|
} else {
|
||
|
let instance = Instance.insert(
|
||
|
into: managedObjectContext,
|
||
|
property: Instance.Property(domain: domain)
|
||
|
)
|
||
|
let configurationRaw = entity.configuration.flatMap { Instance.encode(configuration: $0) }
|
||
|
instance.update(configurationRaw: configurationRaw)
|
||
|
|
||
|
return (instance, true)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
extension APIService.CoreData {
|
||
|
|
||
|
static func merge(
|
||
|
instance: Instance,
|
||
|
entity: Mastodon.Entity.Instance,
|
||
|
domain: String,
|
||
|
networkDate: Date
|
||
|
) {
|
||
|
guard networkDate > instance.updatedAt else { return }
|
||
|
|
||
|
let configurationRaw = entity.configuration.flatMap { Instance.encode(configuration: $0) }
|
||
|
instance.update(configurationRaw: configurationRaw)
|
||
|
|
||
|
instance.didUpdate(at: networkDate)
|
||
|
}
|
||
|
|
||
|
}
|