Skip to content

Commit 96b02e4

Browse files
committed
Fix an issue with posts duplicated in Discover
1 parent 696fef0 commit 96b02e4

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

Sources/WordPressData/Swift/ReaderCard+CoreDataClass.swift

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

WordPress/Classes/Services/ReaderCardService.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class ReaderCardService {
8181
}
8282

8383
updatedCards.enumerated().forEach { index, remoteCard in
84-
let card = ReaderCard(context: context, from: remoteCard)
84+
let card = ReaderCard.createOrReuse(context: context, from: remoteCard)
8585

8686
// Assign each interest an endpoint
8787
card?

0 commit comments

Comments
 (0)