@@ -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
6074extension 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
215284struct 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