Skip to content

Commit 97e4b8a

Browse files
committed
Implement jwt to backend service and operation executor for subscription specific operation
This commit serves as an example of implementing JWT for a specific backend service. To enable JWT for any backend service, follow these steps: 1. Find an OperationExecutor (e.g., SubscriptionOperationExecutor.kt). 2. Locate any BackendService contained within this OperationExecutor (e.g., _subscriptionBackendService). 3. In the BackendService, examine all its methods. Add jwt: String? = null if the method is one of the authorized operations in the JWT dev documentation (e.g., createSubscription()). Make sure to modify both ISubscriptionBackendService.kt and SubscriptionBackendService.kt. 4. In the implementation of the BackendService (e.g., SubscriptionBackendService.kt), locate all HTTP client calls such as _httpClient.post / get / patch, and add jwt as the last parameter. 5. Return to the OperationExecutor (e.g., SubscriptionOperationExecutor.kt). If _identityModelStore is not a property, add private val _identityModelStore: IdentityModelStore as a property. 6. Update parameters in all backend service calls with _identityModelStore.model.jwtToken at the end."
1 parent 7cfa79a commit 97e4b8a

File tree

8 files changed

+31
-19
lines changed

8 files changed

+31
-19
lines changed

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/internal/OneSignalImp.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
363363
if (currentIdentityExternalId == externalId) {
364364
// login is for same user that is already logged in, fetch (refresh)
365365
// the current user.
366+
identityModelStore!!.model.jwtToken = jwtBearerToken
366367
operationRepo!!.enqueue(
367368
RefreshUserOperation(
368369
configModel!!.appId,
@@ -397,7 +398,6 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
397398
newIdentityOneSignalId,
398399
externalId,
399400
if (currentIdentityExternalId == null) currentIdentityOneSignalId else null,
400-
jwtBearerToken,
401401
),
402402
true,
403403
)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ interface ISubscriptionBackendService {
2121
aliasLabel: String,
2222
aliasValue: String,
2323
subscription: SubscriptionObject,
24+
jwt: String?,
2425
): String?
2526

2627
/**
@@ -34,6 +35,7 @@ interface ISubscriptionBackendService {
3435
appId: String,
3536
subscriptionId: String,
3637
subscription: SubscriptionObject,
38+
jwt: String?,
3739
)
3840

3941
/**
@@ -45,6 +47,7 @@ interface ISubscriptionBackendService {
4547
suspend fun deleteSubscription(
4648
appId: String,
4749
subscriptionId: String,
50+
jwt: String?,
4851
)
4952

5053
/**
@@ -60,6 +63,7 @@ interface ISubscriptionBackendService {
6063
subscriptionId: String,
6164
aliasLabel: String,
6265
aliasValue: String,
66+
jwt: String?,
6367
)
6468

6569
/**
@@ -73,5 +77,6 @@ interface ISubscriptionBackendService {
7377
suspend fun getIdentityFromSubscription(
7478
appId: String,
7579
subscriptionId: String,
80+
jwt: String?,
7681
): Map<String, String>
7782
}

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ internal class SubscriptionBackendService(
1616
aliasLabel: String,
1717
aliasValue: String,
1818
subscription: SubscriptionObject,
19+
jwt: String?,
1920
): String? {
2021
val jsonSubscription = JSONConverter.convertToJSON(subscription)
2122
jsonSubscription.remove("id")
2223
val requestJSON = JSONObject().put("subscription", jsonSubscription)
2324

24-
val response = _httpClient.post("apps/$appId/users/by/$aliasLabel/$aliasValue/subscriptions", requestJSON)
25+
val response = _httpClient.post("apps/$appId/users/by/$aliasLabel/$aliasValue/subscriptions", requestJSON, jwt)
2526

2627
if (!response.isSuccess) {
2728
throw BackendException(response.statusCode, response.payload)
@@ -40,12 +41,13 @@ internal class SubscriptionBackendService(
4041
appId: String,
4142
subscriptionId: String,
4243
subscription: SubscriptionObject,
44+
jwt: String?,
4345
) {
4446
val requestJSON =
4547
JSONObject()
4648
.put("subscription", JSONConverter.convertToJSON(subscription))
4749

48-
val response = _httpClient.patch("apps/$appId/subscriptions/$subscriptionId", requestJSON)
50+
val response = _httpClient.patch("apps/$appId/subscriptions/$subscriptionId", requestJSON, jwt)
4951

5052
if (!response.isSuccess) {
5153
throw BackendException(response.statusCode, response.payload)
@@ -55,8 +57,9 @@ internal class SubscriptionBackendService(
5557
override suspend fun deleteSubscription(
5658
appId: String,
5759
subscriptionId: String,
60+
jwt: String?,
5861
) {
59-
val response = _httpClient.delete("apps/$appId/subscriptions/$subscriptionId")
62+
val response = _httpClient.delete("apps/$appId/subscriptions/$subscriptionId", jwt)
6063

6164
if (!response.isSuccess) {
6265
throw BackendException(response.statusCode, response.payload)
@@ -68,12 +71,13 @@ internal class SubscriptionBackendService(
6871
subscriptionId: String,
6972
aliasLabel: String,
7073
aliasValue: String,
74+
jwt: String?,
7175
) {
7276
val requestJSON =
7377
JSONObject()
7478
.put("identity", JSONObject().put(aliasLabel, aliasValue))
7579

76-
val response = _httpClient.patch("apps/$appId/subscriptions/$subscriptionId/owner", requestJSON)
80+
val response = _httpClient.patch("apps/$appId/subscriptions/$subscriptionId/owner", requestJSON, jwt)
7781

7882
if (!response.isSuccess) {
7983
throw BackendException(response.statusCode, response.payload)
@@ -83,8 +87,9 @@ internal class SubscriptionBackendService(
8387
override suspend fun getIdentityFromSubscription(
8488
appId: String,
8589
subscriptionId: String,
90+
jwt: String?,
8691
): Map<String, String> {
87-
val response = _httpClient.get("apps/$appId/subscriptions/$subscriptionId/user/identity")
92+
val response = _httpClient.get("apps/$appId/subscriptions/$subscriptionId/user/identity", jwt)
8893

8994
if (!response.isSuccess) {
9095
throw BackendException(response.statusCode, response.payload)

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

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,26 +53,16 @@ class LoginUserOperation() : Operation(LoginUserOperationExecutor.LOGIN_USER) {
5353
setOptStringProperty(::existingOnesignalId.name, value)
5454
}
5555

56-
/**
57-
* The JWT token used for the operation that logs in the user.
58-
*/
59-
var jwt: String?
60-
get() = getStringProperty(::jwt.name)
61-
private set(value) {
62-
setStringProperty(::jwt.name, value!!)
63-
}
64-
6556
override val createComparisonKey: String get() = "$appId.User.$onesignalId"
6657
override val modifyComparisonKey: String = ""
6758
override val groupComparisonType: GroupComparisonType = GroupComparisonType.CREATE
6859
override val canStartExecute: Boolean get() = existingOnesignalId == null || !IDManager.isLocalId(existingOnesignalId!!)
6960

70-
constructor(appId: String, onesignalId: String, externalId: String?, existingOneSignalId: String? = null, jwt: String? = null) : this() {
61+
constructor(appId: String, onesignalId: String, externalId: String?, existingOneSignalId: String? = null) : this() {
7162
this.appId = appId
7263
this.onesignalId = onesignalId
7364
this.externalId = externalId
7465
this.existingOnesignalId = existingOneSignalId
75-
this.jwt = jwt
7666
}
7767

7868
override fun translateIds(map: Map<String, String>) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ internal class LoginUserFromSubscriptionOperationExecutor(
4242
_subscriptionBackend.getIdentityFromSubscription(
4343
loginUserOp.appId,
4444
loginUserOp.subscriptionId,
45+
_identityModelStore.model.jwtToken,
4546
)
4647
val backendOneSignalId = identities.getOrDefault(IdentityConstants.ONESIGNAL_ID, null)
4748

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ internal class RefreshUserOperationExecutor(
5353
op.appId,
5454
IdentityConstants.ONESIGNAL_ID,
5555
op.onesignalId,
56+
_identityModelStore.model.jwtToken,
5657
)
5758

5859
if (op.onesignalId != _identityModelStore.model.onesignalId) {

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.onesignal.user.internal.backend.IdentityConstants
2222
import com.onesignal.user.internal.backend.SubscriptionObject
2323
import com.onesignal.user.internal.backend.SubscriptionObjectType
2424
import com.onesignal.user.internal.builduser.IRebuildUserService
25+
import com.onesignal.user.internal.identity.IdentityModelStore
2526
import com.onesignal.user.internal.operations.CreateSubscriptionOperation
2627
import com.onesignal.user.internal.operations.DeleteSubscriptionOperation
2728
import com.onesignal.user.internal.operations.TransferSubscriptionOperation
@@ -34,6 +35,7 @@ internal class SubscriptionOperationExecutor(
3435
private val _subscriptionBackend: ISubscriptionBackendService,
3536
private val _deviceService: IDeviceService,
3637
private val _applicationService: IApplicationService,
38+
private val _identityModelStore: IdentityModelStore,
3739
private val _subscriptionModelStore: SubscriptionModelStore,
3840
private val _configModelStore: ConfigModelStore,
3941
private val _buildUserService: IRebuildUserService,
@@ -98,6 +100,7 @@ internal class SubscriptionOperationExecutor(
98100
IdentityConstants.ONESIGNAL_ID,
99101
createOperation.onesignalId,
100102
subscription,
103+
_identityModelStore.model.jwtToken,
101104
) ?: return ExecutionResponse(ExecutionResult.SUCCESS)
102105

103106
// update the subscription model with the new ID, if it's still active.
@@ -163,7 +166,12 @@ internal class SubscriptionOperationExecutor(
163166
AndroidUtils.getAppVersion(_applicationService.appContext),
164167
)
165168

166-
_subscriptionBackend.updateSubscription(lastOperation.appId, lastOperation.subscriptionId, subscription)
169+
_subscriptionBackend.updateSubscription(
170+
lastOperation.appId,
171+
lastOperation.subscriptionId,
172+
subscription,
173+
_identityModelStore.model.jwtToken,
174+
)
167175
} catch (ex: BackendException) {
168176
val responseType = NetworkUtils.getResponseStatusType(ex.statusCode)
169177

@@ -202,6 +210,7 @@ internal class SubscriptionOperationExecutor(
202210
startingOperation.subscriptionId,
203211
IdentityConstants.ONESIGNAL_ID,
204212
startingOperation.onesignalId,
213+
_identityModelStore.model.jwtToken,
205214
)
206215
} catch (ex: BackendException) {
207216
val responseType = NetworkUtils.getResponseStatusType(ex.statusCode)
@@ -233,7 +242,7 @@ internal class SubscriptionOperationExecutor(
233242

234243
private suspend fun deleteSubscription(op: DeleteSubscriptionOperation): ExecutionResponse {
235244
try {
236-
_subscriptionBackend.deleteSubscription(op.appId, op.subscriptionId)
245+
_subscriptionBackend.deleteSubscription(op.appId, op.subscriptionId, _identityModelStore.model.jwtToken,)
237246

238247
// remove the subscription model as a HYDRATE in case for some reason it still exists.
239248
_subscriptionModelStore.remove(op.subscriptionId, ModelChangeTags.HYDRATE)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ internal class UpdateUserOperationExecutor(
126126
propertiesObject,
127127
refreshDeviceMetadata,
128128
deltasObject,
129+
_identityModelStore.model.jwtToken,
129130
)
130131

131132
if (_identityModelStore.model.onesignalId == onesignalId) {

0 commit comments

Comments
 (0)