// // StatusMO.swift // Tusker // // Created by Shadowfacts on 4/11/20. // Copyright © 2020 Shadowfacts. All rights reserved. // // import Foundation import CoreData import Pachyderm @objc(StatusMO) public final class StatusMO: NSManagedObject { @nonobjc public class func fetchRequest() -> NSFetchRequest { return NSFetchRequest(entityName: "Status") } @NSManaged public var application: String? @NSManaged private var attachmentsData: Data? @NSManaged public var bookmarked: Bool @NSManaged public var content: String @NSManaged public var createdAt: Date @NSManaged public var emojisData: Data? @NSManaged public var favourited: Bool @NSManaged public var favouritesCount: Int @NSManaged public var hashtagsData: Data? @NSManaged public var id: String @NSManaged public var inReplyToAccountID: String? @NSManaged public var inReplyToID: String? @NSManaged private var mentionsData: Data? @NSManaged public var muted: Bool @NSManaged public var pinned: Bool @NSManaged public var reblogged: Bool @NSManaged public var reblogsCount: Int @NSManaged public var sensitive: Bool @NSManaged public var spoilerText: String @NSManaged public var uri: String // todo: are both uri and url necessary? @NSManaged public var url: URL? @NSManaged private var visibilityString: String @NSManaged public var account: AccountMO @NSManaged public var reblog: StatusMO? @LazilyDecoding(arrayFrom: \StatusMO.attachmentsData) var attachments: [Attachment] @LazilyDecoding(arrayFrom: \StatusMO.emojisData) var emojis: [Emoji] @LazilyDecoding(arrayFrom: \StatusMO.hashtagsData) var hashtags: [Hashtag] @LazilyDecoding(arrayFrom: \StatusMO.mentionsData) var mentions: [Mention] var visibility: Status.Visibility { get { Pachyderm.Status.Visibility(rawValue: visibilityString) ?? .public } set { visibilityString = newValue.rawValue } } } extension StatusMO { convenience init(apiStatus status: Pachyderm.Status, container: MastodonCachePersistentStore, context: NSManagedObjectContext) { self.init(context: context) self.updateFrom(apiStatus: status, container: container) } func updateFrom(apiStatus status: Pachyderm.Status, container: MastodonCachePersistentStore) { guard let context = managedObjectContext else { // we have been deleted, don't bother updating return } self.application = status.application?.name self.attachments = status.attachments self.bookmarked = status.bookmarked ?? false self.content = status.content self.createdAt = status.createdAt self.emojis = status.emojis self.favourited = status.favourited ?? false self.favouritesCount = status.favouritesCount self.hashtags = status.hashtags self.inReplyToAccountID = status.inReplyToAccountID self.inReplyToID = status.inReplyToID self.id = status.id self.mentions = status.mentions self.muted = status.muted ?? false self.pinned = status.pinned ?? false self.reblogged = status.reblogged ?? false self.reblogsCount = status.reblogsCount self.sensitive = status.sensitive self.spoilerText = status.spoilerText self.uri = status.uri self.visibility = status.visibility self.account = container.account(for: status.account.id, in: context) ?? AccountMO(apiAccount: status.account, container: container, context: context) if let reblog = status.reblog { self.reblog = container.status(for: reblog.id, in: context) ?? StatusMO(apiStatus: reblog, container: container, context: context) } else { self.reblog = nil } } }