metatext-app-ios-iphone-ipad/DB/Sources/DB/Content/StatusInfo.swift

66 lines
2.9 KiB
Swift
Raw Normal View History

2020-09-03 05:28:34 +02:00
// Copyright © 2020 Metabolist. All rights reserved.
import Foundation
import GRDB
2021-02-08 02:46:51 +01:00
import Mastodon
2020-09-03 05:28:34 +02:00
2020-09-30 01:56:09 +02:00
struct StatusInfo: Codable, Hashable, FetchableRecord {
2020-09-30 02:42:12 +02:00
let record: StatusRecord
let accountInfo: AccountInfo
2021-02-08 02:46:51 +01:00
let relationship: Relationship?
2020-09-30 02:42:12 +02:00
let reblogAccountInfo: AccountInfo?
let reblogRecord: StatusRecord?
2021-02-08 02:46:51 +01:00
let reblogRelationship: Relationship?
2020-10-14 02:03:01 +02:00
let showContentToggle: StatusShowContentToggle?
let reblogShowContentToggle: StatusShowContentToggle?
let showAttachmentsToggle: StatusShowAttachmentsToggle?
let reblogShowAttachmentsToggle: StatusShowAttachmentsToggle?
2020-09-03 05:28:34 +02:00
}
2020-09-30 01:56:09 +02:00
extension StatusInfo {
2020-09-30 02:42:12 +02:00
static func addingIncludes<T: DerivableRequest>(_ request: T) -> T where T.RowDecoder == StatusRecord {
2020-10-30 08:11:24 +01:00
addingOptionalIncludes(
request
.including(required: AccountInfo.addingIncludes(StatusRecord.account).forKey(CodingKeys.accountInfo)))
}
// Hack, remove once GRDB supports chaining a required association behind an optional association
static func addingIncludesForNotificationInfo<T: DerivableRequest>(
_ request: T) -> T where T.RowDecoder == StatusRecord {
addingOptionalIncludes(
request
.including(optional: AccountInfo.addingIncludes(StatusRecord.account).forKey(CodingKeys.accountInfo)))
}
2020-09-30 02:42:12 +02:00
static func request(_ request: QueryInterfaceRequest<StatusRecord>) -> QueryInterfaceRequest<Self> {
addingIncludes(request).asRequest(of: self)
}
var filterableContent: String {
(record.filterableContent + (reblogRecord?.filterableContent ?? [])).joined(separator: " ")
}
2020-10-07 23:06:26 +02:00
2020-10-14 02:03:01 +02:00
var showContentToggled: Bool {
showContentToggle != nil || reblogShowContentToggle != nil
}
var showAttachmentsToggled: Bool {
showAttachmentsToggle != nil || reblogShowAttachmentsToggle != nil
2020-10-07 23:06:26 +02:00
}
}
2020-10-30 08:11:24 +01:00
private extension StatusInfo {
static func addingOptionalIncludes<T: DerivableRequest>(_ request: T) -> T where T.RowDecoder == StatusRecord {
request.including(optional: AccountInfo.addingIncludes(StatusRecord.reblogAccount)
.forKey(CodingKeys.reblogAccountInfo))
2021-02-08 02:46:51 +01:00
.including(optional: StatusRecord.relationship.forKey(CodingKeys.relationship))
2020-10-30 08:11:24 +01:00
.including(optional: StatusRecord.reblog.forKey(CodingKeys.reblogRecord))
2021-02-08 02:46:51 +01:00
.including(optional: StatusRecord.reblogRelationship.forKey(CodingKeys.reblogRelationship))
2020-10-30 08:11:24 +01:00
.including(optional: StatusRecord.showContentToggle.forKey(CodingKeys.showContentToggle))
.including(optional: StatusRecord.reblogShowContentToggle.forKey(CodingKeys.reblogShowContentToggle))
.including(optional: StatusRecord.showAttachmentsToggle.forKey(CodingKeys.showAttachmentsToggle))
.including(optional: StatusRecord.reblogShowAttachmentsToggle
.forKey(CodingKeys.reblogShowAttachmentsToggle))
}
}