Skip to content

Commit d25e7f9

Browse files
authored
Offline Mode: Add support for metadata (#783)
2 parents ff552e0 + 14e48b8 commit d25e7f9

File tree

1 file changed

+96
-2
lines changed

1 file changed

+96
-2
lines changed

Sources/WordPressKit/Models/RemotePostParameters.swift

+96-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public struct RemotePostCreateParameters: Equatable {
2222
public var isSticky = false
2323
public var tags: [String] = []
2424
public var categoryIDs: [Int] = []
25+
public var metadata: Set<RemotePostMetadataItem> = []
2526

2627
public init(type: String, status: String) {
2728
self.type = type
@@ -51,10 +52,23 @@ public struct RemotePostUpdateParameters: Equatable {
5152
public var isSticky: Bool?
5253
public var tags: [String]?
5354
public var categoryIDs: [Int]?
55+
public var metadata: Set<RemotePostMetadataItem>?
5456

5557
public init() {}
5658
}
5759

60+
public struct RemotePostMetadataItem: Hashable {
61+
public var id: String?
62+
public var key: String?
63+
public var value: String?
64+
65+
public init(id: String?, key: String?, value: String?) {
66+
self.id = id
67+
self.key = key
68+
self.value = value
69+
}
70+
}
71+
5872
// MARK: - Diff
5973

6074
extension RemotePostCreateParameters {
@@ -104,6 +118,9 @@ extension RemotePostCreateParameters {
104118
if previous.categoryIDs != categoryIDs {
105119
changes.categoryIDs = categoryIDs
106120
}
121+
if previous.metadata != metadata {
122+
changes.metadata = metadata
123+
}
107124
return changes
108125
}
109126

@@ -151,6 +168,9 @@ extension RemotePostCreateParameters {
151168
if let categoryIDs = changes.categoryIDs {
152169
self.categoryIDs = categoryIDs
153170
}
171+
if let metadata = changes.metadata {
172+
self.metadata = metadata
173+
}
154174
}
155175
}
156176

@@ -173,6 +193,7 @@ private enum RemotePostWordPressComCodingKeys: String, CodingKey {
173193
case format
174194
case isSticky = "sticky"
175195
case categoryIDs = "categories_by_id"
196+
case metadata
176197

177198
static let postTags = "post_tag"
178199
}
@@ -192,6 +213,10 @@ struct RemotePostCreateParametersWordPressComEncoder: Encodable {
192213
try container.encodeIfPresent(parameters.excerpt, forKey: .excerpt)
193214
try container.encodeIfPresent(parameters.slug, forKey: .slug)
194215
try container.encodeIfPresent(parameters.featuredImageID, forKey: .featuredImageID)
216+
if !parameters.metadata.isEmpty {
217+
let metadata = parameters.metadata.map(RemotePostUpdateParametersWordPressComMetadata.init)
218+
try container.encode(metadata, forKey: .metadata)
219+
}
195220

196221
// Pages
197222
if let parentPageID = parameters.parentPageID {
@@ -210,6 +235,50 @@ struct RemotePostCreateParametersWordPressComEncoder: Encodable {
210235
try container.encode(parameters.isSticky, forKey: .isSticky)
211236
}
212237
}
238+
239+
// - warning: fixme
240+
static func encodeMetadata(_ metadata: Set<RemotePostMetadataItem>) -> [[String: Any]] {
241+
metadata.map { item in
242+
var operation = "update"
243+
if item.key == nil {
244+
if item.id != nil && item.value == nil {
245+
operation = "delete"
246+
} else if item.id == nil && item.value != nil {
247+
operation = "add"
248+
}
249+
}
250+
var dictionary: [String: Any] = [:]
251+
if let id = item.id { dictionary["id"] = id }
252+
if let value = item.value { dictionary["value"] = value }
253+
if let key = item.key { dictionary["key"] = key }
254+
dictionary["operation"] = operation
255+
return dictionary
256+
}
257+
}
258+
}
259+
260+
struct RemotePostUpdateParametersWordPressComMetadata: Encodable {
261+
let id: String?
262+
let operation: String
263+
let key: String?
264+
let value: String?
265+
266+
init(_ item: RemotePostMetadataItem) {
267+
if item.key == nil {
268+
if item.id != nil && item.value == nil {
269+
self.operation = "delete"
270+
} else if item.id == nil && item.value != nil {
271+
self.operation = "add"
272+
} else {
273+
self.operation = "update"
274+
}
275+
} else {
276+
self.operation = "update"
277+
}
278+
self.id = item.id
279+
self.key = item.key
280+
self.value = item.value
281+
}
213282
}
214283

215284
struct RemotePostUpdateParametersWordPressComEncoder: Encodable {
@@ -229,12 +298,16 @@ struct RemotePostUpdateParametersWordPressComEncoder: Encodable {
229298
try container.encodeIfPresent(parameters.slug, forKey: .slug)
230299
if let value = parameters.featuredImageID {
231300
if let featuredImageID = value {
232-
try container.encode(parameters.featuredImageID, forKey: .featuredImageID)
301+
try container.encode(featuredImageID, forKey: .featuredImageID)
233302
} else {
234303
// Passing `null` doesn't work.
235304
try container.encode("", forKey: .featuredImageID)
236305
}
237306
}
307+
if let metadata = parameters.metadata, !metadata.isEmpty {
308+
let metadata = metadata.map(RemotePostUpdateParametersWordPressComMetadata.init)
309+
try container.encode(metadata, forKey: .metadata)
310+
}
238311

239312
// Pages
240313
if let parentPageID = parameters.parentPageID {
@@ -270,6 +343,7 @@ private enum RemotePostXMLRPCCodingKeys: String, CodingKey {
270343
case format = "wp_post_format"
271344
case isSticky = "sticky"
272345
case categoryIDs = "categories"
346+
case metadata = "custom_fields"
273347

274348
static let postTags = "post_tag"
275349
}
@@ -289,6 +363,10 @@ struct RemotePostCreateParametersXMLRPCEncoder: Encodable {
289363
try container.encodeIfPresent(parameters.excerpt, forKey: .excerpt)
290364
try container.encodeIfPresent(parameters.slug, forKey: .slug)
291365
try container.encodeIfPresent(parameters.featuredImageID, forKey: .featuredImageID)
366+
if !parameters.metadata.isEmpty {
367+
let metadata = parameters.metadata.map(RemotePostUpdateParametersXMLRPCMetadata.init)
368+
try container.encode(metadata, forKey: .metadata)
369+
}
292370

293371
// Pages
294372
if let parentPageID = parameters.parentPageID {
@@ -325,12 +403,16 @@ struct RemotePostUpdateParametersXMLRPCEncoder: Encodable {
325403
try container.encodeIfPresent(parameters.slug, forKey: .slug)
326404
if let value = parameters.featuredImageID {
327405
if let featuredImageID = value {
328-
try container.encode(parameters.featuredImageID, forKey: .featuredImageID)
406+
try container.encode(featuredImageID, forKey: .featuredImageID)
329407
} else {
330408
// Passing `null` doesn't work.
331409
try container.encode("", forKey: .featuredImageID)
332410
}
333411
}
412+
if let metadata = parameters.metadata, !metadata.isEmpty {
413+
let metadata = metadata.map(RemotePostUpdateParametersXMLRPCMetadata.init)
414+
try container.encode(metadata, forKey: .metadata)
415+
}
334416

335417
// Pages
336418
if let parentPageID = parameters.parentPageID {
@@ -346,3 +428,15 @@ struct RemotePostUpdateParametersXMLRPCEncoder: Encodable {
346428
try container.encodeIfPresent(parameters.isSticky, forKey: .isSticky)
347429
}
348430
}
431+
432+
struct RemotePostUpdateParametersXMLRPCMetadata: Encodable {
433+
let id: String?
434+
let key: String?
435+
let value: String?
436+
437+
init(_ item: RemotePostMetadataItem) {
438+
self.id = item.id
439+
self.key = item.key
440+
self.value = item.value
441+
}
442+
}

0 commit comments

Comments
 (0)