{ "extension": ".swift", "source": "import Foundation\n\n/// Contains a list of all notifications for the logged in user and the numbers of unread notifications.\npublic struct NotificationFeed: Hashable, Sendable {\n public enum Category: String, CaseIterable, Sendable {\n case all = ""\n case upvotes = "upvotes"\n case mentions = "mentions"\n case comments = "comments"\n case subscriptions = "subs"\n }\n \n /// The time when the notifications were last checked.\n public let lastChecked: Date\n \n /// The list of all notifications for the logged in user.\n public let notifications: [Notification]\n \n /// The numbers of unread notifications.\n public let unreadNumbers: UnreadNumbers\n \n /// Infos about the user name and avatar for each user id.\n public let userInfos: [UserInfo]\n \n public init(lastChecked: Date, notifications: [Notification], unreadNumbers: NotificationFeed.UnreadNumbers, userInfos: [UserInfo]) {\n self.lastChecked = lastChecked\n self.notifications = notifications\n self.unreadNumbers = unreadNumbers\n self.userInfos = userInfos\n }\n}\n\nextension NotificationFeed {\n struct CodingData: Decodable {\n struct Container: Decodable {\n let data: NotificationFeed.CodingData\n }\n \n let check_time: Int\n let items: [Notification.CodingData]\n let unread: UnreadNumbers.CodingData\n let username_map: [String: NotificationFeed.UserInfo.UsernameMapEntryCodingData]\n }\n}\n\nextension NotificationFeed.CodingData {\n var decoded: NotificationFeed {\n .init(\n lastChecked: Date(timeIntervalSince1970: TimeInterval(check_time)),\n notifications: items.map(\.decoded),\n unreadNumbers: unread.decoded,\n userInfos: username_map.map { (key, value) in\n .init(avatar: value.avatar.decoded, username: value.name, userId: Int(key) ?? 0)\n }\n )\n }\n}\n", "review": "## 7\n\n### Bugs\n- The userId conversion using Int(key) ?? 0 could default to a potentially unintended 0 if the conversion fails, which might mask underlying data issues.\n\n### Optimizations\n- Consider adding error handling or logging for Int(key) ?? 0 conversion to better manage unexpected data.\n- The Category enum values such as "subs" might benefit from more descriptive naming for clarity.\n- Instead of TimeInterval(check_time), use more descriptive conversion explanations or functions to improve code readability.\n \n### Good points\n- Usage of Swift's Hashable and Sendable protocols to ensure safety and future-proof the data structures.\n- Organized struct with clear separation between data handling and decoding, enhancing maintainability.\n- Proper utilization of Swift's raw strings in the enum declaration.\n \n### Summary\nThe code is well-structured and demonstrates good practices by leveraging Swift language features like Hashable and Sendable, ensuring a well-defined type-safe approach for handling user notifications. However, small improvements like error handling for the userId conversion and use of descriptive variable names can enhance robustness and readability.\n\n### Open source alternatives\n- SwiftNotificationCenter: Provides broadcast-style notifications for Swift.\n- UserNotifications framework by Apple: An alternative for handling notifications with official Apple support.", "filename": "NotificationFeed.swift", "path": "Sources/SwiftDevRant/Models/NotificationFeed.swift", "directory": "Models", "grade": 7, "size": 1960, "line_count": 58 }