Skip to content

Commit 28fbbf9

Browse files
authored
Merge pull request #486 from Iterable/MOB-725-updatecart-part1
[MOB-725] updateCart (part 1)
2 parents e70c72a + 7395eea commit 28fbbf9

12 files changed

+161
-22
lines changed

swift-sdk/Constants.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ enum Const {
2222
}
2323

2424
enum Path {
25+
static let updateCart = "commerce/updateCart"
2526
static let trackPurchase = "commerce/trackPurchase"
2627
static let disableDevice = "users/disableDevice"
2728
static let getInAppMessages = "inApp/getMessages"

swift-sdk/Internal/ApiClient.swift

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class ApiClient {
3131
guard let authProvider = authProvider else {
3232
return nil
3333
}
34+
3435
let currentDate = dateProvider.currentDate
3536
let apiCallRequest = IterableAPICallRequest(apiKey: apiKey,
3637
endPoint: endPoint,
@@ -48,7 +49,7 @@ class ApiClient {
4849
return SendRequestError.createErroredFuture(reason: iterableError.localizedDescription)
4950
}
5051
}
51-
52+
5253
func send<T>(iterableRequestResult result: Result<IterableRequest, IterableError>) -> Future<T, SendRequestError> where T: Decodable {
5354
switch result {
5455
case let .success(iterableRequest):
@@ -57,7 +58,7 @@ class ApiClient {
5758
return SendRequestError.createErroredFuture(reason: iterableError.localizedDescription)
5859
}
5960
}
60-
61+
6162
func send(iterableRequest: IterableRequest) -> Future<SendRequestValue, SendRequestError> {
6263
guard let urlRequest = convertToURLRequest(iterableRequest: iterableRequest) else {
6364
return SendRequestError.createErroredFuture()
@@ -70,7 +71,7 @@ class ApiClient {
7071
guard let urlRequest = convertToURLRequest(iterableRequest: iterableRequest) else {
7172
return SendRequestError.createErroredFuture()
7273
}
73-
74+
7475
return RequestSender.sendRequest(urlRequest, usingSession: networkSession)
7576
}
7677

@@ -97,13 +98,13 @@ class ApiClient {
9798
extension ApiClient: ApiClientProtocol {
9899
func register(registerTokenInfo: RegisterTokenInfo, notificationsEnabled: Bool) -> Future<SendRequestValue, SendRequestError> {
99100
let result = createRequestCreator().flatMap { $0.createRegisterTokenRequest(registerTokenInfo: registerTokenInfo,
100-
notificationsEnabled: notificationsEnabled) }
101+
notificationsEnabled: notificationsEnabled) }
101102
return send(iterableRequestResult: result)
102103
}
103104

104105
func updateUser(_ dataFields: [AnyHashable: Any], mergeNestedObjects: Bool) -> Future<SendRequestValue, SendRequestError> {
105106
let result = createRequestCreator().flatMap { $0.createUpdateUserRequest(dataFields: dataFields,
106-
mergeNestedObjects: mergeNestedObjects) }
107+
mergeNestedObjects: mergeNestedObjects) }
107108
return send(iterableRequestResult: result)
108109
}
109110

@@ -119,28 +120,36 @@ extension ApiClient: ApiClientProtocol {
119120

120121
func disableDevice(forAllUsers allUsers: Bool, hexToken: String) -> Future<SendRequestValue, SendRequestError> {
121122
let result = createRequestCreator().flatMap { $0.createDisableDeviceRequest(forAllUsers: allUsers,
122-
hexToken: hexToken) }
123+
hexToken: hexToken) }
124+
return send(iterableRequestResult: result)
125+
}
126+
127+
func updateCart(items: [CommerceItem], dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError> {
128+
let result = createRequestCreator().flatMap { $0.createUpdateCartRequest(items: items,
129+
dataFields: dataFields) }
130+
123131
return send(iterableRequestResult: result)
124132
}
125133

126134
func track(purchase total: NSNumber, items: [CommerceItem], dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError> {
127-
let result = createRequestCreator().flatMap { $0.createTrackPurchaseRequest(total, items: items,
128-
dataFields: dataFields) }
135+
let result = createRequestCreator().flatMap { $0.createTrackPurchaseRequest(total,
136+
items: items,
137+
dataFields: dataFields) }
129138
return send(iterableRequestResult: result)
130139
}
131140

132141
func track(pushOpen campaignId: NSNumber, templateId: NSNumber?, messageId: String, appAlreadyRunning: Bool, dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError> {
133142
let result = createRequestCreator().flatMap { $0.createTrackPushOpenRequest(campaignId,
134-
templateId: templateId,
135-
messageId: messageId,
136-
appAlreadyRunning: appAlreadyRunning,
137-
dataFields: dataFields) }
143+
templateId: templateId,
144+
messageId: messageId,
145+
appAlreadyRunning: appAlreadyRunning,
146+
dataFields: dataFields) }
138147
return send(iterableRequestResult: result)
139148
}
140149

141150
func track(event eventName: String, dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError> {
142151
let result = createRequestCreator().flatMap { $0.createTrackEventRequest(eventName,
143-
dataFields: dataFields) }
152+
dataFields: dataFields) }
144153
return send(iterableRequestResult: result)
145154
}
146155

@@ -151,11 +160,11 @@ extension ApiClient: ApiClientProtocol {
151160
campaignId: NSNumber? = nil,
152161
templateId: NSNumber? = nil) -> Future<SendRequestValue, SendRequestError> {
153162
let result = createRequestCreator().flatMap { $0.createUpdateSubscriptionsRequest(emailListIds,
154-
unsubscribedChannelIds: unsubscribedChannelIds,
155-
unsubscribedMessageTypeIds: unsubscribedMessageTypeIds,
156-
subscribedMessageTypeIds: subscribedMessageTypeIds,
157-
campaignId: campaignId,
158-
templateId: templateId) }
163+
unsubscribedChannelIds: unsubscribedChannelIds,
164+
unsubscribedMessageTypeIds: unsubscribedMessageTypeIds,
165+
subscribedMessageTypeIds: subscribedMessageTypeIds,
166+
campaignId: campaignId,
167+
templateId: templateId) }
159168
return send(iterableRequestResult: result)
160169
}
161170

