-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathPostServiceRemoteREST+Extended.swift
67 lines (60 loc) · 2.96 KB
/
PostServiceRemoteREST+Extended.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import Foundation
extension PostServiceRemoteREST: PostServiceRemoteExtended {
public func createPost(with parameters: RemotePostCreateParameters) async throws -> RemotePost {
let path = self.path(forEndpoint: "sites/\(siteID)/posts/new?context=edit", withVersion: ._1_2)
let parameters = try makeParameters(from: RemotePostCreateParametersWordPressComEncoder(parameters: parameters))
let response = try await wordPressComRestApi.perform(.post, URLString: path, parameters: parameters).get()
return try await decodePost(from: response.body)
}
public func patchPost(withID postID: Int, parameters: RemotePostUpdateParameters) async throws -> RemotePost {
let path = self.path(forEndpoint: "sites/\(siteID)/posts/\(postID)?context=edit", withVersion: ._1_2)
let parameters = try makeParameters(from: RemotePostUpdateParametersWordPressComEncoder(parameters: parameters))
let result = await wordPressComRestApi.perform(.post, URLString: path, parameters: parameters)
switch result {
case .success(let response):
return try await decodePost(from: response.body)
case .failure(let error):
guard case .endpointError(let error) = error else {
throw error
}
switch error.apiErrorCode ?? "" {
case "unknown_post": throw PostServiceRemoteUpdatePostError.notFound
case "old-revision": throw PostServiceRemoteUpdatePostError.conflict
default: throw error
}
}
}
public func deletePost(withID postID: Int) async throws {
let path = self.path(forEndpoint: "sites/\(siteID)/posts/\(postID)/delete", withVersion: ._1_1)
let result = await wordPressComRestApi.perform(.post, URLString: path)
switch result {
case .success:
return
case .failure(let error):
guard case .endpointError(let error) = error else {
throw error
}
switch error.apiErrorCode ?? "" {
case "unknown_post": throw PostServiceRemoteUpdatePostError.notFound
default: throw error
}
}
}
}
// Decodes the post in the background.
private func decodePost(from object: AnyObject) async throws -> RemotePost {
guard let dictionary = object as? [AnyHashable: Any] else {
throw WordPressAPIError<WordPressComRestApiEndpointError>.unparsableResponse(response: nil, body: nil)
}
return PostServiceRemoteREST.remotePost(fromJSONDictionary: dictionary)
}
private func makeParameters<T: Encodable>(from value: T) throws -> [String: AnyObject] {
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .formatted(.wordPressCom)
let data = try encoder.encode(value)
let object = try JSONSerialization.jsonObject(with: data)
guard let dictionary = object as? [String: AnyObject] else {
throw URLError(.unknown) // This should never happen
}
return dictionary
}