diff --git a/WordPressKit.podspec b/WordPressKit.podspec index 4f706d78..b1efe59a 100644 --- a/WordPressKit.podspec +++ b/WordPressKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "WordPressKit" - s.version = "4.25.0-beta.1" + s.version = "4.25.0-beta.2" s.summary = "WordPressKit offers a clean and simple WordPress.com and WordPress.org API." s.description = <<-DESC diff --git a/WordPressKit/ReaderPostServiceRemote+V2.swift b/WordPressKit/ReaderPostServiceRemote+V2.swift index 34ba0438..a8004179 100644 --- a/WordPressKit/ReaderPostServiceRemote+V2.swift +++ b/WordPressKit/ReaderPostServiceRemote+V2.swift @@ -44,4 +44,53 @@ extension ReaderPostServiceRemote { return self.path(forEndpoint: endpoint, withVersion: ._2_0) } + + + /// Sets the `is_seen` status for a given post. + /// + /// - Parameter seen: the post is to be marked seen or not (unseen) + /// - Parameter feedID: feedID of the ReaderPost + /// - Parameter feedItemID: feedItemID of the ReaderPost + /// - Parameter success: Called when the request succeeds + /// - Parameter failure: Called when the request fails + @objc + public func markPostSeen(seen: Bool, + feedID: NSNumber, + feedItemID: NSNumber, + success: @escaping (() -> Void), + failure: @escaping ((Error) -> Void)) { + + let endpoint = seen ? SeenEndpoints.seen : SeenEndpoints.unseen + let path = self.path(forEndpoint: endpoint, withVersion: ._2_0) + + let params = [ + "feed_id": feedID, + "feed_item_ids": [feedItemID], + "source": "reader-ios" + ] as [String: AnyObject] + + wordPressComRestApi.POST(path, parameters: params, success: { (responseObject, httpResponse) in + guard let response = responseObject as? [String: AnyObject], + let status = response["status"] as? Bool, + status == true else { + failure(MarkSeenError.failed) + return + } + success() + }, failure: { (error, httpResponse) in + failure(error) + }) + } + + private enum MarkSeenError: Error { + case failed + } + + private struct SeenEndpoints { + // Creates a new `seen` entry (i.e. mark as seen) + static let seen = "seen-posts/seen/new" + // Removes the `seen` entry (i.e. mark as unseen) + static let unseen = "seen-posts/seen/delete" + } + } diff --git a/WordPressKit/RemoteReaderPost.h b/WordPressKit/RemoteReaderPost.h index aa625eec..9856430f 100644 --- a/WordPressKit/RemoteReaderPost.h +++ b/WordPressKit/RemoteReaderPost.h @@ -27,6 +27,7 @@ @property (nonatomic) BOOL isLiked; @property (nonatomic) BOOL isReblogged; @property (nonatomic) BOOL isWPCom; +@property (nonatomic) BOOL isSeen; @property (nonatomic, strong) NSNumber *likeCount; @property (nonatomic, strong) NSNumber *score; @property (nonatomic, strong) NSNumber *siteID; diff --git a/WordPressKit/RemoteReaderPost.m b/WordPressKit/RemoteReaderPost.m index 935deed6..e664a168 100644 --- a/WordPressKit/RemoteReaderPost.m +++ b/WordPressKit/RemoteReaderPost.m @@ -32,6 +32,7 @@ NSString * const PostRESTKeyIsFollowing = @"is_following"; NSString * const PostRESTKeyIsJetpack = @"is_jetpack"; NSString * const PostRESTKeyIsReblogged = @"is_reblogged"; +NSString * const PostRESTKeyIsSeen = @"is_seen"; NSString * const PostRESTKeyLikeCount = @"like_count"; NSString * const PostRESTKeyLikesEnabled = @"likes_enabled"; NSString * const PostRESTKeyName = @"name"; @@ -110,6 +111,7 @@ - (instancetype)initWithDictionary:(NSDictionary *)dict; self.isFollowing = [[dict numberForKey:PostRESTKeyIsFollowing] boolValue]; self.isLiked = [[dict numberForKey:PostRESTKeyILike] boolValue]; self.isReblogged = [[dict numberForKey:PostRESTKeyIsReblogged] boolValue]; + self.isSeen = [[dict numberForKey:PostRESTKeyIsSeen] boolValue]; self.isWPCom = [self isWPComFromPostDictionary:dict]; self.likeCount = [dict numberForKey:PostRESTKeyLikeCount]; self.permalink = [self stringOrEmptyString:[dict stringForKey:PostRESTKeyURL]];