Skip to content

Commit d419c8e

Browse files
authored
Merge pull request #1464 from OneSignal/feat/no_more_external_id_based_requests
[Feat] Use only OneSignal ID for requests
2 parents 461c377 + bc9112c commit d419c8e

15 files changed

+133
-227
lines changed

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSUserExecutor.swift

Lines changed: 61 additions & 102 deletions
Large diffs are not rendered by default.

iOS_SDK/OneSignalSDK/OneSignalUser/Source/OSIdentityModel.swift

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,7 @@ import Foundation
2929
import OneSignalCore
3030
import OneSignalOSCore
3131

32-
// By matching the enum name to the raw value, it will always stringify correctly
33-
enum OSDefaultAlias: String {
34-
// swiftlint:disable identifier_name
35-
case onesignal_id = "onesignal_id"
36-
case external_id = "external_id"
37-
// swiftlint:enable identifier_name
38-
}
39-
4032
class OSIdentityModel: OSModel {
41-
/**
42-
Set either `onesignal_id` or `external_id`, representing the alias that will be used in requests.
43-
*/
44-
var primaryAliasLabel: OSDefaultAlias = .onesignal_id
45-
var primaryAliasId: String? {
46-
return if primaryAliasLabel == .external_id { externalId } else { onesignalId }
47-
}
48-
4933
var onesignalId: String? {
5034
return internalGetAlias(OS_ONESIGNAL_ID)
5135
}
@@ -73,7 +57,6 @@ class OSIdentityModel: OSModel {
7357
aliasesLock.withLock {
7458
super.encode(with: coder)
7559
coder.encode(aliases, forKey: "aliases")
76-
coder.encode(primaryAliasLabel.rawValue, forKey: "primaryAliasLabel") // Encodes as String
7760
}
7861
}
7962

@@ -83,12 +66,6 @@ class OSIdentityModel: OSModel {
8366
// log error
8467
return nil
8568
}
86-
if let rawType = coder.decodeObject(forKey: "primaryAliasLabel") as? String,
87-
let label = OSDefaultAlias(rawValue: rawType) {
88-
self.primaryAliasLabel = label
89-
} else {
90-
self.primaryAliasLabel = .onesignal_id
91-
}
9269
self.aliases = aliases
9370
}
9471

iOS_SDK/OneSignalSDK/OneSignalUser/Source/OneSignalUserManagerImpl.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,14 @@ public class OneSignalUserManagerImpl: NSObject, OneSignalUserManager {
354354
return self.identityModelStore.getModel(modelId: identityModel.modelId) != nil
355355
}
356356

