Skip to content

Commit 2558af9

Browse files
committed
Append the product ID to each media item's parent_id in the multipart form data upload.
1 parent 4a6a63d commit 2558af9

File tree

5 files changed

+29
-3
lines changed

5 files changed

+29
-3
lines changed

Networking/Networking/Network/Network.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ import Alamofire
44
/// Constructs `multipart/form-data` for uploads within an HTTP or HTTPS body.
55
///
66
public protocol MultipartFormData {
7+
/// Appends a file with file URL for a name to form data.
8+
///
79
func append(_ fileURL: URL, withName name: String, fileName: String, mimeType: String)
10+
11+
/// Appends data for a name to form data.
12+
///
13+
func append(_ data: Data, withName name: String)
814
}
915

1016
/// Defines all of the Network Operations we'll be performing. This allows us to swap the actual Wrapper in our

Networking/Networking/Remote/MediaRemote.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,25 @@ public class MediaRemote: Remote {
4040
///
4141
/// - Parameters:
4242
/// - siteID: Site for which we'll upload the media to.
43+
/// - productID: Product for which the media items are first added to.
4344
/// - context: Display or edit. Scope under which the request is made;
4445
/// determines fields present in response. Default is Display.
4546
/// - mediaItems: An array of uploadable media items.
4647
/// - completion: Closure to be executed upon completion.
4748
///
4849
public func uploadMedia(for siteID: Int64,
50+
productID: Int64,
4951
context: String? = Default.context,
5052
mediaItems: [UploadableMedia],
5153
completion: @escaping ([Media]?, Error?) -> Void) {
5254
let parameters = [
5355
ParameterKey.contextKey: context ?? Default.context,
5456
]
5557

58+
let formParameters: [String: String] = [Int](0..<mediaItems.count).reduce(into: [:]) { (parentIDsByKey, index) in
59+
parentIDsByKey["attrs[\(index)][parent_id]"] = "\(productID)"
60+
}
61+
5662
let path = "sites/\(siteID)/media/new"
5763
let request = DotcomRequest(wordpressApiVersion: .mark1_1,
5864
method: .post,
@@ -61,6 +67,10 @@ public class MediaRemote: Remote {
6167
let mapper = MediaListMapper()
6268

6369
enqueueMultipartFormDataUpload(request, mapper: mapper, multipartFormData: { multipartFormData in
70+
formParameters.forEach { (key, value) in
71+
multipartFormData.append(Data(value.utf8), withName: key)
72+
}
73+
6474
mediaItems.forEach { mediaItem in
6575
multipartFormData.append(mediaItem.localURL,
6676
withName: "media[]",

WooCommerce/Classes/ViewRelated/Products/Media/ProductImageActionHandler.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ final class ProductImageActionHandler {
99
typealias OnAssetUpload = (PHAsset, ProductImage) -> Void
1010

1111
private let siteID: Int64
12+
private let productID: Int64
1213

1314
var productImageStatuses: [ProductImageStatus] {
1415
return allStatuses.productImageStatuses
@@ -29,6 +30,7 @@ final class ProductImageActionHandler {
2930

3031
init(siteID: Int64, product: Product) {
3132
self.siteID = siteID
33+
self.productID = product.productID
3234
self.allStatuses = (productImageStatuses: product.imageStatuses, error: nil)
3335
}
3436

@@ -98,6 +100,7 @@ final class ProductImageActionHandler {
98100
allStatuses = (productImageStatuses: imageStatuses, error: nil)
99101

100102
let action = MediaAction.uploadMedia(siteID: siteID,
103+
productID: productID,
101104
mediaAsset: asset) { [weak self] (media, error) in
102105
guard let self = self else {
103106
return

Yosemite/Yosemite/Actions/MediaAction.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,8 @@ public enum MediaAction: Action {
1818

1919
/// Uploads an exportable media asset to the site's WP Media Library.
2020
///
21-
case uploadMedia(siteID: Int64, mediaAsset: ExportableAsset, onCompletion: (_ uploadedMedia: Media?, _ error: Error?) -> Void)
21+
case uploadMedia(siteID: Int64,
22+
productID: Int64,
23+
mediaAsset: ExportableAsset,
24+
onCompletion: (_ uploadedMedia: Media?, _ error: Error?) -> Void)
2225
}

Yosemite/Yosemite/Stores/MediaStore.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ public final class MediaStore: Store {
3636
switch action {
3737
case .retrieveMediaLibrary(let siteID, let pageNumber, let pageSize, let onCompletion):
3838
retrieveMediaLibrary(siteID: siteID, pageNumber: pageNumber, pageSize: pageSize, onCompletion: onCompletion)
39-
case .uploadMedia(let siteID, let mediaAsset, let onCompletion):
40-
uploadMedia(siteID: siteID, mediaAsset: mediaAsset, onCompletion: onCompletion)
39+
case .uploadMedia(let siteID, let productID, let mediaAsset, let onCompletion):
40+
uploadMedia(siteID: siteID, productID: productID, mediaAsset: mediaAsset, onCompletion: onCompletion)
4141
}
4242
}
4343
}
@@ -60,6 +60,7 @@ private extension MediaStore {
6060
/// 2) Uploads the exported media file to the server
6161
///
6262
func uploadMedia(siteID: Int64,
63+
productID: Int64,
6364
mediaAsset: ExportableAsset,
6465
onCompletion: @escaping (_ uploadedMedia: Media?, _ error: Error?) -> Void) {
6566
mediaExportService.export(mediaAsset,
@@ -69,16 +70,19 @@ private extension MediaStore {
6970
return
7071
}
7172
self?.uploadMedia(siteID: siteID,
73+
productID: productID,
7274
uploadableMedia: uploadableMedia,
7375
onCompletion: onCompletion)
7476
})
7577
}
7678

7779
func uploadMedia(siteID: Int64,
80+
productID: Int64,
7881
uploadableMedia media: UploadableMedia,
7982
onCompletion: @escaping (_ uploadedMedia: Media?, _ error: Error?) -> Void) {
8083
let remote = MediaRemote(network: network)
8184
remote.uploadMedia(for: siteID,
85+
productID: productID,
8286
mediaItems: [media]) { (uploadedMediaItems, error) in
8387
// Removes local media after the upload API request.
8488
do {

0 commit comments

Comments
 (0)