Skip to content

Commit d9927e9

Browse files
authored
Merge pull request #130 from woocommerce/feature/102-orders-yosemite-mark2
Yosemite Integration for Orders: Mark 2
2 parents 6a95134 + 159fa8c commit d9927e9

File tree

10 files changed

+410
-34
lines changed

10 files changed

+410
-34
lines changed

Networking/Networking/Model/Address.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public struct Address: Decodable {
1313
public let state: String
1414
public let postcode: String
1515
public let country: String
16+
public let phone: String?
17+
public let email: String?
1618
}
1719

1820

@@ -30,6 +32,8 @@ private extension Address {
3032
case state = "state"
3133
case postcode = "postcode"
3234
case country = "country"
35+
case phone = "phone"
36+
case email = "email"
3337
}
3438
}
3539

@@ -46,7 +50,9 @@ extension Address: Comparable {
4650
lhs.city == rhs.city &&
4751
lhs.state == rhs.state &&
4852
lhs.postcode == rhs.postcode &&
49-
lhs.country == rhs.country
53+
lhs.country == rhs.country &&
54+
lhs.phone == rhs.phone &&
55+
lhs.email == rhs.email
5056
}
5157

5258
public static func < (lhs: Address, rhs: Address) -> Bool {

Networking/Networking/Remote/OrdersRemote.swift

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,31 @@ public class OrdersRemote: Remote {
1212
/// - siteID: Site for which we'll fetch remote orders.
1313
/// - completion: Closure to be executed upon completion.
1414
///
15-
public func loadAllOrders(for siteID: Int, completion: @escaping ([Order]?, Error?) -> Void) {
16-
let path = "orders"
17-
let request = JetpackRequest(wooApiVersion: .mark2, method: .get, siteID: siteID, path: path)
15+
public func loadAllOrders(for siteID: Int, page: Int = 1, completion: @escaping ([Order]?, Error?) -> Void) {
16+
let path = Constants.ordersPath
17+
let parameters = [ParameterKeys.page: String(page),
18+
ParameterKeys.perPage: String(Constants.defaultPageSize)]
19+
let request = JetpackRequest(wooApiVersion: .mark2, method: .get, siteID: siteID, path: path, parameters: parameters)
1820
let mapper = OrderListMapper()
1921

2022
enqueue(request, mapper: mapper, completion: completion)
2123
}
2224

25+
/// Retrieves a specific `Order`
26+
///
27+
/// - Parameters:
28+
/// - siteID: Site for which we'll fetch remote orders.
29+
/// - orderID: Order for which we'll fetch remote orders.
30+
/// - completion: Closure to be executed upon completion.
31+
///
32+
public func loadOrder(for siteID: Int, orderID: Int, completion: @escaping (Order?, Error?) -> Void) {
33+
let path = "\(Constants.ordersPath)/\(orderID)"
34+
let request = JetpackRequest(wooApiVersion: .mark2, method: .get, siteID: siteID, path: path, parameters: nil)
35+
let mapper = OrderMapper()
36+
37+
enqueue(request, mapper: mapper, completion: completion)
38+
}
39+
2340
/// Updates the `OrderStatus` of a given Order.
2441
///
2542
/// - Parameters:
@@ -29,11 +46,27 @@ public class OrdersRemote: Remote {
2946
/// - completion: Closure to be executed upon completion.
3047
///
3148
public func updateOrder(from siteID: Int, orderID: Int, status: String, completion: @escaping (Order?, Error?) -> Void) {
32-
let path = "orders/" + String(orderID)
33-
let parameters = ["status": status]
49+
let path = "\(Constants.ordersPath)/" + String(orderID)
50+
let parameters = [ParameterKeys.status: status]
3451
let mapper = OrderMapper()
3552

3653
let request = JetpackRequest(wooApiVersion: .mark2, method: .post, siteID: siteID, path: path, parameters: parameters)
3754
enqueue(request, mapper: mapper, completion: completion)
3855
}
3956
}
57+
58+
59+
// MARK: - Constants!
60+
//
61+
private extension OrdersRemote {
62+
enum Constants {
63+
static let defaultPageSize: Int = 75
64+
static let ordersPath: String = "orders"
65+
}
66+
67+
enum ParameterKeys {
68+
static let status: String = "status"
69+
static let page: String = "page"
70+
static let perPage: String = "per_page"
71+
}
72+
}

Networking/NetworkingTests/Remote/OrdersRemoteTests.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,23 @@ class OrdersRemoteTests: XCTestCase {
4444
wait(for: [expectation], timeout: Constants.expectationTimeout)
4545
}
4646

47+
/// Verifies that loadOrder properly parses the `order` sample response.
48+
///
49+
func testLoadSingleOrderProperlyReturnsParsedOrder() {
50+
let remote = OrdersRemote(network: network)
51+
let expectation = self.expectation(description: "Load Order")
52+
53+
network.simulateResponse(requestUrlSuffix: "orders/\(sampleOrderID)", filename: "order")
54+
55+
remote.loadOrder(for: sampleSiteID, orderID: sampleOrderID) { order, error in
56+
XCTAssertNil(error)
57+
XCTAssertNotNil(order)
58+
expectation.fulfill()
59+
}
60+
61+
wait(for: [expectation], timeout: Constants.expectationTimeout)
62+
}
63+
4764
/// Verifies that loadAllOrders properly relays Networking Layer errors.
4865
///
4966
func testLoadAllOrdersProperlyRelaysNetwokingErrors() {

WooCommerce/Classes/Yosemite/AuthenticatedState.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ class AuthenticatedState: StoresManagerState {
3434
let network = AlamofireNetwork(credentials: credentials)
3535

3636
services = [
37-
AccountStore(dispatcher: dispatcher, storageManager: storageManager, network: network)
37+
AccountStore(dispatcher: dispatcher, storageManager: storageManager, network: network),
38+
OrderStore(dispatcher: dispatcher, storageManager: storageManager, network: network)
3839
]
3940

4041
self.credentials = credentials

Yosemite/Yosemite.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
/* Begin PBXBuildFile section */
1010
0E67B79585034C4DD75C8117 /* Pods_Yosemite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C25501C7F936D2FD32FAF3F4 /* Pods_Yosemite.framework */; };
1111
36941EA7B9242CAB1FF828BC /* Pods_YosemiteTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 991BBCE6E4A92F0A028885D8 /* Pods_YosemiteTests.framework */; };
12+
7424B49420EAD37C00CC62F6 /* order.json in Resources */ = {isa = PBXBuildFile; fileRef = 7424B49320EAD37C00CC62F6 /* order.json */; };
1213
74A7688C20D45EBA00F9D437 /* OrderStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A7688B20D45EBA00F9D437 /* OrderStore.swift */; };
1314
74A7688E20D45ED400F9D437 /* OrderStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A7688D20D45ED400F9D437 /* OrderStoreTests.swift */; };
1415
74A7689020D45F9300F9D437 /* OrderAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A7688F20D45F9300F9D437 /* OrderAction.swift */; };
@@ -47,6 +48,7 @@
4748
/* End PBXContainerItemProxy section */
4849

