Skip to content

Commit 10b1e7e

Browse files
keanjkmassel
authored andcommitted
Fix an issue with posts duplicated in Discover (#25015)
1 parent 432c676 commit 10b1e7e

File tree

5 files changed

+38
-15
lines changed

5 files changed

+38
-15
lines changed

RELEASE-NOTES.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
26.6
22
-----
3-
* [*] Fix horizontal insets in Reader article view [#25010]
43

54

65
26.5
@@ -11,6 +10,7 @@
1110
* [*] Add "Access" section to "Post Settings" [#24942]
1211
* [*] Add "Discussion" to "Post Settings" [#24948]
1312
* [*] Add "File Size" to Site Media Details [#24947]
13+
* [*] Fix an issue with posts duplicated in Discover [#25015]
1414
* [*] Add "Email to Subscribers" row to "Publishing" sheet [#24946]
1515
* [*] Add permalink preview in the slug editor and make other improvements [#24949]
1616
* [*] Add two accessible font sizes to Reader display settings [#25013]
@@ -20,6 +20,7 @@
2020
* [*] Add support for editing custom taxonomy terms from "Post Settings" [#24964]
2121
* [*] Fix overly long related post titles in Reader [#25011]
2222
* [*] Increase number of lines for post tiles in Reader to three [#25019]
23+
* [*] Fix horizontal insets in Reader article view [#25010]
2324

2425
26.4
2526
-----

Sources/WordPressData/Swift/ReaderCard+CoreDataClass.swift

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

Tests/KeystoneTests/Tests/Models/ReaderCardTests.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class ReaderCardTests: CoreDataTestCase {
1111
let expectation = self.expectation(description: "Create a Reader Card of type post")
1212

1313
remoteCard(ofType: .post) { remoteCard in
14-
let card = ReaderCard(context: self.mainContext, from: remoteCard)
14+
let card = ReaderCard.createOrReuse(context: self.mainContext, from: remoteCard)
1515

1616
expect(card?.post).toNot(beNil())
1717
expect(card?.post?.postTitle).to(equal("Pats, Please"))
@@ -28,7 +28,7 @@ class ReaderCardTests: CoreDataTestCase {
2828
let expectation = self.expectation(description: "Create a Reader Card of type interests")
2929

3030
remoteCard(ofType: .interests) { remoteCard in
31-
let card = ReaderCard(context: self.mainContext, from: remoteCard)
31+
let card = ReaderCard.createOrReuse(context: self.mainContext, from: remoteCard)
3232
let topics = card?.topicsArray
3333

3434
// THEN return 0 as these were disabled in 26.5
@@ -45,7 +45,7 @@ class ReaderCardTests: CoreDataTestCase {
4545
let expectation = self.expectation(description: "Create a Reader Card of type sites")
4646

4747
remoteCard(ofType: .sites) { remoteCard in
48-
let card = ReaderCard(context: self.mainContext, from: remoteCard)
48+
let card = ReaderCard.createOrReuse(context: self.mainContext, from: remoteCard)
4949
let topics = card?.sitesArray
5050

5151
expect(topics?.count).to(equal(1))
@@ -63,7 +63,7 @@ class ReaderCardTests: CoreDataTestCase {
6363
let expectation = self.expectation(description: "Don't create a Reader Card")
6464

6565
remoteCard(ofType: .unknown) { remoteCard in
66-
let card = ReaderCard(context: self.mainContext, from: remoteCard)
66+
let card = ReaderCard.createOrReuse(context: self.mainContext, from: remoteCard)
6767

6868
expect(card).to(beNil())
6969
expectation.fulfill()

Tests/KeystoneTests/Tests/Services/ReaderCardServiceTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class ReaderCardServiceTests: CoreDataTestCase {
2626

2727
service.fetch(isFirstPage: true, success: { _, _ in
2828
let cards = try? self.mainContext.fetch(NSFetchRequest(entityName: ReaderCard.classNameWithoutNamespaces()))
29-
expect(cards?.count).to(equal(10))
29+
expect(cards?.count).to(equal(9))
3030
expectation.fulfill()
3131
}, failure: { _ in })
3232

@@ -74,7 +74,7 @@ class ReaderCardServiceTests: CoreDataTestCase {
7474
// Fetch again, this time the 1st page
7575
service.fetch(isFirstPage: true, success: { _, _ in
7676
let cards = try? self.mainContext.fetch(NSFetchRequest(entityName: ReaderCard.classNameWithoutNamespaces())) as? [ReaderCard]
77-
expect(cards?.count).to(equal(10))
77+
expect(cards?.count).to(equal(9))
7878
expectation.fulfill()
7979
}, failure: { _ in })
8080
}, failure: {_ in })

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)