357+
func isCurrentUser(_ externalId: String) -> Bool {
358+
guard !externalId.isEmpty else {
359+
OneSignalLog.onesignalLog(.LL_ERROR, message: "isCurrentUser called with empty externalId")
360+
return false
361+
}
362+
363+
return user.identityModel.externalId == externalId
364+
}
357365
/**
358366
Clears the existing user's data in preparation for hydration via a fetch user call.
359367
*/

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Requests/OSRequestAddAliases.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,9 @@ class OSRequestAddAliases: OneSignalRequest, OSUserRequest {
3939

4040
// requires a `onesignal_id` to send this request
4141
func prepareForExecution() -> Bool {
42-
let aliasLabel = identityModel.primaryAliasLabel
43-
if let aliasId = identityModel.primaryAliasId, let appId = OneSignalConfigManager.getAppId() {
42+
if let onesignalId = identityModel.onesignalId, let appId = OneSignalConfigManager.getAppId() {
4443
self.addJWTHeader(identityModel: identityModel)
45-
self.path = "apps/\(appId)/users/by/\(aliasLabel)/\(aliasId)/identity"
44+
self.path = "apps/\(appId)/users/by/\(OS_ONESIGNAL_ID)/\(onesignalId)/identity"
4645
return true
4746
} else {
4847
// self.path is non-nil, so set to empty string

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Requests/OSRequestCreateSubscription.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,9 @@ class OSRequestCreateSubscription: OneSignalRequest, OSUserRequest {
4444

4545
// Need the onesignal_id of the user
4646
func prepareForExecution() -> Bool {
47-
let aliasLabel = identityModel.primaryAliasLabel
48-
if let aliasId = identityModel.primaryAliasId, let appId = OneSignalConfigManager.getAppId() {
47+
if let onesignalId = identityModel.onesignalId, let appId = OneSignalConfigManager.getAppId() {
4948
self.addJWTHeader(identityModel: identityModel)
50-
self.path = "apps/\(appId)/users/by/\(aliasLabel)/\(aliasId)/subscriptions"
49+
self.path = "apps/\(appId)/users/by/\(OS_ONESIGNAL_ID)/\(onesignalId)/subscriptions"
5150
return true
5251
} else {
5352
self.path = "" // self.path is non-nil, so set to empty string

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Requests/OSRequestCreateUser.swift

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ import OneSignalCore
3030
/**
3131
This request will be made with the minimum information needed. The payload will contain an externalId or no identities.
3232
The push subscription may or may not have a token or suscriptionId already.
33-
There will be no properties sent.
33+
This request is used for typical User Create, which will include properties and the push subscription,
34+
or to hydrate OneSignal ID for a given External ID, which will only contain the Identity object in the payload.
3435
*/
3536
class OSRequestCreateUser: OneSignalRequest, OSUserRequest {
3637
var sentToClient = false
@@ -40,7 +41,7 @@ class OSRequestCreateUser: OneSignalRequest, OSUserRequest {
4041
}
4142

4243
var identityModel: OSIdentityModel
43-
var pushSubscriptionModel: OSSubscriptionModel
44+
var pushSubscriptionModel: OSSubscriptionModel?
4445
var originalPushToken: String?
4546

4647
func prepareForExecution() -> Bool {
@@ -55,8 +56,11 @@ class OSRequestCreateUser: OneSignalRequest, OSUserRequest {
5556
return true
5657
}
5758

58-
// When reading from the cache, update the push subscription model
59+
// When reading from the cache, update the push subscription model, if appropriate
5960
func updatePushSubscriptionModel(_ pushSubscriptionModel: OSSubscriptionModel) {
61+
guard self.pushSubscriptionModel != nil else {
62+
return
63+
}
6064
self.pushSubscriptionModel = pushSubscriptionModel
6165
self.parameters?["subscriptions"] = [pushSubscriptionModel.jsonRepresentation()]
6266
self.originalPushToken = pushSubscriptionModel.address
@@ -89,36 +93,43 @@ class OSRequestCreateUser: OneSignalRequest, OSUserRequest {
8993
self.method = POST
9094
}
9195

96+
init(aliasLabel: String, aliasId: String, identityModel: OSIdentityModel) {
97+
self.identityModel = identityModel
98+
self.stringDescription = "<OSRequestCreateUser with alias \(aliasLabel): \(aliasId)>"
99+
super.init()
100+
self.parameters = [
101+
"identity": [aliasLabel: aliasId],
102+
"refresh_device_metadata": true,
103+
]
104+
self.method = POST
105+
}
106+
92107
func encode(with coder: NSCoder) {
93108
coder.encode(identityModel, forKey: "identityModel")
94109
coder.encode(pushSubscriptionModel, forKey: "pushSubscriptionModel")
95110
coder.encode(originalPushToken, forKey: "originalPushToken")
96111
coder.encode(parameters, forKey: "parameters")
97112
coder.encode(method.rawValue, forKey: "method") // Encodes as String
98-
coder.encode(path, forKey: "path")
99113
coder.encode(timestamp, forKey: "timestamp")
100114
}
101115

102116
required init?(coder: NSCoder) {
103117
guard
104118
let identityModel = coder.decodeObject(forKey: "identityModel") as? OSIdentityModel,
105-
let pushSubscriptionModel = coder.decodeObject(forKey: "pushSubscriptionModel") as? OSSubscriptionModel,
106119
let parameters = coder.decodeObject(forKey: "parameters") as? [String: Any],
107120
let rawMethod = coder.decodeObject(forKey: "method") as? UInt32,
108-
let path = coder.decodeObject(forKey: "path") as? String,
109121
let timestamp = coder.decodeObject(forKey: "timestamp") as? Date
110122
else {
111123
// Log error
112124
return nil
113125
}
114126
self.identityModel = identityModel
115-
self.pushSubscriptionModel = pushSubscriptionModel
127+
self.pushSubscriptionModel = coder.decodeObject(forKey: "pushSubscriptionModel") as? OSSubscriptionModel
116128
self.originalPushToken = coder.decodeObject(forKey: "originalPushToken") as? String
117129
self.stringDescription = "<OSRequestCreateUser with externalId: \(identityModel.externalId ?? "nil")>"
118130
super.init()
119131
self.parameters = parameters
120132
self.method = HTTPMethod(rawValue: rawMethod)
121-
self.path = path
122133
self.timestamp = timestamp
123134
}
124135
}

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Requests/OSRequestFetchUser.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
import OneSignalCore
2929

3030
/**
31-
If an alias is passed in, it will be used to fetch the user. If not, then by default, use the `onesignal_id` in the `identityModel` to fetch the user.
32-
The `identityModel` is also used to reference the user that is updated with the response.
31+
Fetch the user by the provided alias. This is expected to be `onesignal_id` in most cases.
32+
The `identityModel` is used to reference the user that is updated with the response.
3333
*/
3434
class OSRequestFetchUser: OneSignalRequest, OSUserRequest {
3535
var sentToClient = false

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Requests/OSRequestIdentifyUser.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,14 @@ class OSRequestIdentifyUser: OneSignalRequest, OSUserRequest {
4848

4949
// requires a onesignal_id to send this request
5050
func prepareForExecution() -> Bool {
51-
let aliasLabel = identityModelToIdentify.primaryAliasLabel
52-
if let aliasId = identityModelToIdentify.primaryAliasId, let appId = OneSignalConfigManager.getAppId() {
51+
if let onesignalId = identityModelToIdentify.onesignalId, let appId = OneSignalConfigManager.getAppId() {
5352
self.addJWTHeader(identityModel: identityModelToIdentify)
54-
self.path = "apps/\(appId)/users/by/\(aliasLabel)/\(aliasId)/identity"
53+
self.path = "apps/\(appId)/users/by/\(OS_ONESIGNAL_ID)/\(onesignalId)/identity"
5554
return true
5655
} else {
5756
// self.path is non-nil, so set to empty string
5857
self.path = ""
59-
OneSignalLog.onesignalLog(.LL_DEBUG, message: "Cannot generate the Identify User request due to null app ID or null \(aliasLabel) ID.")
58+
OneSignalLog.onesignalLog(.LL_DEBUG, message: "Cannot generate the Identify User request due to null app ID or null OneSignal ID.")
6059
return false
6160
}
6261
}

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Requests/OSRequestRemoveAlias.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,9 @@ class OSRequestRemoveAlias: OneSignalRequest, OSUserRequest {
3838
var identityModel: OSIdentityModel
3939

4040
func prepareForExecution() -> Bool {
41-
let aliasLabel = identityModel.primaryAliasLabel
42-
if let aliasId = identityModel.primaryAliasId, let appId = OneSignalConfigManager.getAppId() {
41+
if let onesignalId = identityModel.onesignalId, let appId = OneSignalConfigManager.getAppId() {
4342
self.addJWTHeader(identityModel: identityModel)
44-
self.path = "apps/\(appId)/users/by/\(aliasLabel)/\(aliasId)/identity/\(labelToRemove)"
43+
self.path = "apps/\(appId)/users/by/\(OS_ONESIGNAL_ID)/\(onesignalId)/identity/\(labelToRemove)"
4544
return true
4645
} else {
4746
// self.path is non-nil, so set to empty string

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Requests/OSRequestTransferSubscription.swift

Lines changed: 8 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -28,80 +28,36 @@
2828
import OneSignalCore
2929

3030
/**
31+
Deprecated as of `5.2.3`. Use CreateUser instead. This class skeleton remains due to potentially cached requests.
32+
When this request is uncached, it will be translated to a CreateUser request, if appropriate.
33+
-------
3134
Transfers the Subscription specified by the subscriptionId to the User identified by the identity in the payload.
3235
Only one entry is allowed, `onesignal_id` or an Alias. We will use the alias specified.
3336
The anticipated usage of this request is only for push subscriptions.
3437
*/
38+
@available(*, deprecated, message: "Replaced by Create User")
3539
class OSRequestTransferSubscription: OneSignalRequest, OSUserRequest {
3640
var sentToClient = false
37-
let stringDescription: String
38-
override var description: String {
39-
return stringDescription
40-
}
4141

42-
var subscriptionModel: OSSubscriptionModel
4342
let aliasLabel: String
4443
let aliasId: String
4544

46-
// Need an alias and subscription_id
4745
func prepareForExecution() -> Bool {
48-
if let subscriptionId = subscriptionModel.subscriptionId, let appId = OneSignalConfigManager.getAppId() {
49-
self.path = "apps/\(appId)/subscriptions/\(subscriptionId)/owner"
50-
// TODO: self.addJWTHeader(identityModel: identityModel) ??
51-
return true
52-
} else {
53-
self.path = "" // self.path is non-nil, so set to empty string
54-
return false
55-
}
46+
return false
5647
}
5748

58-
/**
59-
Must pass an Alias pair to identify the User.
60-
*/
61-
init(
62-
subscriptionModel: OSSubscriptionModel,
63-
aliasLabel: String,
64-
aliasId: String
65-
) {
66-
self.subscriptionModel = subscriptionModel
67-
self.aliasLabel = aliasLabel
68-
self.aliasId = aliasId
69-
self.stringDescription = "<OSRequestTransferSubscription to \(aliasLabel): \(aliasId)>"
70-
super.init()
71-
self.parameters = ["identity": [aliasLabel: aliasId]]
72-
self.method = PATCH
73-
_ = prepareForExecution() // sets the path property
74-
}
75-
76-
func encode(with coder: NSCoder) {
77-
coder.encode(subscriptionModel, forKey: "subscriptionModel")
78-
coder.encode(aliasLabel, forKey: "aliasLabel")
79-
coder.encode(aliasId, forKey: "aliasId")
80-
coder.encode(parameters, forKey: "parameters")
81-
coder.encode(method.rawValue, forKey: "method") // Encodes as String
82-
coder.encode(timestamp, forKey: "timestamp")
83-
}
49+
func encode(with coder: NSCoder) { }
8450

51+
/// All cached instances should have External ID as the alias
8552
required init?(coder: NSCoder) {
8653
guard
87-
let subscriptionModel = coder.decodeObject(forKey: "subscriptionModel") as? OSSubscriptionModel,
8854
let aliasLabel = coder.decodeObject(forKey: "aliasLabel") as? String,
89-
let aliasId = coder.decodeObject(forKey: "aliasId") as? String,
90-
let rawMethod = coder.decodeObject(forKey: "method") as? UInt32,
91-
let parameters = coder.decodeObject(forKey: "parameters") as? [String: Any],
92-
let timestamp = coder.decodeObject(forKey: "timestamp") as? Date
55+
let aliasId = coder.decodeObject(forKey: "aliasId") as? String
9356
else {
9457
// Log error
9558
return nil
9659
}
97-
self.subscriptionModel = subscriptionModel
9860
self.aliasLabel = aliasLabel
9961
self.aliasId = aliasId
100-
self.stringDescription = "<OSRequestTransferSubscription to \(aliasLabel): \(aliasId)>"
101-
super.init()
102-
self.parameters = parameters
103-
self.method = HTTPMethod(rawValue: rawMethod)
104-
self.timestamp = timestamp
105-
_ = prepareForExecution()
10662
}
10763
}

0 commit comments

Comments
 (0)