Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit 055a195

Browse files
authored
Merge pull request #192 from guarani/issue/12141-restore-revision-dialog
Add autosave attributes to RemotePost
2 parents 8f29ee4 + 851cc8d commit 055a195

File tree

8 files changed

+155
-3
lines changed

8 files changed

+155
-3
lines changed

WordPressKit.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = "WordPressKit"
3-
s.version = "4.5.3-beta.1"
3+
s.version = "4.5.3-beta.2"
44
s.summary = "WordPressKit offers a clean and simple WordPress.com and WordPress.org API."
55

66
s.description = <<-DESC

WordPressKit.xcodeproj/project.pbxproj

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
17CE77F420C701C8001DEA5A /* ReaderSiteSearchServiceRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17CE77F320C701C8001DEA5A /* ReaderSiteSearchServiceRemoteTests.swift */; };
1818
1A4F98672279A87D00D86E8E /* WPKit-Swift.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4F98662279A87D00D86E8E /* WPKit-Swift.h */; settings = {ATTRIBUTES = (Private, ); }; };
1919
240315B0A1D6C2B981572B5B /* Pods_WordPressKitTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED05C8FF3E61D93CE5BA527E /* Pods_WordPressKitTests.framework */; };
20+
32A29A1F236BE4CC009488C2 /* post-autosave-mapping-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 32A29A1E236BE4CC009488C2 /* post-autosave-mapping-success.json */; };
21+
32AF21E3236DEB3C001C6502 /* PostServiceRemoteRESTAutosaveTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32AF21E2236DEB3C001C6502 /* PostServiceRemoteRESTAutosaveTests.swift */; };
22+
32E1DD23236AA09A008914B0 /* RemotePostAutosave.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32E1DD22236AA09A008914B0 /* RemotePostAutosave.swift */; };
2023
40247DFA2120D8E100AE1C3C /* AutomatedTransferService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40247DF92120D8E100AE1C3C /* AutomatedTransferService.swift */; };
2124
40247DFC2120E69600AE1C3C /* AutomatedTransferStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40247DFB2120E69600AE1C3C /* AutomatedTransferStatus.swift */; };
2225
404057C5221B30400060250C /* StatsSearchTermTimeIntervalData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 404057C4221B30400060250C /* StatsSearchTermTimeIntervalData.swift */; };
@@ -488,6 +491,9 @@
488491
17CE77F320C701C8001DEA5A /* ReaderSiteSearchServiceRemoteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderSiteSearchServiceRemoteTests.swift; sourceTree = "<group>"; };
489492
1A4F98662279A87D00D86E8E /* WPKit-Swift.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WPKit-Swift.h"; sourceTree = "<group>"; };
490493
264F5C834541BBF2018F4964 /* Pods-WordPressKitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WordPressKitTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WordPressKitTests/Pods-WordPressKitTests.debug.xcconfig"; sourceTree = "<group>"; };
494+
32A29A1E236BE4CC009488C2 /* post-autosave-mapping-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "post-autosave-mapping-success.json"; sourceTree = "<group>"; };
495+
32AF21E2236DEB3C001C6502 /* PostServiceRemoteRESTAutosaveTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceRemoteRESTAutosaveTests.swift; sourceTree = "<group>"; };
496+
32E1DD22236AA09A008914B0 /* RemotePostAutosave.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemotePostAutosave.swift; sourceTree = "<group>"; };
491497
40247DF92120D8E100AE1C3C /* AutomatedTransferService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutomatedTransferService.swift; sourceTree = "<group>"; };
492498
40247DFB2120E69600AE1C3C /* AutomatedTransferStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutomatedTransferStatus.swift; sourceTree = "<group>"; };
493499
404057C4221B30400060250C /* StatsSearchTermTimeIntervalData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsSearchTermTimeIntervalData.swift; sourceTree = "<group>"; };
@@ -1041,9 +1047,10 @@
10411047
740B23D41F17F6D200067A2A /* Post */ = {
10421048
isa = PBXGroup;
10431049
children = (
1050+
32AF21E2236DEB3C001C6502 /* PostServiceRemoteRESTAutosaveTests.swift */,
1051+
9AB6D649218727D60008F274 /* PostServiceRemoteRESTRevisionsTest.swift */,
10441052
740B23D01F17F6BB00067A2A /* PostServiceRemoteRESTTests.m */,
10451053
740B23D11F17F6BB00067A2A /* PostServiceRemoteXMLRPCTests.swift */,
1046-
9AB6D649218727D60008F274 /* PostServiceRemoteRESTRevisionsTest.swift */,
10471054
);
10481055
name = Post;
10491056
sourceTree = "<group>";
@@ -1455,6 +1462,7 @@
14551462
E1D6B555200E46F200325669 /* WPTimeZone.swift */,
14561463
E632D7771F6E047400297F6D /* SocialLogin2FANonceInfo.swift */,
14571464
17CE77F020C6EB41001DEA5A /* ReaderFeed.swift */,
1465+
32E1DD22236AA09A008914B0 /* RemotePostAutosave.swift */,
14581466
);
14591467
name = Models;
14601468
sourceTree = "<group>";
@@ -1571,6 +1579,7 @@
15711579
40E4698C2017D2E30030DB5F /* plugin-directory-new.json */,
15721580
40E4698A2017C2840030DB5F /* plugin-directory-popular.json */,
15731581
E1E89C651FD6B291006E7A33 /* plugin-directory-rename-xml-rpc.json */,
1582+
32A29A1E236BE4CC009488C2 /* post-autosave-mapping-success.json */,
15741583
9AB6D648218722BB0008F274 /* post-revisions-success.json */,
15751584
9AB6D64D218731380008F274 /* post-revisions-mapping-success.json */,
15761585
9AB6D64C218730130008F274 /* post-revisions-failure.json */,
@@ -1932,6 +1941,8 @@
19321941
isa = PBXResourcesBuildPhase;
19331942
buildActionMask = 2147483647;
19341943
files = (
1944+
32A29A1F236BE4CC009488C2 /* post-autosave-mapping-success.json in Resources */,
1945+
93AC8EC61ED32FD000900F5A /* stats-v1.1-alltime.json in Resources */,
19351946
7403A2FC1EF06FEB00DED7DC /* me-settings-change-lastname-success.json in Resources */,
19361947
40F88F601F85723500AE3FAF /* auth-send-verification-email-already-verified-failure.json in Resources */,
19371948
74D67F211F15C3240010C5ED /* people-validate-invitation-success.json in Resources */,
@@ -2209,6 +2220,8 @@
22092220
isa = PBXSourcesBuildPhase;
22102221
buildActionMask = 2147483647;
22112222
files = (
2223+
32E1DD23236AA09A008914B0 /* RemotePostAutosave.swift in Sources */,
2224+
9368C7B41EC630270092CE8E /* StatsItemAction.m in Sources */,
22122225
7430C9B41F1927C50051B8E6 /* RemoteReaderSite.m in Sources */,
22132226
74585B8E1F0D51A100E7E667 /* DomainsServiceRemote.swift in Sources */,
22142227
7430C9A41F1927180051B8E6 /* ReaderPostServiceRemote.m in Sources */,
@@ -2385,6 +2398,7 @@
23852398
E13EE14C1F332C4400C15787 /* PluginServiceRemoteTests.swift in Sources */,
23862399
736C971021E80D48007A4200 /* SiteVerticalsPromptResponseDecodingTests.swift in Sources */,
23872400
74B335D81F06F1CA0053A184 /* MockWordPressComRestApi.swift in Sources */,
2401+
32AF21E3236DEB3C001C6502 /* PostServiceRemoteRESTAutosaveTests.swift in Sources */,
23882402
74B5F0DE1EF82A9600B411E7 /* BlogServiceRemoteRESTTests.m in Sources */,
23892403
74E2294B1F1E73340085F7F2 /* SharingServiceRemoteTests.m in Sources */,
23902404
73B3DAD621FBB20D00B2CF18 /* WordPressComRestApiTests+Locale.swift in Sources */,

WordPressKit/PostServiceRemoteOptions.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,9 @@ typedef NS_ENUM(NSUInteger, PostServiceResultsOrdering) {
7272
*/
7373
- (NSString *)search;
7474

75+
/**
76+
The metadata to include in the returned results.
77+
*/
78+
- (NSString *)meta;
79+
7580
@end

WordPressKit/PostServiceRemoteREST.m

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
static NSString * const RemoteOptionKeyStatus = @"status";
1616
static NSString * const RemoteOptionKeySearch = @"search";
1717
static NSString * const RemoteOptionKeyAuthor = @"author";
18+
static NSString * const RemoteOptionKeyMeta = @"meta";
1819

1920
static NSString * const RemoteOptionValueOrderAscending = @"ASC";
2021
static NSString * const RemoteOptionValueOrderDescending = @"DESC";
@@ -365,6 +366,9 @@ - (NSDictionary *)dictionaryWithRemoteOptions:(id <PostServiceRemoteOptions>)opt
365366
if (options.search.length > 0) {
366367
[remoteParams setObject:options.search forKey:RemoteOptionKeySearch];
367368
}
369+
if (options.meta.length > 0) {
370+
[remoteParams setObject:options.meta forKey:RemoteOptionKeyMeta];
371+
}
368372

369373
return remoteParams.count ? [NSDictionary dictionaryWithDictionary:remoteParams] : nil;
370374
}
@@ -432,7 +436,21 @@ - (RemotePost *)remotePostFromJSONDictionary:(NSDictionary *)jsonPost {
432436
post.tags = [self tagNamesFromJSONDictionary:jsonPost[@"tags"]];
433437

434438
post.revisions = [jsonPost arrayForKey:@"revisions"];
435-
439+
440+
NSDictionary *autosaveAttributes = jsonPost[@"meta"][@"data"][@"autosave"];
441+
if ([autosaveAttributes wp_isValidObject]) {
442+
RemotePostAutosave *autosave = [[RemotePostAutosave alloc] init];
443+
autosave.title = autosaveAttributes[@"title"];
444+
autosave.content = autosaveAttributes[@"content"];
445+
autosave.excerpt = autosaveAttributes[@"excerpt"];
446+
autosave.modifiedDate = [NSDate dateWithWordPressComJSONString:autosaveAttributes[@"modified"]];
447+
autosave.identifier = autosaveAttributes[@"ID"];
448+
autosave.authorID = autosaveAttributes[@"author_ID"];
449+
autosave.postID = autosaveAttributes[@"post_ID"];
450+
autosave.previewURL = autosaveAttributes[@"preview_URL"];
451+
post.autosave = autosave;
452+
}
453+
436454
// Pick an image to use for display
437455
if (post.postThumbnailPath) {
438456
post.pathForDisplayImage = post.postThumbnailPath;

WordPressKit/RemotePost.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#import <Foundation/Foundation.h>
2+
@class RemotePostAutosave;
23

34
extern NSString * const PostStatusDraft;
45
extern NSString * const PostStatusPending;
@@ -35,6 +36,13 @@ extern NSString * const PostStatusDeleted;
3536
@property (nonatomic, strong) NSString *type;
3637
@property (nonatomic, strong) NSString *format;
3738

39+
/**
40+
* A snapshot of the post at the last autosave.
41+
*
42+
* This is nullable.
43+
*/
44+
@property (nonatomic, strong) RemotePostAutosave *autosave;
45+
3846
@property (nonatomic, strong) NSNumber *commentCount;
3947
@property (nonatomic, strong) NSNumber *likeCount;
4048

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import Foundation
2+
3+
/// Encapsulates the autosave attributes of a post.
4+
@objc
5+
@objcMembers
6+
public class RemotePostAutosave: NSObject {
7+
public var title: String?
8+
public var excerpt: String?
9+
public var content: String?
10+
public var modifiedDate: Date?
11+
public var identifier: NSNumber?
12+
public var authorID: String?
13+
public var postID: NSNumber?
14+
public var previewURL: String?
15+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"found": 3,
3+
"posts": [
4+
{
5+
"modified": "2019-10-28T02:05:52+00:00",
6+
"title": "Hola, mundo!",
7+
"status": "publish",
8+
"meta": {
9+
"links": {
10+
"self": "https://public-api.wordpress.com/rest/v1.1/sites/168297153/posts/102",
11+
"help": "https://public-api.wordpress.com/rest/v1.1/sites/168297153/posts/102/help",
12+
"site": "https://public-api.wordpress.com/rest/v1.1/sites/168297153",
13+
"replies": "https://public-api.wordpress.com/rest/v1.1/sites/168297153/posts/102/replies/",
14+
"likes": "https://public-api.wordpress.com/rest/v1.1/sites/168297153/posts/102/likes/",
15+
"autosave": "https://public-api.wordpress.com/rest/v1.1/sites/168297153/posts/102/autosave"
16+
},
17+
"data": {
18+
"autosave": {
19+
"ID": 100,
20+
"author_ID": "12345678",
21+
"post_ID": 102,
22+
"title": "Hello, world!",
23+
"content": "<!-- wp:paragraph -->\n<p>Uno.</p>\n<!-- /wp:paragraph -->",
24+
"excerpt": "abc",
25+
"preview_URL": "https://hello.wordpress.com/2019/10/28/hello-world/?preview=true&preview_nonce=07346f4e5d",
26+
"modified": "2019-10-28T02:06:39+00:00"
27+
}
28+
}
29+
}
30+
}
31+
],
32+
"meta": {
33+
"links": {
34+
"counts": "https://public-api.wordpress.com/rest/v1.1/sites/168297153/post-counts/post"
35+
},
36+
"wpcom": true
37+
}
38+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import Foundation
2+
import XCTest
3+
4+
@testable import WordPressKit
5+
6+
7+
class PostServiceRemoteRESTAutosaveTests: RemoteTestCase, RESTTestable {
8+
private let performPostsAutosaveSuccessFilename = "post-autosave-mapping-success.json"
9+
private let siteId = 0
10+
private var remote: PostServiceRemoteREST!
11+
private var postsEndpoint: String {
12+
return "sites/\(siteId)/posts"
13+
}
14+
15+
override func setUp() {
16+
super.setUp()
17+
remote = PostServiceRemoteREST(wordPressComRestApi: getRestApi(), siteID: NSNumber(value: siteId))
18+
}
19+
20+
override func tearDown() {
21+
super.tearDown()
22+
remote = nil
23+
}
24+
25+
26+
// MARK: Perform tests
27+
28+
func testFetchPostsPerformsAutosaveMappingSuccessfully() {
29+
let expect = expectation(description: "Fetch posts fetches autosaves successfully")
30+
31+
stubRemoteResponse(postsEndpoint, filename: performPostsAutosaveSuccessFilename, contentType: .ApplicationJSON)
32+
remote.getPostsOfType("", options: [:], success: { remotePosts in
33+
34+
guard let remotePost = remotePosts?.first else {
35+
XCTFail("Failed to retrieve mock post")
36+
return
37+
}
38+
39+
XCTAssertEqual(remotePost.autosave.identifier?.intValue, 100)
40+
XCTAssertEqual(remotePost.autosave.authorID, "12345678")
41+
XCTAssertEqual(remotePost.autosave.postID, 102)
42+
XCTAssertEqual(remotePost.autosave.title, "Hello, world!")
43+
XCTAssertEqual(remotePost.autosave.content, "<!-- wp:paragraph -->\n<p>Uno.</p>\n<!-- /wp:paragraph -->")
44+
XCTAssertEqual(remotePost.autosave.excerpt, "abc")
45+
XCTAssertEqual(remotePost.autosave.previewURL, "https://hello.wordpress.com/2019/10/28/hello-world/?preview=true&preview_nonce=07346f4e5d")
46+
XCTAssertEqual(remotePost.autosave.modifiedDate, NSDate(wordPressComJSONString: "2019-10-28T02:06:39+00:00") as Date?)
47+
expect.fulfill()
48+
}, failure: { _ in
49+
XCTFail("This callback shouldn't get called")
50+
expect.fulfill()
51+
})
52+
waitForExpectations(timeout: timeout, handler: nil)
53+
}
54+
}

0 commit comments

Comments
 (0)