@@ -166,14 +175,14 @@ extension ApiClient: ApiClientProtocol {
166175

167176
func track(inAppClick inAppMessageContext: InAppMessageContext, clickedUrl: String) -> Future<SendRequestValue, SendRequestError> {
168177
let result = createRequestCreator().flatMap { $0.createTrackInAppClickRequest(inAppMessageContext: inAppMessageContext,
169-
clickedUrl: clickedUrl) }
178+
clickedUrl: clickedUrl) }
170179
return send(iterableRequestResult: result)
171180
}
172181

173182
func track(inAppClose inAppMessageContext: InAppMessageContext, source: InAppCloseSource?, clickedUrl: String?) -> Future<SendRequestValue, SendRequestError> {
174183
let result = createRequestCreator().flatMap { $0.createTrackInAppCloseRequest(inAppMessageContext: inAppMessageContext,
175-
source: source,
176-
clickedUrl: clickedUrl) }
184+
source: source,
185+
clickedUrl: clickedUrl) }
177186
return send(iterableRequestResult: result)
178187
}
179188

@@ -194,7 +203,7 @@ extension ApiClient: ApiClientProtocol {
194203

195204
func inAppConsume(inAppMessageContext: InAppMessageContext, source: InAppDeleteSource?) -> Future<SendRequestValue, SendRequestError> {
196205
let result = createRequestCreator().flatMap { $0.createTrackInAppConsumeRequest(inAppMessageContext: inAppMessageContext,
197-
source: source) }
206+
source: source) }
198207
return send(iterableRequestResult: result)
199208
}
200209

