11 lines
3.7 KiB
JSON
Raw Normal View History

2024-12-23 19:29:05 +00:00
{
"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](https://github.com/nicklockwood/SwiftNotificationCenter): Provides broadcast-style notifications for Swift.\n- [UserNotifications framework by Apple](https://developer.apple.com/documentation/usernotifications): 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
}