import Foundation /// A notification about activities in a rant or a comment. public struct Notification: Hashable, Identifiable, Sendable { public enum Kind: String, Sendable { /// An upvote for a rant. case rantUpvote = "content_vote" /// An upvote for a comment. case commentUpvote = "comment_vote" /// A new comment in one of the logged in user's rants. case newCommentInOwnRant = "comment_content" /// A new comment in a rant that the logged in user has commented in. case newComment = "comment_discuss" /// A mention of the logged in user in a comment. case mentionInComment = "comment_mention" /// A new rant posted by someone that the logged in user is subscribed to. case newRantOfSubscribedUser = "rant_sub" } /// The id of the rant associated with this notification. public let rantId: Int /// The id of the comment associated with this notification, if this notification is for a comment. public let commentId: Int? /// The time when this notification was created. public let created: Date /// True if the user has already read this notification. public let read: Bool /// The type of this notification. public let kind: Kind /// The id of the user who triggered the notification. public let userId: Int public var id: String { [ String(rantId), commentId.flatMap{ String($0) } ?? "-", String(Int(created.timeIntervalSince1970)), String(read), kind.rawValue, String(userId) ].joined(separator: "|") } public init(rantId: Int, commentId: Int?, created: Date, read: Bool, kind: Notification.Kind, userId: Int) { self.rantId = rantId self.commentId = commentId self.created = created self.read = read self.kind = kind self.userId = userId } } extension Notification { struct CodingData: Codable { let rant_id: Int let comment_id: Int? let created_time: Int let read: Int let type: String let uid: Int } } extension Notification.CodingData { var decoded: Notification { .init( rantId: rant_id, commentId: comment_id, created: Date(timeIntervalSince1970: TimeInterval(created_time)), read: read != 0, kind: .init(rawValue: type) ?? .newComment, userId: uid ) } }