Skip to content

Commit 5b83545

Browse files
author
Rodrigo Gomez Palacio
committed
Update User & Subscription operation executors to set the tokens
Motivation: the executors call the respective backend services who's result will include the token value. We then hold in memory via `setRywToken`
1 parent c3f15f5 commit 5b83545

File tree

4 files changed

+1146
-969
lines changed

4 files changed

+1146
-969
lines changed

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/impl/executors/SubscriptionOperationExecutor.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import com.onesignal.common.DeviceUtils
66
import com.onesignal.common.NetworkUtils
77
import com.onesignal.common.OneSignalUtils
88
import com.onesignal.common.RootToolsInternalMethods
9+
import com.onesignal.common.consistency.IamFetchReadyCondition
10+
import com.onesignal.common.consistency.enums.IamFetchRywTokenKey
11+
import com.onesignal.common.consistency.models.IConsistencyManager
912
import com.onesignal.common.exceptions.BackendException
1013
import com.onesignal.common.modeling.ModelChangeTags
1114
import com.onesignal.core.internal.application.IApplicationService
@@ -39,6 +42,7 @@ internal class SubscriptionOperationExecutor(
3942
private val _configModelStore: ConfigModelStore,
4043
private val _buildUserService: IRebuildUserService,
4144
private val _newRecordState: NewRecordsState,
45+
private val _consistencyManager: IConsistencyManager,
4246
) : IOperationExecutor {
4347
override val operations: List<String>
4448
get() = listOf(CREATE_SUBSCRIPTION, UPDATE_SUBSCRIPTION, DELETE_SUBSCRIPTION, TRANSFER_SUBSCRIPTION)
@@ -101,14 +105,23 @@ internal class SubscriptionOperationExecutor(
101105
AndroidUtils.getAppVersion(_applicationService.appContext),
102106
)
103107

104-
val backendSubscriptionId =
108+
val result =
105109
_subscriptionBackend.createSubscription(
106110
createOperation.appId,
107111
IdentityConstants.ONESIGNAL_ID,
108112
createOperation.onesignalId,
109113
subscription,
110114
) ?: return ExecutionResponse(ExecutionResult.SUCCESS)
111115

116+
val backendSubscriptionId = result.first
117+
val rywToken = result.second
118+
119+
if (rywToken != null) {
120+
_consistencyManager.setRywToken(createOperation.onesignalId, IamFetchRywTokenKey.SUBSCRIPTION, rywToken)
121+
} else {
122+
_consistencyManager.resolveConditionsWithID(IamFetchReadyCondition.ID)
123+
}
124+
112125
// update the subscription model with the new ID, if it's still active.
113126
val subscriptionModel = _subscriptionModelStore.get(createOperation.subscriptionId)
114127
subscriptionModel?.setStringProperty(
@@ -175,7 +188,13 @@ internal class SubscriptionOperationExecutor(
175188
AndroidUtils.getAppVersion(_applicationService.appContext),
176189
)
177190

178-
_subscriptionBackend.updateSubscription(lastOperation.appId, lastOperation.subscriptionId, subscription)
191+
val rywToken = _subscriptionBackend.updateSubscription(lastOperation.appId, lastOperation.subscriptionId, subscription)
192+
193+
if (rywToken != null) {
194+
_consistencyManager.setRywToken(startingOperation.onesignalId, IamFetchRywTokenKey.SUBSCRIPTION, rywToken)
195+
} else {
196+
_consistencyManager.resolveConditionsWithID(IamFetchReadyCondition.ID)
197+
}
179198
} catch (ex: BackendException) {
180199
val responseType = NetworkUtils.getResponseStatusType(ex.statusCode)
181200

@@ -216,6 +235,7 @@ internal class SubscriptionOperationExecutor(
216235
return ExecutionResponse(ExecutionResult.SUCCESS)
217236
}
218237

238+
// TODO: whenever the end-user changes users, we need to add the read-your-write token here, currently no code to handle the re-fetch IAMs
219239
private suspend fun transferSubscription(startingOperation: TransferSubscriptionOperation): ExecutionResponse {
220240
try {
221241
_subscriptionBackend.transferSubscription(

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/impl/executors/UpdateUserOperationExecutor.kt

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.onesignal.user.internal.operations.impl.executors
22

33
import com.onesignal.common.NetworkUtils
4+
import com.onesignal.common.consistency.IamFetchReadyCondition
5+
import com.onesignal.common.consistency.enums.IamFetchRywTokenKey
6+
import com.onesignal.common.consistency.models.IConsistencyManager
47
import com.onesignal.common.exceptions.BackendException
58
import com.onesignal.common.modeling.ModelChangeTags
69
import com.onesignal.core.internal.operations.ExecutionResponse
@@ -31,12 +34,13 @@ internal class UpdateUserOperationExecutor(
3134
private val _propertiesModelStore: PropertiesModelStore,
3235
private val _buildUserService: IRebuildUserService,
3336
private val _newRecordState: NewRecordsState,
37+
private val _consistencyManager: IConsistencyManager,
3438
) : IOperationExecutor {
3539
override val operations: List<String>
3640
get() = listOf(SET_TAG, DELETE_TAG, SET_PROPERTY, TRACK_SESSION_START, TRACK_SESSION_END, TRACK_PURCHASE)
3741

38-
override suspend fun execute(ops: List<Operation>): ExecutionResponse {
39-
Logging.log(LogLevel.DEBUG, "UpdateUserOperationExecutor(operation: $ops)")
42+
override suspend fun execute(operations: List<Operation>): ExecutionResponse {
43+
Logging.log(LogLevel.DEBUG, "UpdateUserOperationExecutor(operation: $operations)")
4044

4145
var appId: String? = null
4246
var onesignalId: String? = null
@@ -45,7 +49,7 @@ internal class UpdateUserOperationExecutor(
4549
var deltasObject = PropertiesDeltasObject()
4650
var refreshDeviceMetadata = false
4751

48-
for (operation in ops) {
52+
for (operation in operations) {
4953
when (operation) {
5054
is SetTagOperation -> {
5155
if (appId == null) {
@@ -83,7 +87,8 @@ internal class UpdateUserOperationExecutor(
8387
// that exist in this group.
8488
val sessionCount = if (deltasObject.sessionCount != null) deltasObject.sessionCount!! + 1 else 1
8589

86-
deltasObject = PropertiesDeltasObject(deltasObject.sessionTime, sessionCount, deltasObject.amountSpent, deltasObject.purchases)
90+
deltasObject =
91+
PropertiesDeltasObject(deltasObject.sessionTime, sessionCount, deltasObject.amountSpent, deltasObject.purchases)
8792
refreshDeviceMetadata = true
8893
}
8994
is TrackSessionEndOperation -> {
@@ -94,9 +99,15 @@ internal class UpdateUserOperationExecutor(
9499

95100
// The session time we pass up is the total session time across all `TrackSessionEndOperation`
96101
// operations that exist in this group.
97-
val sessionTime = if (deltasObject.sessionTime != null) deltasObject.sessionTime!! + operation.sessionTime else operation.sessionTime
102+
val sessionTime =
103+
if (deltasObject.sessionTime != null) {
104+
deltasObject.sessionTime!! + operation.sessionTime
105+
} else {
106+
operation.sessionTime
107+
}
98108

99-
deltasObject = PropertiesDeltasObject(sessionTime, deltasObject.sessionCount, deltasObject.amountSpent, deltasObject.purchases)
109+
deltasObject =
110+
PropertiesDeltasObject(sessionTime, deltasObject.sessionCount, deltasObject.amountSpent, deltasObject.purchases)
100111
}
101112
is TrackPurchaseOperation -> {
102113
if (appId == null) {
@@ -107,7 +118,12 @@ internal class UpdateUserOperationExecutor(
107118
// The amount spent we pass up is the total amount spent across all `TrackPurchaseOperation`
108119
// operations that exist in this group, while the purchases is the union of all
109120
// `TrackPurchaseOperation` operations that exist in this group.
110-
val amountSpent = if (deltasObject.amountSpent != null) deltasObject.amountSpent!! + operation.amountSpent else operation.amountSpent
121+
val amountSpent =
122+
if (deltasObject.amountSpent != null) {
123+
deltasObject.amountSpent!! + operation.amountSpent
124+
} else {
125+
operation.amountSpent
126+
}
111127
val purchasesArray = if (deltasObject.purchases != null) deltasObject.purchases!!.toMutableList() else mutableListOf()
112128

113129
for (purchase in operation.purchases) {
@@ -122,18 +138,25 @@ internal class UpdateUserOperationExecutor(
122138

123139
if (appId != null && onesignalId != null) {
124140
try {
125-
_userBackend.updateUser(
126-
appId,
127-
IdentityConstants.ONESIGNAL_ID,
128-
onesignalId,
129-
propertiesObject,
130-
refreshDeviceMetadata,
131-
deltasObject,
132-
)
141+
val rywToken =
142+
_userBackend.updateUser(
143+
appId,
144+
IdentityConstants.ONESIGNAL_ID,
145+
onesignalId,
146+
propertiesObject,
147+
refreshDeviceMetadata,
148+
deltasObject,
149+
)
150+
151+
if (rywToken != null) {
152+
_consistencyManager.setRywToken(onesignalId, IamFetchRywTokenKey.USER, rywToken)
153+
} else {
154+
_consistencyManager.resolveConditionsWithID(IamFetchReadyCondition.ID)
155+
}
133156

134157
if (_identityModelStore.model.onesignalId == onesignalId) {
135158
// go through and make sure any properties are in the correct model state
136-
for (operation in ops) {
159+
for (operation in operations) {
137160
when (operation) {
138161
is SetTagOperation ->
139162
_propertiesModelStore.model.tags.setStringProperty(

0 commit comments

Comments
 (0)