|
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
|
|
)
|
|
}
|
|
}
|