Skip to content

Commit fd14234

Browse files
committed
Merge branch 'develop' into issue/4599-new-package-details-package-selection
2 parents af7996b + bf3c15a commit fd14234

File tree

65 files changed

+2051
-384
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+2051
-384
lines changed

Fakes/Fakes/Fakes.generated.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,6 +1179,7 @@ extension ShippingLabelPredefinedOption {
11791179
public static func fake() -> ShippingLabelPredefinedOption {
11801180
.init(
11811181
title: .fake(),
1182+
providerID: .fake(),
11821183
predefinedPackages: .fake()
11831184
)
11841185
}

Gemfile.lock

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ GEM
1414
json (>= 1.5.1)
1515
artifactory (3.0.15)
1616
atomos (0.1.3)
17-
aws-eventstream (1.1.1)
18-
aws-partitions (1.484.0)
19-
aws-sdk-core (3.119.0)
17+
aws-eventstream (1.2.0)
18+
aws-partitions (1.496.0)
19+
aws-sdk-core (3.121.0)
2020
aws-eventstream (~> 1, >= 1.0.2)
2121
aws-partitions (~> 1, >= 1.239.0)
2222
aws-sigv4 (~> 1.1)
2323
jmespath (~> 1.0)
24-
aws-sdk-kms (1.46.0)
25-
aws-sdk-core (~> 3, >= 3.119.0)
24+
aws-sdk-kms (1.48.0)
25+
aws-sdk-core (~> 3, >= 3.120.0)
2626
aws-sigv4 (~> 1.1)
27-
aws-sdk-s3 (1.98.0)
28-
aws-sdk-core (~> 3, >= 3.119.0)
27+
aws-sdk-s3 (1.102.0)
28+
aws-sdk-core (~> 3, >= 3.120.0)
2929
aws-sdk-kms (~> 1)
30-
aws-sigv4 (~> 1.1)
31-
aws-sigv4 (1.2.4)
30+
aws-sigv4 (~> 1.4)
31+
aws-sigv4 (1.4.0)
3232
aws-eventstream (~> 1, >= 1.0.2)
3333
babosa (1.0.4)
3434
bigdecimal (1.4.4)
@@ -89,7 +89,7 @@ GEM
8989
ethon (0.14.0)
9090
ffi (>= 1.15.0)
9191
excon (0.85.0)
92-
faraday (1.7.0)
92+
faraday (1.7.1)
9393
faraday-em_http (~> 1.0)
9494
faraday-em_synchrony (~> 1.0)
9595
faraday-excon (~> 1.1)
@@ -113,8 +113,8 @@ GEM
113113
faraday-rack (1.0.0)
114114
faraday_middleware (1.1.0)
115115
faraday (~> 1.0)
116-
fastimage (2.2.4)
117-
fastlane (2.191.0)
116+
fastimage (2.2.5)
117+
fastlane (2.193.1)
118118
CFPropertyList (>= 2.3, < 4.0.0)
119119
addressable (>= 2.8, < 3.0.0)
120120
artifactory (~> 3.0)
@@ -140,6 +140,7 @@ GEM
140140
mini_magick (>= 4.9.4, < 5.0.0)
141141
multipart-post (~> 2.0.0)
142142
naturally (~> 2.2)
143+
optparse (~> 0.1.1)
143144
plist (>= 3.1.0, < 4.0.0)
144145
rubyzip (>= 2.0.0, < 3.0.0)
145146
security (= 0.1.3)
@@ -182,7 +183,7 @@ GEM
182183
gh_inspector (1.1.3)
183184
git (1.9.1)
184185
rchardet (~> 1.8)
185-
google-apis-androidpublisher_v3 (0.10.0)
186+
google-apis-androidpublisher_v3 (0.11.0)
186187
google-apis-core (>= 0.4, < 2.a)
187188
google-apis-core (0.4.1)
188189
addressable (~> 2.5, >= 2.5.1)
@@ -193,7 +194,7 @@ GEM
193194
retriable (>= 2.0, < 4.a)
194195
rexml
195196
webrick
196-
google-apis-iamcredentials_v1 (0.6.0)
197+
google-apis-iamcredentials_v1 (0.7.0)
197198
google-apis-core (>= 0.4, < 2.a)
198199
google-apis-playcustomapp_v1 (0.5.0)
199200
google-apis-core (>= 0.4, < 2.a)
@@ -213,13 +214,13 @@ GEM
213214
google-cloud-core (~> 1.6)
214215
googleauth (>= 0.16.2, < 2.a)
215216
mini_mime (~> 1.0)
216-
googleauth (0.17.0)
217+
googleauth (0.17.1)
217218
faraday (>= 0.17.3, < 2.0)
218219
jwt (>= 1.4, < 3.0)
219220
memoist (~> 0.16)
220221
multi_json (~> 1.11)
221222
os (>= 0.9, < 2.0)
222-
signet (~> 0.14)
223+
signet (~> 0.15)
223224
highline (2.0.3)
224225
http-cookie (1.0.4)
225226
domain_name (~> 0.5)
@@ -234,7 +235,7 @@ GEM
234235
jwt (2.2.3)
235236
memoist (0.16.2)
236237
mini_magick (4.11.0)
237-
mini_mime (1.1.0)
238+
mini_mime (1.1.1)
238239
minitest (5.14.4)
239240
molinillo (0.6.6)
240241
multi_json (1.15.0)
@@ -251,6 +252,7 @@ GEM
251252
oj (3.13.0)
252253
optimist (3.0.1)
253254
options (2.3.2)
255+
optparse (0.1.1)
254256
os (1.1.1)
255257
parallel (1.20.1)
256258
plist (3.6.0)
@@ -278,8 +280,8 @@ GEM
278280
addressable (>= 2.3.5)
279281
faraday (> 0.8, < 2.0)
280282
security (0.1.3)
281-
signet (0.15.0)
282-
addressable (~> 2.3)
283+
signet (0.16.0)
284+
addressable (~> 2.8)
283285
faraday (>= 0.17.3, < 2.0)
284286
jwt (>= 1.5, < 3.0)
285287
multi_json (~> 1.10)
@@ -344,4 +346,4 @@ DEPENDENCIES
344346
xcpretty-travis-formatter
345347

346348
BUNDLED WITH
347-
2.2.23
349+
2.2.25

Networking/Networking/Model/Copiable/Models+Copiable.generated.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,27 @@ extension ShippingLabelCustomsForm.Item {
10061006
}
10071007
}
10081008

