Skip to content

Commit c0018f2

Browse files
authored
PIR: Use models for request and response bodies (#6603)
Task/Issue URL: https://app.asana.com/1/137249556945/project/1203581873609357/task/1211055607216974?focus=true ### Description See attached task. ### Steps to test this PR https://app.asana.com/1/137249556945/project/1203581873609357/task/1211080801433044?focus=true ### UI changes No UI changes
1 parent 1fb4a93 commit c0018f2

13 files changed

+299
-183
lines changed

pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/dashboard/messaging/PirDashboardWebConstants.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,4 @@ object PirDashboardWebConstants {
2727
internal const val MESSAGE_CALLBACK = "messageCallback"
2828
internal const val SECRET = "duckduckgo-android-messaging-secret"
2929
internal const val ALLOWED_DOMAIN = "duckduckgo.com"
30-
31-
internal const val PARAM_SUCCESS = "success"
32-
internal const val PARAM_VERSION = "version"
33-
internal const val PARAM_FIRST_NAME = "first"
34-
internal const val PARAM_MIDDLE_NAME = "middle"
35-
internal const val PARAM_LAST_NAME = "last"
36-
internal const val PARAM_CITY = "city"
37-
internal const val PARAM_STATE = "state"
3830
}

pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/dashboard/messaging/handlers/PirWebAddAddressToCurrentUserProfileMessageHandler.kt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import com.duckduckgo.js.messaging.api.JsMessage
2121
import com.duckduckgo.js.messaging.api.JsMessageCallback
2222
import com.duckduckgo.js.messaging.api.JsMessaging
2323
import com.duckduckgo.pir.impl.dashboard.messaging.PirDashboardWebMessages
24+
import com.duckduckgo.pir.impl.dashboard.messaging.model.PirWebMessageRequest
25+
import com.duckduckgo.pir.impl.dashboard.messaging.model.PirWebMessageResponse
2426
import com.duckduckgo.pir.impl.dashboard.state.PirWebOnboardingStateHolder
2527
import com.duckduckgo.pir.impl.models.Address
2628
import com.squareup.anvil.annotations.ContributesMultibinding
@@ -37,8 +39,8 @@ import logcat.logcat
3739
class PirWebAddAddressToCurrentUserProfileMessageHandler @Inject constructor(
3840
private val pirWebOnboardingStateHolder: PirWebOnboardingStateHolder,
3941
) : PirWebJsMessageHandler() {
40-
override val messageNames: List<PirDashboardWebMessages> =
41-
listOf(PirDashboardWebMessages.ADD_ADDRESS_TO_CURRENT_USER_PROFILE)
42+
43+
override val message = PirDashboardWebMessages.ADD_ADDRESS_TO_CURRENT_USER_PROFILE
4244

4345
override fun process(
4446
jsMessage: JsMessage,
@@ -47,39 +49,39 @@ class PirWebAddAddressToCurrentUserProfileMessageHandler @Inject constructor(
4749
) {
4850
logcat { "PIR-WEB: PirWebAddAddressToCurrentUserProfileMessageHandler: process $jsMessage" }
4951

50-
val city = jsMessage.params.getStringParam("city")
51-
val state = jsMessage.params.getStringParam("state")
52+
val request =
53+
jsMessage.toRequestMessage(PirWebMessageRequest.AddAddressToCurrentUserProfileRequest::class)
5254

5355
// attempting to add an empty address should return success=false
54-
if (city == null || state == null) {
56+
if (request == null || request.city.isEmpty() || request.state.isEmpty()) {
5557
logcat { "PIR-WEB: PirWebAddAddressToCurrentUserProfileMessageHandler: missing city and/or state" }
56-
jsMessaging.sendPirResponse(
58+
jsMessaging.sendResponse(
5759
jsMessage = jsMessage,
58-
success = false,
60+
response = PirWebMessageResponse.DefaultResponse.ERROR,
5961
)
6062
return
6163
}
6264

6365
// attempting to add a duplicate address should return success=false
64-
if (pirWebOnboardingStateHolder.addresses.any { it.city == city && it.state == state }) {
66+
if (pirWebOnboardingStateHolder.addresses.any { it.city == request.city && it.state == request.state }) {
6567
logcat { "PIR-WEB: PirWebAddAddressToCurrentUserProfileMessageHandler: address already exists" }
66-
jsMessaging.sendPirResponse(
68+
jsMessaging.sendResponse(
6769
jsMessage = jsMessage,
68-
success = false,
70+
response = PirWebMessageResponse.DefaultResponse.ERROR,
6971
)
7072
return
7173
}
7274

7375
pirWebOnboardingStateHolder.addresses.add(
7476
Address(
75-
city = city,
76-
state = state,
77+
city = request.city,
78+
state = request.state,
7779
),
7880
)
7981

80-
jsMessaging.sendPirResponse(
82+
jsMessaging.sendResponse(
8183
jsMessage = jsMessage,
82-
success = true,
84+
response = PirWebMessageResponse.DefaultResponse.SUCCESS,
8385
)
8486
}
8587
}

pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/dashboard/messaging/handlers/PirWebAddNameToCurrentUserProfileMessageHandler.kt

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ import com.duckduckgo.di.scopes.ActivityScope
2020
import com.duckduckgo.js.messaging.api.JsMessage
2121
import com.duckduckgo.js.messaging.api.JsMessageCallback
2222
import com.duckduckgo.js.messaging.api.JsMessaging
23-
import com.duckduckgo.pir.impl.dashboard.messaging.PirDashboardWebConstants
2423
import com.duckduckgo.pir.impl.dashboard.messaging.PirDashboardWebMessages
24+
import com.duckduckgo.pir.impl.dashboard.messaging.model.PirWebMessageRequest
25+
import com.duckduckgo.pir.impl.dashboard.messaging.model.PirWebMessageResponse
2526
import com.duckduckgo.pir.impl.dashboard.state.PirWebOnboardingStateHolder
2627
import com.squareup.anvil.annotations.ContributesMultibinding
2728
import javax.inject.Inject
@@ -38,8 +39,7 @@ class PirWebAddNameToCurrentUserProfileMessageHandler @Inject constructor(
3839
private val pirWebOnboardingStateHolder: PirWebOnboardingStateHolder,
3940
) : PirWebJsMessageHandler() {
4041

41-
override val messageNames: List<PirDashboardWebMessages> =
42-
listOf(PirDashboardWebMessages.ADD_NAME_TO_CURRENT_USER_PROFILE)
42+
override val message = PirDashboardWebMessages.ADD_NAME_TO_CURRENT_USER_PROFILE
4343

4444
override fun process(
4545
jsMessage: JsMessage,
@@ -48,42 +48,46 @@ class PirWebAddNameToCurrentUserProfileMessageHandler @Inject constructor(
4848
) {
4949
logcat { "PIR-WEB: PirWebAddNameToCurrentUserProfileMessageHandler: process $jsMessage" }
5050

51-
val firstName = jsMessage.params.getStringParam(PirDashboardWebConstants.PARAM_FIRST_NAME)
52-
val middleName = jsMessage.params.getStringParam(PirDashboardWebConstants.PARAM_MIDDLE_NAME)
53-
val lastName = jsMessage.params.getStringParam(PirDashboardWebConstants.PARAM_LAST_NAME)
51+
val request =
52+
jsMessage.toRequestMessage(PirWebMessageRequest.AddNameToCurrentUserProfileRequest::class)
5453

5554
// attempting to add an empty name should return success=false
56-
if (firstName == null || lastName == null) {
55+
if (request == null || request.first.isEmpty() || request.last.isEmpty()) {
5756
logcat { "PIR-WEB: PirWebAddNameToCurrentUserProfileMessageHandler: missing first and/or last names" }
58-
jsMessaging.sendPirResponse(
57+
jsMessaging.sendResponse(
5958
jsMessage = jsMessage,
60-
success = false,
59+
response = PirWebMessageResponse.DefaultResponse.ERROR,
6160
)
6261
return
6362
}
6463

6564
// attempting to add a duplicate name should return success=false
66-
if (pirWebOnboardingStateHolder.names.any { it.firstName == firstName && it.middleName == middleName && it.lastName == lastName }) {
65+
if (pirWebOnboardingStateHolder.names.any {
66+
it.firstName == request.first &&
67+
it.middleName == request.middle &&
68+
it.lastName == request.last
69+
}
70+
) {
6771
logcat { "PIR-WEB: PirWebAddNameToCurrentUserProfileMessageHandler: duplicate name detected" }
68-
jsMessaging.sendPirResponse(
72+
jsMessaging.sendResponse(
6973
jsMessage = jsMessage,
70-
success = false,
74+
response = PirWebMessageResponse.DefaultResponse.ERROR,
7175
)
7276
return
7377
}
7478

7579
// Add the name to the current user profile
7680
pirWebOnboardingStateHolder.names.add(
7781
PirWebOnboardingStateHolder.Name(
78-
firstName = firstName,
79-
middleName = middleName,
80-
lastName = lastName,
82+
firstName = request.first,
83+
middleName = request.middle,
84+
lastName = request.last,
8185
),
8286
)
8387

84-
jsMessaging.sendPirResponse(
88+
jsMessaging.sendResponse(
8589
jsMessage = jsMessage,
86-
success = true,
90+
response = PirWebMessageResponse.DefaultResponse.SUCCESS,
8791
)
8892
}
8993
}

pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/dashboard/messaging/handlers/PirWebGetCurrentUserProfileMessageHandler.kt

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,15 @@ import com.duckduckgo.di.scopes.ActivityScope
2222
import com.duckduckgo.js.messaging.api.JsMessage
2323
import com.duckduckgo.js.messaging.api.JsMessageCallback
2424
import com.duckduckgo.js.messaging.api.JsMessaging
25-
import com.duckduckgo.pir.impl.dashboard.messaging.PirDashboardWebConstants
2625
import com.duckduckgo.pir.impl.dashboard.messaging.PirDashboardWebMessages
26+
import com.duckduckgo.pir.impl.dashboard.messaging.model.PirWebMessageResponse
2727
import com.duckduckgo.pir.impl.dashboard.state.PirWebOnboardingStateHolder.Name
2828
import com.duckduckgo.pir.impl.store.PirRepository
2929
import com.squareup.anvil.annotations.ContributesMultibinding
3030
import javax.inject.Inject
3131
import kotlinx.coroutines.CoroutineScope
3232
import kotlinx.coroutines.launch
3333
import logcat.logcat
34-
import org.json.JSONArray
35-
import org.json.JSONObject
3634

3735
/**
3836
* Handles the initial getCurrentUserProfile message from Web which is used to retrieve the current user profile
@@ -46,10 +44,9 @@ class PirWebGetCurrentUserProfileMessageHandler @Inject constructor(
4644
private val repository: PirRepository,
4745
private val dispatcherProvider: DispatcherProvider,
4846
@AppCoroutineScope private val appCoroutineScope: CoroutineScope,
49-
) :
50-
PirWebJsMessageHandler() {
47+
) : PirWebJsMessageHandler() {
5148

52-
override val messageNames: List<PirDashboardWebMessages> = listOf(PirDashboardWebMessages.GET_CURRENT_USER_PROFILE)
49+
override val message = PirDashboardWebMessages.GET_CURRENT_USER_PROFILE
5350

5451
override fun process(
5552
jsMessage: JsMessage,
@@ -63,9 +60,9 @@ class PirWebGetCurrentUserProfileMessageHandler @Inject constructor(
6360

6461
if (profiles.isEmpty()) {
6562
logcat { "PIR-WEB: GetCurrentUserProfileMessageHandler: no user profiles found" }
66-
jsMessaging.sendPirResponse(
63+
jsMessaging.sendResponse(
6764
jsMessage = jsMessage,
68-
success = true,
65+
response = PirWebMessageResponse.DefaultResponse.SUCCESS,
6966
)
7067
return@launch
7168
}
@@ -74,40 +71,25 @@ class PirWebGetCurrentUserProfileMessageHandler @Inject constructor(
7471
val addresses = profiles.map { it.addresses }.flatten()
7572
val birthYear = profiles.firstOrNull()?.birthYear ?: 0
7673

77-
jsMessaging.sendPirResponse(
74+
jsMessaging.sendResponse(
7875
jsMessage = jsMessage,
79-
success = true,
80-
customParams = mapOf(
81-
PARAM_ADDRESSES to JSONArray().apply {
82-
addresses.forEach { address ->
83-
put(
84-
JSONObject().apply {
85-
put(PirDashboardWebConstants.PARAM_CITY, address.city)
86-
put(PirDashboardWebConstants.PARAM_STATE, address.state)
87-
},
88-
)
89-
}
76+
response = PirWebMessageResponse.GetCurrentUserProfileResponse(
77+
names = names.map {
78+
PirWebMessageResponse.GetCurrentUserProfileResponse.Name(
79+
first = it.firstName,
80+
middle = it.middleName ?: "",
81+
last = it.lastName,
82+
)
9083
},
91-
PARAM_BIRTH_YEAR to birthYear,
92-
PARAM_NAMES to JSONArray().apply {
93-
names.forEach { name ->
94-
put(
95-
JSONObject().apply {
96-
put(PirDashboardWebConstants.PARAM_FIRST_NAME, name.firstName)
97-
put(PirDashboardWebConstants.PARAM_MIDDLE_NAME, name.middleName ?: "")
98-
put(PirDashboardWebConstants.PARAM_LAST_NAME, name.lastName)
99-
},
100-
)
101-
}
84+
addresses = addresses.map {
85+
PirWebMessageResponse.GetCurrentUserProfileResponse.Address(
86+
city = it.city,
87+
state = it.state,
88+
)
10289
},
90+
birthYear = birthYear,
10391
),
10492
)
10593
}
10694
}
107-
108-
companion object {
109-
private const val PARAM_ADDRESSES = "addresses"
110-
private const val PARAM_BIRTH_YEAR = "birthYear"
111-
private const val PARAM_NAMES = "names"
112-
}
11395
}

pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/dashboard/messaging/handlers/PirWebGetDataBrokersMessageHandler.kt

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,13 @@ import com.duckduckgo.js.messaging.api.JsMessage
2323
import com.duckduckgo.js.messaging.api.JsMessageCallback
2424
import com.duckduckgo.js.messaging.api.JsMessaging
2525
import com.duckduckgo.pir.impl.dashboard.messaging.PirDashboardWebMessages
26+
import com.duckduckgo.pir.impl.dashboard.messaging.model.PirWebMessageResponse
2627
import com.duckduckgo.pir.impl.store.PirRepository
27-
import com.duckduckgo.pir.impl.store.db.Broker
2828
import com.squareup.anvil.annotations.ContributesMultibinding
2929
import javax.inject.Inject
3030
import kotlinx.coroutines.CoroutineScope
3131
import kotlinx.coroutines.launch
3232
import logcat.logcat
33-
import org.json.JSONArray
34-
import org.json.JSONObject
3533

3634
/**
3735
* Handles the getDataBrokers message from Web which is used
@@ -46,8 +44,8 @@ class PirWebGetDataBrokersMessageHandler @Inject constructor(
4644
private val dispatcherProvider: DispatcherProvider,
4745
@AppCoroutineScope private val appCoroutineScope: CoroutineScope,
4846
) : PirWebJsMessageHandler() {
49-
override val messageNames: List<PirDashboardWebMessages> =
50-
listOf(PirDashboardWebMessages.GET_DATA_BROKERS)
47+
48+
override val message = PirDashboardWebMessages.GET_DATA_BROKERS
5149

5250
override fun process(
5351
jsMessage: JsMessage,
@@ -59,32 +57,18 @@ class PirWebGetDataBrokersMessageHandler @Inject constructor(
5957
appCoroutineScope.launch(dispatcherProvider.io()) {
6058
val brokers = repository.getAllActiveBrokerObjects()
6159

62-
jsMessaging.sendPirResponse(
60+
jsMessaging.sendResponse(
6361
jsMessage,
64-
success = true,
65-
customParams = mapOf(
66-
PARAM_DATA_BROKERS to brokers.toResponseBrokers(),
62+
response = PirWebMessageResponse.GetDataBrokersResponse(
63+
dataBrokers = brokers.map {
64+
PirWebMessageResponse.GetDataBrokersResponse.DataBroker(
65+
url = it.url,
66+
name = it.name,
67+
parentURL = it.parent,
68+
)
69+
},
6770
),
6871
)
6972
}
7073
}
71-
72-
private fun List<Broker>.toResponseBrokers(): JSONArray {
73-
// TODO verify parentURL and add optOutURL as per documentation
74-
return JSONArray().apply {
75-
forEach { broker ->
76-
put(
77-
JSONObject().apply {
78-
put("url", broker.url)
79-
put("name", broker.name)
80-
put("parentURL", broker.parent ?: JSONObject.NULL)
81-
},
82-
)
83-
}
84-
}
85-
}
86-
87-
companion object {
88-
private const val PARAM_DATA_BROKERS = "dataBrokers"
89-
}
9074
}

pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/dashboard/messaging/handlers/PirWebHandshakeMessageHandler.kt

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import com.duckduckgo.js.messaging.api.JsMessage
2121
import com.duckduckgo.js.messaging.api.JsMessageCallback
2222
import com.duckduckgo.js.messaging.api.JsMessaging
2323
import com.duckduckgo.pir.impl.dashboard.messaging.PirDashboardWebMessages
24+
import com.duckduckgo.pir.impl.dashboard.messaging.model.PirWebMessageResponse
2425
import com.squareup.anvil.annotations.ContributesMultibinding
2526
import javax.inject.Inject
2627
import logcat.logcat
27-
import org.json.JSONObject
2828

2929
/**
3030
* Handles the initial handshake message from Web which is used to establish communication.
@@ -35,7 +35,7 @@ import org.json.JSONObject
3535
)
3636
class PirWebHandshakeMessageHandler @Inject constructor() : PirWebJsMessageHandler() {
3737

38-
override val messageNames: List<PirDashboardWebMessages> = listOf(PirDashboardWebMessages.HANDSHAKE)
38+
override val message = PirDashboardWebMessages.HANDSHAKE
3939

4040
override fun process(
4141
jsMessage: JsMessage,
@@ -44,20 +44,14 @@ class PirWebHandshakeMessageHandler @Inject constructor() : PirWebJsMessageHandl
4444
) {
4545
logcat { "PIR-WEB: PirWebHandshakeMessageHandler: process $jsMessage" }
4646

47-
jsMessaging.sendPirResponse(
47+
jsMessaging.sendResponse(
4848
jsMessage = jsMessage,
49-
success = true,
50-
customParams = mapOf(
51-
PARAM_USER_DATA to JSONObject().apply {
52-
// TODO Check access token and subscription
53-
put(PARAM_IS_AUTHENTICATED_USER, true)
54-
},
49+
response = PirWebMessageResponse.HandshakeResponse(
50+
success = true,
51+
userData = PirWebMessageResponse.HandshakeResponse.UserData(
52+
isAuthenticatedUser = true,
53+
),
5554
),
5655
)
5756
}
58-
59-
companion object {
60-
private const val PARAM_USER_DATA = "userData"
61-
private const val PARAM_IS_AUTHENTICATED_USER = "isAuthenticatedUser"
62-
}
6357
}

0 commit comments

Comments
 (0)