Skip to content

Commit baacf11

Browse files
committed
updated payload reflecting only new messages
1 parent 056c11a commit baacf11

12 files changed

+92
-21
lines changed

swift-sdk/Constants.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ enum Const {
5656
static let deviceId = "itbl_device_id"
5757
static let sdkVersion = "itbl_sdk_version"
5858
static let offlineMode = "itbl_offline_mode"
59+
static let embeddedCurrentMessageIds = "itbl_embedded_current_messageIds"
5960

6061
static let attributionInfoExpiration = 24
6162
}
@@ -220,6 +221,7 @@ enum JsonKey {
220221
enum Embedded {
221222
static let packageName = "packageName"
222223
static let sdkVersion = "SDKVersion"
224+
static let currentMessageIds = "currentMessageIds"
223225
}
224226

225227
enum Header {

swift-sdk/Internal/ApiClient.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,8 @@ extension ApiClient: ApiClientProtocol {
219219

220220
// MARK: - Embedded Messaging
221221

222-
func getEmbeddedMessages() -> Pending<PlacementsPayload, SendRequestError> {
223-
let result = createRequestCreator().flatMap { $0.createGetEmbeddedMessagesRequest() }
222+
func getEmbeddedMessages(messages: [String]) -> Pending<PlacementsPayload, SendRequestError> {
223+
let result = createRequestCreator().flatMap { $0.createGetEmbeddedMessagesRequest(messages: messages)}
224224
return send(iterableRequestResult: result)
225225
}
226226

swift-sdk/Internal/ApiClientProtocol.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ protocol ApiClientProtocol: AnyObject {
4646

4747
func getRemoteConfiguration() -> Pending<RemoteConfiguration, SendRequestError>
4848

49-
func getEmbeddedMessages() -> Pending<PlacementsPayload, SendRequestError>
49+
func getEmbeddedMessages(messages: [String]) -> Pending<PlacementsPayload, SendRequestError>
5050

5151
@discardableResult func track(embeddedMessageReceived message: IterableEmbeddedMessage) -> Pending<SendRequestValue, SendRequestError>
5252

swift-sdk/Internal/DependencyContainerProtocol.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ extension DependencyContainerProtocol {
6262
urlDelegate: config.urlDelegate,
6363
customActionDelegate: config.customActionDelegate,
6464
urlOpener: urlOpener,
65-
allowedProtocols: config.allowedProtocols)
65+
allowedProtocols: config.allowedProtocols,
66+
localStorage: localStorage)
6667
}
6768

6869
func createRequestHandler(apiKey: String,

swift-sdk/Internal/IterableEmbeddedManager.swift

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,16 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
3333
urlDelegate: IterableURLDelegate?,
3434
customActionDelegate: IterableCustomActionDelegate?,
3535
urlOpener: UrlOpenerProtocol,
36-
allowedProtocols: [String]) {
36+
allowedProtocols: [String],
37+
localStorage: LocalStorageProtocol) {
3738
ITBInfo()
3839

3940
self.apiClient = apiClient
4041
self.urlDelegate = urlDelegate
4142
self.customActionDelegate = customActionDelegate
4243
self.urlOpener = urlOpener
4344
self.allowedProtocols = allowedProtocols
45+
self.localStorage = localStorage
4446

4547
super.init()
4648
addForegroundObservers()
@@ -170,6 +172,7 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
170172
let processor = EmbeddedMessagingProcessor(currentMessages: self.messages, fetchedMessages: [:])
171173
self.setMessages(processor)
172174
self.notifyUpdateDelegates(processor)
175+
self.localStorage.embeddedCurrentMessageIds = []
173176
}
174177

175178
private func handleIterableCustomAction(name: String, forMessage message: IterableEmbeddedMessage) {
@@ -219,6 +222,7 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
219222
private var messages: [Int: [IterableEmbeddedMessage]] = [:]
220223
private var listeners: NSHashTable<IterableEmbeddedUpdateDelegate> = NSHashTable(options: [.weakMemory])
221224
private var trackedMessageIds: Set<String> = Set()
225+
private var localStorage: LocalStorageProtocol
222226

223227
private func addForegroundObservers() {
224228
NotificationCenter.default.addObserver(self,
@@ -239,16 +243,26 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
239243
}
240244

241245
private func retrieveEmbeddedMessages(completion: @escaping () -> Void) {
242-
apiClient.getEmbeddedMessages()
246+
apiClient.getEmbeddedMessages(messages: localStorage.embeddedCurrentMessageIds)
243247
.onCompletion(
244248
receiveValue: { embeddedMessagesPayload in
245249
let placements = embeddedMessagesPayload.placements
246-
250+
var embeddedCurrentMessageIds: [String] = []
247251
var fetchedMessagesDict: [Int: [IterableEmbeddedMessage]] = [:]
248252
for placement in placements {
249253
fetchedMessagesDict[placement.placementId!] = placement.embeddedMessages
250254
}
251255

256+
for placement in placements {
257+
if let placementId = placement.placementId {
258+
fetchedMessagesDict[placementId] = placement.embeddedMessages
259+
for embeddedMessage in placement.embeddedMessages {
260+
embeddedCurrentMessageIds.append(embeddedMessage.metadata.messageId)
261+
}
262+
}
263+
}
264+
265+
self.localStorage.embeddedCurrentMessageIds = embeddedCurrentMessageIds
252266
let processor = EmbeddedMessagingProcessor(currentMessages: self.messages,
253267
fetchedMessages: fetchedMessagesDict)
254268

swift-sdk/Internal/IterableUserDefaults.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ class IterableUserDefaults {
7070
}
7171
}
7272

73+
var embeddedCurrentMessageIds: [String]? {
74+
get {
75+
return userDefaults.stringArray(forKey: UserDefaultsKey.embeddedCurrentMessageIds.value)
76+
} set {
77+
save(strings: newValue, withKey: .embeddedCurrentMessageIds)
78+
}
79+
}
80+
7381
func getAttributionInfo(currentDate: Date) -> IterableAttributionInfo? {
7482
(try? codable(withKey: .attributionInfo, currentDate: currentDate)) ?? nil
7583
}
@@ -167,6 +175,10 @@ class IterableUserDefaults {
167175
userDefaults.set(string, forKey: key.value)
168176
}
169177

178+
private func save(strings: [String]?, withKey key: UserDefaultsKey) {
179+
userDefaults.set(strings, forKey: key.value)
180+
}
181+
170182
private func save(bool: Bool, withKey key: UserDefaultsKey) {
171183
userDefaults.set(bool, forKey: key.value)
172184
}
@@ -196,6 +208,7 @@ class IterableUserDefaults {
196208
static let deviceId = UserDefaultsKey(value: Const.UserDefault.deviceId)
197209
static let sdkVersion = UserDefaultsKey(value: Const.UserDefault.sdkVersion)
198210
static let offlineMode = UserDefaultsKey(value: Const.UserDefault.offlineMode)
211+
static let embeddedCurrentMessageIds = UserDefaultsKey(value: Const.UserDefault.embeddedCurrentMessageIds)
199212
}
200213

201214
private struct Envelope: Codable {

swift-sdk/Internal/LocalStorage.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,12 @@ struct LocalStorage: LocalStorageProtocol {
120120
ITBInfo("UPDATED: migrated authToken from UserDefaults to IterableKeychain")
121121
}
122122
}
123+
124+
var embeddedCurrentMessageIds: [String] {
125+
get {
126+
iterableUserDefaults.embeddedCurrentMessageIds ?? []
127+
} set {
128+
iterableUserDefaults.embeddedCurrentMessageIds = newValue
129+
}
130+
}
123131
}

swift-sdk/Internal/LocalStorageProtocol.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ protocol LocalStorageProtocol {
2424
func save(attributionInfo: IterableAttributionInfo?, withExpiration expiration: Date?)
2525

2626
func upgrade()
27+
28+
var embeddedCurrentMessageIds: [String] { get set }
2729
}
2830

2931
extension LocalStorageProtocol {

swift-sdk/Internal/RequestCreator.swift

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ struct RequestCreator {
422422

423423
// MARK: - Embedded Messaging Request Calls
424424

425-
func createGetEmbeddedMessagesRequest() -> Result<IterableRequest, IterableError> {
425+
func createGetEmbeddedMessagesRequest(messages: [String]?) -> Result<IterableRequest, IterableError> {
426426
if case .none = auth.emailOrUserId {
427427
ITBError(Self.authMissingMessage)
428428
return .failure(IterableError.general(description: Self.authMissingMessage))
@@ -438,7 +438,18 @@ struct RequestCreator {
438438

439439
setCurrentUser(inDict: &args)
440440

441-
return .success(.get(createGetRequest(forPath: Const.Path.getEmbeddedMessages, withArgs: args as! [String: String])))
441+
var urlComponents = URLComponents(string: Const.Path.getEmbeddedMessages)
442+
let messagesArray = messages ?? []
443+
let allQueryItems = args.map { URLQueryItem(name: "\($0.key)", value: "\($0.value)") }
444+
let messagesQueryItems = messagesArray.map { URLQueryItem(name: JsonKey.Embedded.currentMessageIds, value: $0) }
445+
446+
urlComponents?.queryItems = allQueryItems + messagesQueryItems
447+
448+
guard let urlString = urlComponents?.url?.absoluteString else {
449+
return .failure(IterableError.general(description: "Failed to create URL"))
450+
}
451+
452+
return .success(.get(createGetRequest(forPath: urlString, withArgs: args as! [String: String])))
442453
}
443454

444455
func createEmbeddedMessageReceivedRequest(_ message: IterableEmbeddedMessage) -> Result<IterableRequest, IterableError> {

tests/common/MockLocalStorage.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import Foundation
77
@testable import IterableSDK
88

99
class MockLocalStorage: LocalStorageProtocol {
10+
var embeddedCurrentMessageIds: [String] = []
11+
1012
var userId: String? = nil
1113

1214
var email: String? = nil

0 commit comments

Comments
 (0)