1009+
extension ShippingLabelPackagesResponse {
1010+
public func copy(
1011+
storeOptions: CopiableProp<ShippingLabelStoreOptions> = .copy,
1012+
customPackages: CopiableProp<[ShippingLabelCustomPackage]> = .copy,
1013+
predefinedOptions: CopiableProp<[ShippingLabelPredefinedOption]> = .copy,
1014+
unactivatedPredefinedOptions: CopiableProp<[ShippingLabelPredefinedOption]> = .copy
1015+
) -> ShippingLabelPackagesResponse {
1016+
let storeOptions = storeOptions ?? self.storeOptions
1017+
let customPackages = customPackages ?? self.customPackages
1018+
let predefinedOptions = predefinedOptions ?? self.predefinedOptions
1019+
let unactivatedPredefinedOptions = unactivatedPredefinedOptions ?? self.unactivatedPredefinedOptions
1020+
1021+
return ShippingLabelPackagesResponse(
1022+
storeOptions: storeOptions,
1023+
customPackages: customPackages,
1024+
predefinedOptions: predefinedOptions,
1025+
unactivatedPredefinedOptions: unactivatedPredefinedOptions
1026+
)
1027+
}
1028+
}
1029+
10091030
extension ShippingLabelPaymentMethod {
10101031
public func copy(
10111032
paymentMethodID: CopiableProp<Int64> = .copy,

Networking/Networking/Model/ShippingLabel/Packages/Predefined package/ShippingLabelPredefinedOption.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@ public struct ShippingLabelPredefinedOption: Equatable, GeneratedFakeable {
88
/// The title of the predefined option. It works like an ID, and it is unique.
99
public let title: String
1010

11+
/// The ID of the predefined option (shipping provider), e.g. "usps". This is required for activating predefined packages remotely.
12+
public let providerID: String
13+
1114
/// List of predefined packages
1215
public let predefinedPackages: [ShippingLabelPredefinedPackage]
1316

1417

15-
public init(title: String, predefinedPackages: [ShippingLabelPredefinedPackage]) {
18+
public init(title: String, providerID: String, predefinedPackages: [ShippingLabelPredefinedPackage]) {
1619
self.title = title
20+
self.providerID = providerID
1721
self.predefinedPackages = predefinedPackages
1822
}
1923
}
@@ -25,12 +29,14 @@ extension ShippingLabelPredefinedOption: Decodable {
2529

2630
let title = try container.decode(String.self, forKey: .title)
2731
let predefinedPackages = try container.decodeIfPresent([ShippingLabelPredefinedPackage].self, forKey: .predefinedPackages) ?? []
32+
let providerID = try container.decodeIfPresent(String.self, forKey: .providerID) ?? ""
2833

29-
self.init(title: title, predefinedPackages: predefinedPackages)
34+
self.init(title: title, providerID: providerID, predefinedPackages: predefinedPackages)
3035
}
3136

3237
private enum CodingKeys: String, CodingKey {
3338
case title
3439
case predefinedPackages
40+
case providerID
3541
}
3642
}

Networking/Networking/Model/ShippingLabel/Packages/ShippingLabelPackagesResponse.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Codegen
33

44
/// Represents a list of Shipping Label Packages (custom and predefined).
55
///
6-
public struct ShippingLabelPackagesResponse: Equatable, GeneratedFakeable {
6+
public struct ShippingLabelPackagesResponse: Equatable, GeneratedFakeable, GeneratedCopiable {
77

88
/// The options of the store, like currency symbol and origin country.
99
public let storeOptions: ShippingLabelStoreOptions
@@ -67,15 +67,15 @@ extension ShippingLabelPackagesResponse: Decodable {
6767

6868
if !activatedPredefinedPackages.isEmpty {
6969
let titleOption: String = providerValueDict?["title"] as? String ?? ""
70-
let option = ShippingLabelPredefinedOption(title: titleOption, predefinedPackages: activatedPredefinedPackages)
70+
let option = ShippingLabelPredefinedOption(title: titleOption, providerID: key, predefinedPackages: activatedPredefinedPackages)
7171
predefinedOptions.append(option)
7272
}
7373

7474
let unactivatedPredefinedPackages = packages.filter({ !activatedPredefinedPackages.contains($0) })
7575

7676
if !unactivatedPredefinedPackages.isEmpty {
7777
let titleOption: String = providerValueDict?["title"] as? String ?? ""
78-
let option = ShippingLabelPredefinedOption(title: titleOption, predefinedPackages: unactivatedPredefinedPackages)
78+
let option = ShippingLabelPredefinedOption(title: titleOption, providerID: key, predefinedPackages: unactivatedPredefinedPackages)
7979
unactivatedPredefinedOptions.append(option)
8080
}
8181
})

Networking/Networking/Remote/ShippingLabelRemote.swift

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ public protocol ShippingLabelRemoteProtocol {
1717
func packagesDetails(siteID: Int64,
1818
completion: @escaping (Result<ShippingLabelPackagesResponse, Error>) -> Void)
1919
func createPackage(siteID: Int64,
20-
customPackage: ShippingLabelCustomPackage,
20+
customPackage: ShippingLabelCustomPackage?,
21+
predefinedOption: ShippingLabelPredefinedOption?,
2122
completion: @escaping (Result<Bool, Error>) -> Void)
2223
func loadCarriersAndRates(siteID: Int64,
2324
orderID: Int64,
@@ -130,18 +131,33 @@ public final class ShippingLabelRemote: Remote, ShippingLabelRemoteProtocol {
130131
enqueue(request, mapper: mapper, completion: completion)
131132
}
132133

133-
/// Creates a new custom package.
134+
/// Creates a new custom package or activates a service package.
134135
/// - Parameters:
135136
/// - siteID: Remote ID of the site that owns the shipping label.
136137
/// - customPackage: The custom package that should be created.
138+
/// - predefinedOption: The predefined option (shipping provider and service packages) to activate.
137139
/// - completion: Closure to be executed upon completion.
138140
public func createPackage(siteID: Int64,
139-
customPackage: ShippingLabelCustomPackage,
141+
customPackage: ShippingLabelCustomPackage?,
142+
predefinedOption: ShippingLabelPredefinedOption?,
140143
completion: @escaping (Result<Bool, Error>) -> Void) {
141144
do {
142-
let customPackageDictionary = try customPackage.toDictionary()
143-
let parameters = [
144-
ParameterKey.custom: [customPackageDictionary]
145+
var customPackageList: [[String: Any]] = []
146+
var predefinedOptionDictionary: [String: [String]] = [:]
147+
148+
if let customPackage = customPackage {
149+
let customPackageDictionary = try customPackage.toDictionary()
150+
customPackageList = [customPackageDictionary]
151+
} else if let predefinedOption = predefinedOption {
152+
let packageIDs = predefinedOption.predefinedPackages.map({ $0.id })
153+
predefinedOptionDictionary = [predefinedOption.providerID: packageIDs]
154+
} else {
155+
throw ShippingLabelError.missingPackage
156+
}
157+
158+
let parameters: [String: Any] = [
159+
ParameterKey.custom: customPackageList,
160+
ParameterKey.predefined: predefinedOptionDictionary
145161
]
146162
let path = Path.packages
147163
let request = JetpackRequest(wooApiVersion: .wcConnectV1, method: .post, siteID: siteID, path: path, parameters: parameters)
@@ -308,6 +324,7 @@ private extension ShippingLabelRemote {
308324
static let captionCSV = "caption_csv"
309325
static let json = "json"
310326
static let custom = "custom"
327+
static let predefined = "predefined"
311328
static let canCreatePaymentMethod = "can_create_payment_method"
312329
static let canCreateCustomsForm = "can_create_customs_form"
313330
static let canCreatePackage = "can_create_package"
@@ -320,3 +337,10 @@ private extension ShippingLabelRemote {
320337
static let async = "async"
321338
}
322339
}
340+
341+
// MARK: Errors {
342+
extension ShippingLabelRemote {
343+
enum ShippingLabelError: Error {
344+
case missingPackage
345+
}
346+
}

Networking/NetworkingTests/Mapper/ShippingLabelPackagesMapperTests.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,15 @@ private extension ShippingLabelPackagesMapperTests {
7272
isLetter: false,
7373
dimensions: "28.57 x 22.22 x 15.24")]
7474
let predefinedOption1 = ShippingLabelPredefinedOption(title: "USPS Priority Mail Flat Rate Boxes",
75+
providerID: "usps",
7576
predefinedPackages: predefinedPackages1)
7677

7778
let predefinedPackages2 = [ShippingLabelPredefinedPackage(id: "LargePaddedPouch",
7879
title: "Large Padded Pouch",
7980
isLetter: true,
8081
dimensions: "30.22 x 35.56 x 2.54")]
8182
let predefinedOption2 = ShippingLabelPredefinedOption(title: "DHL Express",
83+
providerID: "dhlexpress",
8284
predefinedPackages: predefinedPackages2)
8385

8486
return [predefinedOption1, predefinedOption2]
@@ -106,7 +108,8 @@ private extension ShippingLabelPackagesMapperTests {
106108
isLetter: false,
107109
dimensions: "44.45 x 31.75 x 7.62")]
108110
let predefinedOption = ShippingLabelPredefinedOption(title: "DHL Express",
109-
predefinedPackages: predefinedPackages)
111+
providerID: "dhlexpress",
112+
predefinedPackages: predefinedPackages)
110113

111114
return predefinedOption
112115
}

0 commit comments

Comments
 (0)