Skip to content

Commit 5d39fa8

Browse files
authored
Merge pull request #2354 from OneSignal/fix/multiple_create_subscription_ops_without_token
fix(subs): Fix when multiple create subscription operations exist without token
2 parents 28870c9 + a45835a commit 5d39fa8

File tree

6 files changed

+68
-11
lines changed

6 files changed

+68
-11
lines changed

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/backend/impl/SubscriptionBackendService.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ internal class SubscriptionBackendService(
2121
subscription: SubscriptionObject,
2222
): Pair<String, RywData?>? {
2323
val jsonSubscription = JSONConverter.convertToJSON(subscription)
24-
jsonSubscription.remove("id")
2524
val requestJSON = JSONObject().put("subscription", jsonSubscription)
2625

2726
val response = _httpClient.post("apps/$appId/users/by/$aliasLabel/$aliasValue/subscriptions", requestJSON)

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/CreateSubscriptionOperation.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,7 @@ class CreateSubscriptionOperation() : Operation(SubscriptionOperationExecutor.CR
9999
}
100100

101101
override fun translateIds(map: Map<String, String>) {
102-
if (map.containsKey(onesignalId)) {
103-
onesignalId = map[onesignalId]!!
104-
}
102+
map[onesignalId]?.let { onesignalId = it }
103+
map[subscriptionId]?.let { subscriptionId = it }
105104
}
106105
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.onesignal.user.internal.operations.impl.executors
33
import android.os.Build
44
import com.onesignal.common.AndroidUtils
55
import com.onesignal.common.DeviceUtils
6+
import com.onesignal.common.IDManager
67
import com.onesignal.common.NetworkUtils
78
import com.onesignal.common.OneSignalUtils
89
import com.onesignal.common.RootToolsInternalMethods
@@ -287,9 +288,10 @@ internal class LoginUserOperationExecutor(
287288
SubscriptionObjectType.fromDeviceType(_deviceService.deviceType)
288289
}
289290
}
291+
val subId = if (!IDManager.isLocalId(operation.subscriptionId)) operation.subscriptionId else null
290292
mutableSubscriptions[operation.subscriptionId] =
291293
SubscriptionObject(
292-
id = null,
294+
id = subId,
293295
subscriptionType,
294296
operation.address,
295297
operation.enabled,

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.onesignal.user.internal.operations.impl.executors
33
import android.os.Build
44
import com.onesignal.common.AndroidUtils
55
import com.onesignal.common.DeviceUtils
6+
import com.onesignal.common.IDManager
67
import com.onesignal.common.NetworkUtils
78
import com.onesignal.common.OneSignalUtils
89
import com.onesignal.common.RootToolsInternalMethods
@@ -87,11 +88,12 @@ internal class SubscriptionOperationExecutor(
8788
val enabled = lastUpdateOperation?.enabled ?: createOperation.enabled
8889
val address = lastUpdateOperation?.address ?: createOperation.address
8990
val status = lastUpdateOperation?.status ?: createOperation.status
91+
val subId = if (!IDManager.isLocalId(createOperation.subscriptionId)) createOperation.subscriptionId else null
9092

9193
try {
9294
val subscription =
9395
SubscriptionObject(
94-
id = null,
96+
id = subId,
9597
convert(createOperation.type),
9698
address,
9799
enabled,

OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/backend/SubscriptionBackendServiceTests.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class SubscriptionBackendServiceTests : FunSpec({
3333
// When
3434
val subscription =
3535
SubscriptionObject(
36-
"no-id",
36+
"sub-id",
3737
SubscriptionObjectType.ANDROID_PUSH,
3838
"pushToken",
3939
true,
@@ -49,7 +49,7 @@ class SubscriptionBackendServiceTests : FunSpec({
4949
"apps/appId/users/by/$aliasLabel/$aliasValue/subscriptions",
5050
withArg {
5151
val sub = it.getJSONObject("subscription")
52-
sub.has("id") shouldBe false
52+
sub.getString("id") shouldBe "sub-id"
5353
sub.getString("type") shouldBe "AndroidPush"
5454
sub.getString("token") shouldBe "pushToken"
5555
sub.getBoolean("enabled") shouldBe true
@@ -70,7 +70,7 @@ class SubscriptionBackendServiceTests : FunSpec({
7070
// When
7171
val subscription =
7272
SubscriptionObject(
73-
"no-id",
73+
"sub-id",
7474
SubscriptionObjectType.ANDROID_PUSH,
7575
"pushToken",
7676
true,
@@ -94,7 +94,7 @@ class SubscriptionBackendServiceTests : FunSpec({
9494
"apps/appId/users/by/$aliasLabel/$aliasValue/subscriptions",
9595
withArg {
9696
val sub = it.getJSONObject("subscription")
97-
sub.has("id") shouldBe false
97+
sub.getString("id") shouldBe "sub-id"
9898
sub.getString("type") shouldBe "AndroidPush"
9999
sub.getString("token") shouldBe "pushToken"
100100
sub.getBoolean("enabled") shouldBe true

OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/operations/SubscriptionOperationExecutorTests.kt

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class SubscriptionOperationExecutorTests :
4545
coEvery { mockConsistencyManager.setRywData(any(), any(), any()) } just runs
4646
}
4747

48-
test("create subscription successfully creates subscription") {
48+
test("create subscription successfully creates subscription, with local ID") {
4949
// Given
5050
val mockSubscriptionBackendService = mockk<ISubscriptionBackendService>()
5151
coEvery { mockSubscriptionBackendService.createSubscription(any(), any(), any(), any()) } returns
@@ -95,6 +95,7 @@ class SubscriptionOperationExecutorTests :
9595
IdentityConstants.ONESIGNAL_ID,
9696
remoteOneSignalId,
9797
withArg {
98+
it.id shouldBe null
9899
it.type shouldBe SubscriptionObjectType.ANDROID_PUSH
99100
it.enabled shouldBe true
100101
it.token shouldBe "pushToken"
@@ -104,6 +105,60 @@ class SubscriptionOperationExecutorTests :
104105
}
105106
}
106107

108+
test("create subscription includes the subscription ID if non-local") {
109+
// Given
110+
val mockSubscriptionBackendService = mockk<ISubscriptionBackendService>()
111+
coEvery { mockSubscriptionBackendService.createSubscription(any(), any(), any(), any()) } returns
112+
Pair(remoteSubscriptionId, rywData)
113+
114+
val mockSubscriptionsModelStore = mockk<SubscriptionModelStore>()
115+
val subscriptionModel = SubscriptionModel()
116+
subscriptionModel.id = remoteSubscriptionId
117+
every { mockSubscriptionsModelStore.get(remoteSubscriptionId) } returns subscriptionModel
118+
119+
val mockBuildUserService = mockk<IRebuildUserService>()
120+
121+
val subscriptionOperationExecutor =
122+
SubscriptionOperationExecutor(
123+
mockSubscriptionBackendService,
124+
MockHelper.deviceService(),
125+
AndroidMockHelper.applicationService(),
126+
mockSubscriptionsModelStore,
127+
MockHelper.configModelStore(),
128+
mockBuildUserService,
129+
getNewRecordState(),
130+
mockConsistencyManager,
131+
)
132+
133+
val operations =
134+
listOf<Operation>(
135+
CreateSubscriptionOperation(
136+
appId,
137+
remoteOneSignalId,
138+
remoteSubscriptionId,
139+
SubscriptionType.PUSH,
140+
true,
141+
"pushToken",
142+
SubscriptionStatus.SUBSCRIBED,
143+
),
144+
)
145+
146+
// When
147+
subscriptionOperationExecutor.execute(operations)
148+
149+
// Then
150+
coVerify(exactly = 1) {
151+
mockSubscriptionBackendService.createSubscription(
152+
appId,
153+
IdentityConstants.ONESIGNAL_ID,
154+
remoteOneSignalId,
155+
withArg {
156+
it.id shouldBe remoteSubscriptionId
157+
},
158+
)
159+
}
160+
}
161+
107162
test("create subscription fails with retry when there is a network condition") {
108163
// Given
109164
val mockSubscriptionBackendService = mockk<ISubscriptionBackendService>()

0 commit comments

Comments
 (0)