import Foundation /// Contains a list of all notifications for the logged in user and the numbers of unread notifications. public struct NotificationFeed: Hashable, Sendable { public enum Category: String, CaseIterable, Sendable { case all = "" case upvotes = "upvotes" case mentions = "mentions" case comments = "comments" case subscriptions = "subs" } /// The time when the notifications were last checked. public let lastChecked: Date /// The list of all notifications for the logged in user. public let notifications: [Notification] /// The numbers of unread notifications. public let unreadNumbers: UnreadNumbers /// Infos about the user name and avatar for each user id. public let userInfos: [UserInfo] public init(lastChecked: Date, notifications: [Notification], unreadNumbers: NotificationFeed.UnreadNumbers, userInfos: [UserInfo]) { self.lastChecked = lastChecked self.notifications = notifications self.unreadNumbers = unreadNumbers self.userInfos = userInfos } } extension NotificationFeed { struct CodingData: Decodable { struct Container: Decodable { let data: NotificationFeed.CodingData } let check_time: Int let items: [Notification.CodingData] let unread: UnreadNumbers.CodingData let username_map: [String: NotificationFeed.UserInfo.UsernameMapEntryCodingData] } } extension NotificationFeed.CodingData { var decoded: NotificationFeed { .init( lastChecked: Date(timeIntervalSince1970: TimeInterval(check_time)), notifications: items.map(\.decoded), unreadNumbers: unread.decoded, userInfos: username_map.map { (key, value) in .init(avatar: value.avatar.decoded, username: value.name, userId: Int(key) ?? 0) } ) } }