4950
/* Begin PBXFileReference section */
51+
7424B49320EAD37C00CC62F6 /* order.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = order.json; sourceTree = "<group>"; };
5052
745D21C120D8043A00BBE7C3 /* generic_error.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = generic_error.json; sourceTree = "<group>"; };
5153
74A7688B20D45EBA00F9D437 /* OrderStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderStore.swift; sourceTree = "<group>"; };
5254
74A7688D20D45ED400F9D437 /* OrderStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderStoreTests.swift; sourceTree = "<group>"; };
@@ -146,6 +148,7 @@
146148
children = (
147149
B5BC736A20D1AAE900B5B6FA /* me.json */,
148150
74A7689120D47F9E00F9D437 /* orders.json */,
151+
7424B49320EAD37C00CC62F6 /* order.json */,
149152
745D21C120D8043A00BBE7C3 /* generic_error.json */,
150153
);
151154
path = Resources;
@@ -379,6 +382,7 @@
379382
files = (
380383
74A7689220D47F9E00F9D437 /* orders.json in Resources */,
381384
B5BC736B20D1AAE900B5B6FA /* me.json in Resources */,
385+
7424B49420EAD37C00CC62F6 /* order.json in Resources */,
382386
);
383387
runOnlyForDeploymentPostprocessing = 0;
384388
};

Yosemite/Yosemite/Actions/OrderAction.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ import Networking
77
//
88
public enum OrderAction: Action {
99
case retrieveOrders(siteID: Int, onCompletion: ([Order]?, Error?) -> Void)
10+
case retrieveOrder(siteID: Int, orderID: Int, onCompletion: (Order?, Error?) -> Void)
1011
}

Yosemite/Yosemite/Stores/OrderStore.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class OrderStore: Store {
2323
switch action {
2424
case .retrieveOrders(let siteId, let onCompletion):
2525
retrieveOrders(siteId: siteId, onCompletion: onCompletion)
26+
case .retrieveOrder(let siteId, let orderId, let onCompletion):
27+
retrieveOrder(siteId: siteId, orderId: orderId, onCompletion: onCompletion)
2628
}
2729
}
2830
}
@@ -46,4 +48,19 @@ extension OrderStore {
4648
onCompletion(orders, nil)
4749
}
4850
}
51+
52+
/// Retrieves a specific order associated with a given Site ID (if any!).
53+
///
54+
func retrieveOrder(siteId: Int, orderId: Int, onCompletion: @escaping (Order?, Error?) -> Void) {
55+
let remote = OrdersRemote(network: network)
56+
57+
remote.loadOrder(for: siteId, orderID: orderId) { (order, error) in
58+
guard let order = order else {
59+
onCompletion(nil, error)
60+
return
61+
}
62+
63+
onCompletion(order, nil)
64+
}
65+
}
4966
}

0 commit comments

Comments
 (0)