Skip to content

Commit 2458bb0

Browse files
committed
Extract ProductInputTransformer to its own type
1 parent 316bb7e commit 2458bb0

File tree

3 files changed

+80
-74
lines changed

3 files changed

+80
-74
lines changed

WooCommerce/Classes/ViewRelated/Orders/Order Creation/Synchronizer/LocalOrderSynchronizer.swift

Lines changed: 0 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -90,77 +90,3 @@ private extension LocalOrderSynchronizer {
9090
// TODO: Bind fees input
9191
}
9292
}
93-
94-
/// Helper to updates an `order` given an `OrderSyncInput` type.
95-
///
96-
private struct ProductInputTransformer {
97-
/// Type to help bundling order Items parameters.
98-
///
99-
struct OrderItemParameters {
100-
let quantity: Decimal
101-
let price: Decimal
102-
let productID: Int64
103-
let variationID: Int64?
104-
var subtotal: String {
105-
"\(price * quantity)"
106-
}
107-
}
108-
109-
/// Adds, deletes, or updates order items based on the given product input.
110-
///
111-
static func update(input: OrderSyncProductInput, on order: Order) -> Order {
112-
// If the input's quantity is 0 or less, delete the item if possible.
113-
guard input.quantity > 0 else {
114-
return remove(input: input, from: order)
115-
}
116-
117-
// Add or update the order items with the new input.
118-
let newItem = createOrderItem(using: input)
119-
var items = order.items
120-
if let itemIndex = order.items.firstIndex(where: { $0.itemID == newItem.itemID }) {
121-
items[itemIndex] = newItem
122-
} else {
123-
items.append(newItem)
124-
}
125-
126-
return order.copy(items: items)
127-
}
128-
129-
/// Removes an order item from an order when the `item.itemID` matches the `input.id`.
130-
///
131-
private static func remove(input: OrderSyncProductInput, from order: Order) -> Order {
132-
var items = order.items
133-
items.removeAll { $0.itemID == input.id }
134-
return order.copy(items: items)
135-
}
136-
137-
/// Creates and order item by using the `input.id` as the `item.itemID`.
138-
///
139-
private static func createOrderItem(using input: OrderSyncProductInput) -> OrderItem {
140-
let parameters: OrderItemParameters = {
141-
switch input.product {
142-
case .product(let product):
143-
let price = Decimal(string: product.price) ?? .zero
144-
return OrderItemParameters(quantity: input.quantity, price: price, productID: product.productID, variationID: nil)
145-
case .variation(let variation):
146-
let price = Decimal(string: variation.price) ?? .zero
147-
return OrderItemParameters(quantity: input.quantity, price: price, productID: variation.productID, variationID: variation.productVariationID)
148-
}
149-
}()
150-
151-
return OrderItem(itemID: input.id,
152-
name: "",
153-
productID: parameters.productID,
154-
variationID: parameters.variationID ?? 0,
155-
quantity: parameters.quantity,
156-
price: parameters.price as NSDecimalNumber,
157-
sku: nil,
158-
subtotal: parameters.subtotal,
159-
subtotalTax: "",
160-
taxClass: "",
161-
taxes: [],
162-
total: "",
163-
totalTax: "",
164-
attributes: [])
165-
}
166-
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import Foundation
2+
import Yosemite
3+
4+
/// Helper to updates an `order` given an `OrderSyncInput` type.
5+
///
6+
struct ProductInputTransformer {
7+
/// Type to help bundling order Items parameters.
8+
///
9+
struct OrderItemParameters {
10+
let quantity: Decimal
11+
let price: Decimal
12+
let productID: Int64
13+
let variationID: Int64?
14+
var subtotal: String {
15+
"\(price * quantity)"
16+
}
17+
}
18+
19+
/// Adds, deletes, or updates order items based on the given product input.
20+
///
21+
static func update(input: OrderSyncProductInput, on order: Order) -> Order {
22+
// If the input's quantity is 0 or less, delete the item if possible.
23+
guard input.quantity > 0 else {
24+
return remove(input: input, from: order)
25+
}
26+
27+
// Add or update the order items with the new input.
28+
let newItem = createOrderItem(using: input)
29+
var items = order.items
30+
if let itemIndex = order.items.firstIndex(where: { $0.itemID == newItem.itemID }) {
31+
items[itemIndex] = newItem
32+
} else {
33+
items.append(newItem)
34+
}
35+
36+
return order.copy(items: items)
37+
}
38+
39+
/// Removes an order item from an order when the `item.itemID` matches the `input.id`.
40+
///
41+
private static func remove(input: OrderSyncProductInput, from order: Order) -> Order {
42+
var items = order.items
43+
items.removeAll { $0.itemID == input.id }
44+
return order.copy(items: items)
45+
}
46+
47+
/// Creates and order item by using the `input.id` as the `item.itemID`.
48+
///
49+
private static func createOrderItem(using input: OrderSyncProductInput) -> OrderItem {
50+
let parameters: OrderItemParameters = {
51+
switch input.product {
52+
case .product(let product):
53+
let price = Decimal(string: product.price) ?? .zero
54+
return OrderItemParameters(quantity: input.quantity, price: price, productID: product.productID, variationID: nil)
55+
case .variation(let variation):
56+
let price = Decimal(string: variation.price) ?? .zero
57+
return OrderItemParameters(quantity: input.quantity, price: price, productID: variation.productID, variationID: variation.productVariationID)
58+
}
59+
}()
60+
61+
return OrderItem(itemID: input.id,
62+
name: "",
63+
productID: parameters.productID,
64+
variationID: parameters.variationID ?? 0,
65+
quantity: parameters.quantity,
66+
price: parameters.price as NSDecimalNumber,
67+
sku: nil,
68+
subtotal: parameters.subtotal,
69+
subtotalTax: "",
70+
taxClass: "",
71+
taxes: [],
72+
total: "",
73+
totalTax: "",
74+
attributes: [])
75+
}
76+
}

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@
422422
2602A63D27BD3C8C00B347F1 /* RemoteOrderSynchronizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2602A63C27BD3C8C00B347F1 /* RemoteOrderSynchronizer.swift */; };
423423
2602A63F27BD880A00B347F1 /* NewOrderInitialStatusResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2602A63E27BD880A00B347F1 /* NewOrderInitialStatusResolver.swift */; };
424424
2602A64227BD89CE00B347F1 /* NewOrderInitialStatusResolverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2602A64127BD89CE00B347F1 /* NewOrderInitialStatusResolverTests.swift */; };
425+
2602A64627BDBEBA00B347F1 /* ProductInputTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2602A64527BDBEBA00B347F1 /* ProductInputTransformer.swift */; };
425426
260C315E2523CC4000157BC2 /* RefundProductsTotalViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260C315D2523CC4000157BC2 /* RefundProductsTotalViewModel.swift */; };
426427
260C31602524ECA900157BC2 /* IssueRefundViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260C315F2524ECA900157BC2 /* IssueRefundViewController.swift */; };
427428
260C31622524EEB200157BC2 /* IssueRefundViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 260C31612524EEB200157BC2 /* IssueRefundViewController.xib */; };
@@ -2062,6 +2063,7 @@
20622063
2602A63C27BD3C8C00B347F1 /* RemoteOrderSynchronizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteOrderSynchronizer.swift; sourceTree = "<group>"; };
20632064
2602A63E27BD880A00B347F1 /* NewOrderInitialStatusResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewOrderInitialStatusResolver.swift; sourceTree = "<group>"; };
20642065
2602A64127BD89CE00B347F1 /* NewOrderInitialStatusResolverTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewOrderInitialStatusResolverTests.swift; sourceTree = "<group>"; };
2066+
2602A64527BDBEBA00B347F1 /* ProductInputTransformer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductInputTransformer.swift; sourceTree = "<group>"; };
20652067
260C315D2523CC4000157BC2 /* RefundProductsTotalViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefundProductsTotalViewModel.swift; sourceTree = "<group>"; };
20662068
260C315F2524ECA900157BC2 /* IssueRefundViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IssueRefundViewController.swift; sourceTree = "<group>"; };
20672069
260C31612524EEB200157BC2 /* IssueRefundViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = IssueRefundViewController.xib; sourceTree = "<group>"; };
@@ -4539,6 +4541,7 @@
45394541
26C6439427B9A1B300DD00D1 /* LocalOrderSynchronizer.swift */,
45404542
2602A63C27BD3C8C00B347F1 /* RemoteOrderSynchronizer.swift */,
45414543
2602A63E27BD880A00B347F1 /* NewOrderInitialStatusResolver.swift */,
4544+
2602A64527BDBEBA00B347F1 /* ProductInputTransformer.swift */,
45424545
);
45434546
path = Synchronizer;
45444547
sourceTree = "<group>";
@@ -8982,6 +8985,7 @@
89828985
021AEF9E2407F55C00029D28 /* PHAssetImageLoader.swift in Sources */,
89838986
DECE13FB27993F6500816ECD /* TitleAndSubtitleAndStatusTableViewCell.swift in Sources */,
89848987
26E0AE1926335AA900A5EB3B /* Survey.swift in Sources */,
8988+
2602A64627BDBEBA00B347F1 /* ProductInputTransformer.swift in Sources */,
89858989
AE77EA5027A47C99006A21BD /* View+AddingDividers.swift in Sources */,
89868990
0298430C259351F100979CAE /* ShippingLabelsTopBannerFactory.swift in Sources */,
89878991
020BE74D23B1F5EB007FE54C /* TitleAndTextFieldTableViewCell.swift in Sources */,

0 commit comments

Comments
 (0)