@@ -43,25 +43,47 @@ 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- return nil // Disabled in v26.6
65+ return nil // Disabled in v26.5
5866 case . sites:
59- sites = NSOrderedSet ( array: remoteCard. sites? . prefix ( 3 ) . map {
67+ let card = ReaderCard ( context: context)
68+ card. sites = NSOrderedSet ( array: remoteCard. sites? . prefix ( 3 ) . map {
6069 ReaderSiteTopic . createIfNeeded ( from: $0, context: context)
6170 } ?? [ ] )
71+ return card
6272
6373 default :
64- break
74+ return nil
6575 }
6676 }
77+
78+ private static func findExistingCard( with post: ReaderPost ? , context: NSManagedObjectContext ) -> ReaderCard ? {
79+ guard let post else {
80+ return nil
81+ }
82+
83+ let fetchRequest = ReaderCard . fetchRequest ( )
84+ fetchRequest. predicate = NSPredicate ( format: " post = %@ " , post)
85+ fetchRequest. fetchLimit = 1
86+
87+ return try ? context. fetch ( fetchRequest) . first
88+ }
6789}
0 commit comments