@@ -22,6 +22,7 @@ public struct RemotePostCreateParameters: Equatable {
22
22
public var isSticky = false
23
23
public var tags : [ String ] = [ ]
24
24
public var categoryIDs : [ Int ] = [ ]
25
+ public var metadata : Set < RemotePostMetadataItem > = [ ]
25
26
26
27
public init ( type: String , status: String ) {
27
28
self . type = type
@@ -51,10 +52,23 @@ public struct RemotePostUpdateParameters: Equatable {
51
52
public var isSticky : Bool ?
52
53
public var tags : [ String ] ?
53
54
public var categoryIDs : [ Int ] ?
55
+ public var metadata : Set < RemotePostMetadataItem > ?
54
56
55
57
public init ( ) { }
56
58
}
57
59
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
+
58
72
// MARK: - Diff
59
73
60
74
extension RemotePostCreateParameters {
@@ -104,6 +118,9 @@ extension RemotePostCreateParameters {
104
118
if previous. categoryIDs != categoryIDs {
105
119
changes. categoryIDs = categoryIDs
106
120
}
121
+ if previous. metadata != metadata {
122
+ changes. metadata = metadata
123
+ }
107
124
return changes
108
125
}
109
126
@@ -151,6 +168,9 @@ extension RemotePostCreateParameters {
151
168
if let categoryIDs = changes. categoryIDs {
152
169
self . categoryIDs = categoryIDs
153
170
}
171
+ if let metadata = changes. metadata {
172
+ self . metadata = metadata
173
+ }
154
174
}
155
175
}
156
176
@@ -173,6 +193,7 @@ private enum RemotePostWordPressComCodingKeys: String, CodingKey {
173
193
case format
174
194
case isSticky = " sticky "
175
195
case categoryIDs = " categories_by_id "
196
+ case metadata
176
197
177
198
static let postTags = " post_tag "
178
199
}
@@ -192,6 +213,10 @@ struct RemotePostCreateParametersWordPressComEncoder: Encodable {
192
213
try container. encodeIfPresent ( parameters. excerpt, forKey: . excerpt)
193
214
try container. encodeIfPresent ( parameters. slug, forKey: . slug)
194
215
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
+ }
195
220
196
221
// Pages
197
222
if let parentPageID = parameters. parentPageID {
@@ -210,6 +235,50 @@ struct RemotePostCreateParametersWordPressComEncoder: Encodable {
210
235
try container. encode ( parameters. isSticky, forKey: . isSticky)
211
236
}
212
237
}
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
+ }
213
282
}
214
283
215
284
struct RemotePostUpdateParametersWordPressComEncoder : Encodable {
@@ -229,12 +298,16 @@ struct RemotePostUpdateParametersWordPressComEncoder: Encodable {
229
298
try container. encodeIfPresent ( parameters. slug, forKey: . slug)
230
299
if let value = parameters. featuredImageID {
231
300
if let featuredImageID = value {
232
- try container. encode ( parameters . featuredImageID, forKey: . featuredImageID)
301
+ try container. encode ( featuredImageID, forKey: . featuredImageID)
233
302
} else {
234
303
// Passing `null` doesn't work.
235
304
try container. encode ( " " , forKey: . featuredImageID)
236
305
}
237
306
}
307
+ if let metadata = parameters. metadata, !metadata. isEmpty {
308
+ let metadata = metadata. map ( RemotePostUpdateParametersWordPressComMetadata . init)
309
+ try container. encode ( metadata, forKey: . metadata)
310
+ }
238
311
239
312
// Pages
240
313
if let parentPageID = parameters. parentPageID {
@@ -270,6 +343,7 @@ private enum RemotePostXMLRPCCodingKeys: String, CodingKey {
270
343
case format = " wp_post_format "
271
344
case isSticky = " sticky "
272
345
case categoryIDs = " categories "
346
+ case metadata = " custom_fields "
273
347
274
348
static let postTags = " post_tag "
275
349
}
@@ -289,6 +363,10 @@ struct RemotePostCreateParametersXMLRPCEncoder: Encodable {
289
363
try container. encodeIfPresent ( parameters. excerpt, forKey: . excerpt)
290
364
try container. encodeIfPresent ( parameters. slug, forKey: . slug)
291
365
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
+ }
292
370
293
371
// Pages
294
372
if let parentPageID = parameters. parentPageID {
@@ -325,12 +403,16 @@ struct RemotePostUpdateParametersXMLRPCEncoder: Encodable {
325
403
try container. encodeIfPresent ( parameters. slug, forKey: . slug)
326
404
if let value = parameters. featuredImageID {
327
405
if let featuredImageID = value {
328
- try container. encode ( parameters . featuredImageID, forKey: . featuredImageID)
406
+ try container. encode ( featuredImageID, forKey: . featuredImageID)
329
407
} else {
330
408
// Passing `null` doesn't work.
331
409
try container. encode ( " " , forKey: . featuredImageID)
332
410
}
333
411
}
412
+ if let metadata = parameters. metadata, !metadata. isEmpty {
413
+ let metadata = metadata. map ( RemotePostUpdateParametersXMLRPCMetadata . init)
414
+ try container. encode ( metadata, forKey: . metadata)
415
+ }
334
416
335
417
// Pages
336
418
if let parentPageID = parameters. parentPageID {
@@ -346,3 +428,15 @@ struct RemotePostUpdateParametersXMLRPCEncoder: Encodable {
346
428
try container. encodeIfPresent ( parameters. isSticky, forKey: . isSticky)
347
429
}
348
430
}
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