@@ -43,27 +43,52 @@ public class ReaderCard: NSManagedObject {
4343 sites? . array as? [ ReaderSiteTopic ] ?? [ ]
4444 }
4545
46- public convenience init ? ( context: NSManagedObjectContext , from remoteCard: RemoteReaderCard ) {
46+ public static func createOrReuse ( context: NSManagedObjectContext , from remoteCard: RemoteReaderCard ) -> ReaderCard ? {
4747 guard remoteCard. type != . unknown else {
4848 return nil
4949 }
5050
51- self . init ( context: context)
52-
5351 switch remoteCard. type {
5452 case . post:
55- post = ReaderPost . createOrReplace ( fromRemotePost: remoteCard. post, for: nil , context: context)
53+ let post = ReaderPost . createOrReplace ( fromRemotePost: remoteCard. post, for: nil , context: context)
54+
55+ // Check if a card already exists with this post to prevent duplicates
56+ if let existingCard = findExistingCard ( with: post, context: context) {
57+ return existingCard
58+ }
59+
60+ let card = ReaderCard ( context: context)
61+ card. post = post
62+ return card
63+
5664 case . interests:
57- topics = NSOrderedSet ( array: remoteCard. interests? . prefix ( 5 ) . map {
65+ let card = ReaderCard ( context: context)
66+ card. topics = NSOrderedSet ( array: remoteCard. interests? . prefix ( 5 ) . map {
5867 ReaderTagTopic . createOrUpdateIfNeeded ( from: $0, context: context)
5968 } ?? [ ] )
69+ return card
70+
6071 case . sites:
61- sites = NSOrderedSet ( array: remoteCard. sites? . prefix ( 3 ) . map {
72+ let card = ReaderCard ( context: context)
73+ card. sites = NSOrderedSet ( array: remoteCard. sites? . prefix ( 3 ) . map {
6274 ReaderSiteTopic . createIfNeeded ( from: $0, context: context)
6375 } ?? [ ] )
76+ return card
6477
6578 default :
66- break
79+ return nil
6780 }
6881 }
82+
83+ private static func findExistingCard( with post: ReaderPost ? , context: NSManagedObjectContext ) -> ReaderCard ? {
84+ guard let post else {
85+ return nil
86+ }
87+
88+ let fetchRequest = ReaderCard . fetchRequest ( )
89+ fetchRequest. predicate = NSPredicate ( format: " post = %@ " , post)
90+ fetchRequest. fetchLimit = 1
91+
92+ return try ? context. fetch ( fetchRequest) . first
93+ }
6994}
0 commit comments