swift-sdk/Internal/ApiClientProtocol.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ protocol ApiClientProtocol: AnyObject {
1111

1212
func updateEmail(newEmail: String) -> Future<SendRequestValue, SendRequestError>
1313

14+
func updateCart(items: [CommerceItem], dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError>
15+
1416
func track(purchase total: NSNumber, items: [CommerceItem], dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError>
1517

1618
func track(pushOpen campaignId: NSNumber, templateId: NSNumber?, messageId: String, appAlreadyRunning: Bool, dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError>

swift-sdk/Internal/InternalIterableAPI.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,14 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
206206
}
207207
}
208208

209+
@discardableResult
210+
func updateCart(items: [CommerceItem],
211+
dataFields: [AnyHashable: Any]? = nil,
212+
onSuccess: OnSuccessHandler? = nil,
213+
onFailure: OnFailureHandler? = nil) -> Future<SendRequestValue, SendRequestError> {
214+
requestHandler.updateCart(items: items, dataFields: dataFields, onSuccess: onSuccess, onFailure: onFailure)
215+
}
216+
209217
@discardableResult
210218
func trackPurchase(_ total: NSNumber,
211219
items: [CommerceItem],

swift-sdk/Internal/LegacyRequestHandler.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ class LegacyRequestHandler: RequestHandlerProtocol {
7878
forResult: apiClient.updateEmail(newEmail: newEmail))
7979
}
8080

81+
@discardableResult
82+
func updateCart(items: [CommerceItem],
83+
dataFields: [AnyHashable: Any]?,
84+
onSuccess: OnSuccessHandler?,
85+
onFailure: OnFailureHandler?) -> Future<SendRequestValue, SendRequestError> {
86+
applyCallbacks(successHandler: onSuccess, andFailureHandler: onFailure, withIdentifier: "updateCart", forResult: apiClient.updateCart(items: items, dataFields: dataFields))
87+
}
88+
8189
@discardableResult
8290
func trackPurchase(_ total: NSNumber,
8391
items: [CommerceItem],

swift-sdk/Internal/OfflineRequestProcessor.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,21 @@ struct OfflineRequestProcessor: RequestProcessorProtocol {
3636
taskRunner.stop()
3737
}
3838

39+
@discardableResult
40+
func updateCart(items: [CommerceItem],
41+
dataFields: [AnyHashable: Any]?,
42+
onSuccess: OnSuccessHandler?,
43+
onFailure: OnFailureHandler?) -> Future<SendRequestValue, SendRequestError> {
44+
let requestGenerator = { (requestCreator: RequestCreator) in
45+
requestCreator.createUpdateCartRequest(items: items, dataFields: dataFields)
46+
}
47+
48+
return sendIterableRequest(requestGenerator: requestGenerator,
49+
successHandler: onSuccess,
50+
failureHandler: onFailure,
51+
identifier: #function)
52+
}
53+
3954
@discardableResult
4055
func trackPurchase(_ total: NSNumber,
4156
items: [CommerceItem],

swift-sdk/Internal/OnlineRequestProcessor.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,17 @@ struct OnlineRequestProcessor: RequestProcessorProtocol {
6868
forResult: apiClient.updateEmail(newEmail: newEmail))
6969
}
7070

71+
@discardableResult
72+
func updateCart(items: [CommerceItem],
73+
dataFields: [AnyHashable: Any]? = nil,
74+
onSuccess: OnSuccessHandler? = nil,
75+
onFailure: OnFailureHandler? = nil) -> Future<SendRequestValue, SendRequestError> {
76+
applyCallbacks(successHandler: onSuccess,
77+
andFailureHandler: onFailure,
78+
withIdentifier: "updateCart",
79+
forResult: apiClient.updateCart(items: items, dataFields: dataFields))
80+
}
81+
7182
@discardableResult
7283
func trackPurchase(_ total: NSNumber,
7384
items: [CommerceItem],

swift-sdk/Internal/RequestCreator.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,28 @@ struct RequestCreator {
8484
return .success(.post(createPostRequest(path: Const.Path.updateUser, body: body)))
8585
}
8686

87+
func createUpdateCartRequest(items: [CommerceItem], dataFields: [AnyHashable: Any]?) -> Result<IterableRequest, IterableError> {
88+
if case .none = auth.emailOrUserId {
89+
ITBError("Both email and userId are nil")
90+
return .failure(IterableError.general(description: "Both email and userId are nil"))
91+
}
92+
93+
var apiUserDict = [AnyHashable: Any]()
94+
95+
setCurrentUser(inDict: &apiUserDict)
96+
97+
let itemsToSerialize = items.map { $0.toDictionary() }
98+
99+
var body: [String: Any] = [JsonKey.Commerce.user: apiUserDict,
100+
JsonKey.Commerce.items: itemsToSerialize]
101+
102+
if let dataFields = dataFields {
103+
body[JsonKey.dataFields] = dataFields
104+
}
105+
106+
return .success(.post(createPostRequest(path: Const.Path.updateCart, body: body)))
107+
}
108+
87109
func createTrackPurchaseRequest(_ total: NSNumber, items: [CommerceItem], dataFields: [AnyHashable: Any]?) -> Result<IterableRequest, IterableError> {
88110
if case .none = auth.emailOrUserId {
89111
ITBError("Both email and userId are nil")

swift-sdk/Internal/RequestHandler.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,17 @@ class RequestHandler: RequestHandlerProtocol {
8787
onFailure: onFailure)
8888
}
8989

90+
@discardableResult
91+
func updateCart(items: [CommerceItem],
92+
dataFields: [AnyHashable: Any]?,
93+
onSuccess: OnSuccessHandler?,
94+
onFailure: OnFailureHandler?) -> Future<SendRequestValue, SendRequestError> {
95+
chooseRequestProcessor().updateCart(items: items,
96+
dataFields: dataFields,
97+
onSuccess: onSuccess,
98+
onFailure: onFailure)
99+
}
100+
90101
@discardableResult
91102
func trackPurchase(_ total: NSNumber,
92103
items: [CommerceItem],

swift-sdk/Internal/RequestHandlerProtocol.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ protocol RequestHandlerProtocol: AnyObject {
3939
onSuccess: OnSuccessHandler?,
4040
onFailure: OnFailureHandler?) -> Future<SendRequestValue, SendRequestError>
4141

42+
@discardableResult
43+
func updateCart(items: [CommerceItem],
44+
dataFields: [AnyHashable: Any]?,
45+
onSuccess: OnSuccessHandler?,
46+
onFailure: OnFailureHandler?) -> Future<SendRequestValue, SendRequestError>
47+
4248
@discardableResult
4349
func trackPurchase(_ total: NSNumber,
4450
items: [CommerceItem],

0 commit comments

Comments
 (0)