forked from shadowfacts/Tusker
If the app hasn't launched in long enough, we may be displaying old statuses as a result of state restoration. If the user leaves the app, those statuses can't get pruned, because the user may return. We need to make sure the lastFetchedAt date is current, since awakeFromFetch won't be called until the object is faulted in (which wasn't happening immediately during state restoration).
110 lines
3.7 KiB
Swift
110 lines
3.7 KiB
Swift
//
|
|
// AccountMO.swift
|
|
// Tusker
|
|
//
|
|
// Created by Shadowfacts on 4/11/20.
|
|
// Copyright © 2020 Shadowfacts. All rights reserved.
|
|
//
|
|
//
|
|
|
|
import Foundation
|
|
import CoreData
|
|
import Pachyderm
|
|
|
|
@objc(AccountMO)
|
|
public final class AccountMO: NSManagedObject, AccountProtocol {
|
|
|
|
@nonobjc public class func fetchRequest() -> NSFetchRequest<AccountMO> {
|
|
return NSFetchRequest<AccountMO>(entityName: "Account")
|
|
}
|
|
|
|
@nonobjc public class func fetchRequest(url: URL) -> NSFetchRequest<AccountMO> {
|
|
let req = NSFetchRequest<AccountMO>(entityName: "Account")
|
|
req.predicate = NSPredicate(format: "url = %@", url as NSURL)
|
|
return req
|
|
}
|
|
|
|
@NSManaged public var acct: String
|
|
/// Whether this AccountMO is the active (logged-in) account.
|
|
@NSManaged public var active: Bool
|
|
@NSManaged public var avatar: URL?
|
|
@NSManaged public var botCD: Bool
|
|
@NSManaged public var createdAt: Date
|
|
@NSManaged public var displayName: String
|
|
@NSManaged private var emojisData: Data?
|
|
@NSManaged private var fieldsData: Data?
|
|
@NSManaged public var followersCount: Int
|
|
@NSManaged public var followingCount: Int
|
|
@NSManaged public var header: URL?
|
|
@NSManaged public var id: String
|
|
@NSManaged public var locked: Bool
|
|
@NSManaged public var movedCD: Bool
|
|
@NSManaged public var note: String
|
|
@NSManaged public var statusesCount: Int
|
|
@NSManaged public var url: URL
|
|
@NSManaged public var username: String
|
|
@NSManaged public var lastFetchedAt: Date?
|
|
@NSManaged public var movedTo: AccountMO?
|
|
|
|
@LazilyDecoding(arrayFrom: \AccountMO.emojisData)
|
|
public var emojis: [Emoji]
|
|
|
|
@LazilyDecoding(arrayFrom: \AccountMO.fieldsData)
|
|
public var fields: [Pachyderm.Account.Field]
|
|
|
|
public var bot: Bool? { botCD }
|
|
public var moved: Bool? { movedCD }
|
|
|
|
public override func awakeFromFetch() {
|
|
super.awakeFromFetch()
|
|
|
|
managedObjectContext?.perform {
|
|
self.touch()
|
|
}
|
|
}
|
|
|
|
/// Update the `lastFetchedAt` date so this object isn't pruned early.
|
|
func touch() {
|
|
lastFetchedAt = Date()
|
|
}
|
|
|
|
}
|
|
|
|
extension AccountMO {
|
|
convenience init(apiAccount account: Pachyderm.Account, container: MastodonCachePersistentStore, context: NSManagedObjectContext) {
|
|
self.init(context: context)
|
|
self.updateFrom(apiAccount: account, container: container)
|
|
self.lastFetchedAt = Date()
|
|
}
|
|
|
|
func updateFrom(apiAccount account: Pachyderm.Account, container: MastodonCachePersistentStore) {
|
|
guard let context = managedObjectContext else {
|
|
// we've been deleted, don't bother updating
|
|
return
|
|
}
|
|
|
|
self.acct = account.acct
|
|
self.avatar = account.avatarStatic // we don't animate avatars
|
|
self.botCD = account.bot ?? false
|
|
self.createdAt = account.createdAt
|
|
self.displayName = account.displayName
|
|
self.emojis = account.emojis
|
|
self.fields = account.fields
|
|
self.followersCount = account.followersCount
|
|
self.followingCount = account.followingCount
|
|
self.header = account.headerStatic // we don't animate headers
|
|
self.id = account.id
|
|
self.locked = account.locked
|
|
self.movedCD = account.moved ?? false
|
|
self.note = account.note
|
|
self.statusesCount = account.statusesCount
|
|
self.url = account.url
|
|
self.username = account.username
|
|
if let movedTo = account.movedTo {
|
|
self.movedTo = container.account(for: movedTo.id, in: context) ?? AccountMO(apiAccount: movedTo, container: container, context: context)
|
|
} else {
|
|
self.movedTo = nil
|
|
}
|
|
}
|
|
}
|