Skip to content

Commit

Permalink
review consent status param for DIA-2462-review-consent-status-param
Browse files Browse the repository at this point in the history
  • Loading branch information
bohdan-go-wombat committed Aug 4, 2023
1 parent cf80874 commit 9338e9e
Show file tree
Hide file tree
Showing 9 changed files with 125 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import com.sourcepoint.cmplibrary.data.network.converter.toMapOfAny
import com.sourcepoint.cmplibrary.data.network.model.optimized.* //ktlint-disable
import com.sourcepoint.cmplibrary.data.network.model.optimized.choice.ChoiceResp
import com.sourcepoint.cmplibrary.data.network.model.optimized.choice.GetChoiceParamReq
import com.sourcepoint.cmplibrary.data.network.model.optimized.consentStatus.ConsentStatusMetaData
import com.sourcepoint.cmplibrary.data.network.model.optimized.consentStatus.ConsentStatusMetaDataArg
import com.sourcepoint.cmplibrary.data.network.model.optimized.includeData.IncludeData
import com.sourcepoint.cmplibrary.data.network.model.optimized.messages.MessagesBodyReq
import com.sourcepoint.cmplibrary.data.network.model.optimized.messages.OperatingSystemInfoParam
Expand Down Expand Up @@ -139,7 +141,50 @@ private class ServiceImpl(
.executeOnRight { metaDataResponse -> handleMetaDataResponse(metaDataResponse) }

if (messageReq.authId != null || campaignManager.shouldCallConsentStatus) {
triggerConsentStatus(messageReq)

val ccpaConsentStatusMetaData = ConsentStatusMetaDataArg(
uuid = campaignManager.ccpaConsentStatus?.uuid,
applies = metadataResponse.getOrNull()?.ccpa?.applies
?: campaignManager.ccpaConsentStatus?.applies,
hasLocalData = campaignManager.ccpaConsentStatus != null,
dateCreated = campaignManager.ccpaConsentStatus?.dateCreated,
)
val gdprConsentStatusMetaData = ConsentStatusMetaDataArg(
uuid = campaignManager.gdprConsentStatus?.uuid,
applies = metadataResponse.getOrNull()?.gdpr?.applies
?: campaignManager.gdprConsentStatus?.applies,
hasLocalData = campaignManager.gdprConsentStatus != null,
dateCreated = campaignManager.gdprConsentStatus?.dateCreated,
)

val consentStatusMetaData = ConsentStatusMetaData(
ccpa = ccpaConsentStatusMetaData,
gdpr = gdprConsentStatusMetaData,
)

val consentStatusParamReq = ConsentStatusParamReq(
env = messageReq.env,
metadata = JsonConverter.converter.encodeToString(consentStatusMetaData),
propertyId = messageReq.propertyId,
accountId = messageReq.accountId,
authId = messageReq.authId,
localState = campaignManager.messagesOptimizedLocalState,
hasCsp = false,
withSiteActions = false,
includeData = IncludeData.generateIncludeDataForConsentStatus(),
)

networkClient.getConsentStatus(consentStatusParamReq)
.executeOnRight { consentStatusResponse ->
campaignManager.apply {
handleOldLocalData()
messagesOptimizedLocalState = consentStatusResponse.localState
consentStatusResponse.consentStatusData?.let { consentStatusData ->
gdprConsentStatus = consentStatusData.gdpr
ccpaConsentStatus = consentStatusData.ccpa
}
}
}
.executeOnLeft { consentStatusError ->
onFailure(consentStatusError, true)
return@executeOnWorkerThread
Expand Down Expand Up @@ -389,8 +434,6 @@ private class ServiceImpl(
}
}

// pMessageReq?.apply { authId?.let{ triggerConsentStatus(this) } }

campaignManager.gdprConsentStatus ?: throw InvalidConsentResponse(
cause = null,
"The GDPR consent object cannot be null!!!"
Expand Down Expand Up @@ -473,24 +516,4 @@ private class ServiceImpl(
"The CCPA consent object cannot be null!!!"
)
}

private fun triggerConsentStatus(messageReq: MessagesParamReq): Either<ConsentStatusResp> {
val csParams = messageReq.toConsentStatusParamReq(
gdprUuid = campaignManager.gdprConsentStatus?.uuid,
ccpaUuid = campaignManager.ccpaConsentStatus?.uuid,
localState = campaignManager.messagesOptimizedLocalState
)

return getConsentStatus(csParams)
.executeOnRight { consentStatusResponse ->
campaignManager.apply {
handleOldLocalData()
messagesOptimizedLocalState = consentStatusResponse.localState
consentStatusResponse.consentStatusData?.let { consentStatusData ->
gdprConsentStatus = consentStatusData.gdpr
ccpaConsentStatus = consentStatusData.ccpa
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.sourcepoint.cmplibrary.core.getOrNull
import com.sourcepoint.cmplibrary.data.network.converter.* //ktlint-disable
import com.sourcepoint.cmplibrary.data.network.converter.JsonConverter
import com.sourcepoint.cmplibrary.data.network.converter.converter
import com.sourcepoint.cmplibrary.data.network.model.optimized.includeData.IncludeData
import com.sourcepoint.cmplibrary.data.network.util.Env
import com.sourcepoint.cmplibrary.model.exposed.CcpaStatus
import com.sourcepoint.cmplibrary.model.exposed.GDPRPurposeGrants
Expand All @@ -17,12 +18,24 @@ import kotlinx.serialization.json.JsonObject

@Serializable
internal data class ConsentStatusParamReq(
@SerialName("env") val env: Env,
@SerialName("metadata") val metadata: String,
@SerialName("propertyId") val propertyId: Long,
@SerialName("accountId") val accountId: Long,
@SerialName("authId") val authId: String?,
@SerialName("localState") val localState: JsonElement?
@SerialName("env")
val env: Env,
@SerialName("metadata")
val metadata: String,
@SerialName("propertyId")
val propertyId: Long,
@SerialName("accountId")
val accountId: Long,
@SerialName("authId")
val authId: String?,
@SerialName("localState")
val localState: JsonElement?,
@SerialName("hasCsp")
val hasCsp: Boolean = false,
@SerialName("withSiteActions")
val withSiteActions: Boolean = false,
@SerialName("includeData")
val includeData: IncludeData,
)

enum class GranularState {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,27 +70,6 @@ internal fun MessagesParamReq.toMetaDataParamReq(campaigns: List<CampaignReq>):
)
}

internal fun MessagesParamReq.toConsentStatusParamReq(
gdprUuid: String?,
ccpaUuid: String?,
localState: JsonElement?
): ConsentStatusParamReq {

val mdArg = metadataArg?.copy(
gdpr = metadataArg.gdpr?.copy(uuid = gdprUuid),
ccpa = metadataArg.ccpa?.copy(uuid = ccpaUuid)
)

return ConsentStatusParamReq(
env = env,
accountId = accountId,
propertyId = propertyId,
metadata = mdArg?.let { JsonConverter.converter.encodeToString(it) } ?: "{}",
authId = authId,
localState = localState
)
}

internal fun CCPA.toCcpaCS() = CcpaCS(
applies = applies,
consentedAll = consentedAll,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sourcepoint.cmplibrary.data.network.model.optimized.consentStatus

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
internal data class ConsentStatusMetaData(
@SerialName("ccpa")
val ccpa: ConsentStatusMetaDataArg?,
@SerialName("gdpr")
val gdpr: ConsentStatusMetaDataArg?,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.sourcepoint.cmplibrary.data.network.model.optimized.consentStatus

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
internal data class ConsentStatusMetaDataArg(
@SerialName("uuid")
val uuid: String?,
@SerialName("applies")
val applies: Boolean? = null,
@SerialName("hasLocalData")
val hasLocalData: Boolean? = null,
@SerialName("dateCreated")
val dateCreated: String? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,17 @@ data class IncludeData(
) {

companion object {

/**
* Method that generates include data for /consent-status request.
*/
fun generateIncludeDataForConsentStatus(): IncludeData = IncludeData(
tcData = IncludeDataParam(IncludeDataParamType.RECORD_STRING.type),
webConsentPayload = IncludeDataParam(IncludeDataParamType.RECORD_STRING.type),
)

/**
* Method that generates include data for /messages request. This method pick out proper
* params to add to the IncludeData param of the request.
* Method that generates include data for /messages request.
*/
fun generateIncludeDataForMessages(): IncludeData = IncludeData(
tcData = IncludeDataParam(IncludeDataParamType.RECORD_STRING.type),
Expand All @@ -31,8 +39,7 @@ data class IncludeData(
)

/**
* Method that generates include data for GET /choice request. This method pick out proper
* params to add to the IncludeData param of the request.
* Method that generates include data for GET /choice request.
*/
fun generateIncludeDataForGetChoice(): IncludeData = IncludeData(
tcData = IncludeDataParam(IncludeDataParamType.RECORD_STRING.type),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,17 +175,19 @@ internal object HttpUrlManagerSingleton : HttpUrlManager {
// &includeData={"TCData": {"type": "RecordString"}}
// &withSiteActions=true

val includeData = JsonConverter.converter.encodeToString(param.includeData)

return HttpUrl.Builder()
.scheme("https")
.host(param.env.host)
.addPathSegments("wrapper/v2/consent-status")
.addQueryParameter("env", param.env.queryParam)
.addQueryParameter("accountId", param.accountId.toString())
.addQueryParameter("propertyId", param.propertyId.toString())
.addQueryParameter("hasCsp", true.toString())
.addQueryParameter("withSiteActions", false.toString())
.addQueryParameter("includeData", """{"TCData": {"type": "RecordString"}, "webConsentPayload": {"type": "RecordString"}}""")
.apply { param.authId?.let { p -> addQueryParameter("authId", p) } }
.addQueryParameter("hasCsp", param.hasCsp.toString())
.addQueryParameter("withSiteActions", param.withSiteActions.toString())
.addQueryParameter("includeData", includeData)
.addQueryParameter("authId", param.authId.toString())
.addEncodedQueryParameter("metadata", param.metadata)
.addQueryParameter("scriptType", scriptType)
.addQueryParameter("scriptVersion", scriptVersion)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.sourcepoint.cmplibrary.assertEquals
import com.sourcepoint.cmplibrary.assertNotNull
import com.sourcepoint.cmplibrary.core.Either
import com.sourcepoint.cmplibrary.data.network.model.optimized.* // ktlint-disable
import com.sourcepoint.cmplibrary.data.network.model.optimized.includeData.IncludeData
import com.sourcepoint.cmplibrary.data.network.util.Env
import com.sourcepoint.cmplibrary.data.network.util.HttpUrlManagerSingleton
import com.sourcepoint.cmplibrary.data.network.util.ResponseManager
Expand Down Expand Up @@ -248,7 +249,10 @@ class NetworkClientImplTest {
metadata = JSONObject().toString(),
env = Env.LOCAL_PROD,
authId = null,
localState = null
localState = null,
hasCsp = false,
withSiteActions = false,
includeData = IncludeData.generateIncludeDataForConsentStatus(),
)

val res = sut.getConsentStatus(param) as? Either.Left
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,10 +227,13 @@ class HttpUrlManagerTest {
metadata = JSONObject("""{"ccpa":{"applies":true}, "gdpr":{"applies":true, "uuid": "e47e539d-41dd-442b-bb08-5cf52b1e33d4", "hasLocalData": false}}""").toString(),
propertyId = 17801,
authId = "user_auth_id",
localState = null
localState = null,
hasCsp = false,
withSiteActions = false,
includeData = IncludeData.generateIncludeDataForConsentStatus(),
)
val sut = HttpUrlManagerSingleton.getConsentStatusUrl(param).toString()
sut.assertEquals("https://cdn.privacy-mgmt.com/wrapper/v2/consent-status?env=prod&accountId=22&propertyId=17801&hasCsp=true&withSiteActions=false&includeData=%7B%22TCData%22%3A%20%7B%22type%22%3A%20%22RecordString%22%7D%2C%20%22webConsentPayload%22%3A%20%7B%22type%22%3A%20%22RecordString%22%7D%7D&authId=user_auth_id&metadata={%22ccpa%22:{%22applies%22:true},%22gdpr%22:{%22applies%22:true,%22uuid%22:%22e47e539d-41dd-442b-bb08-5cf52b1e33d4%22,%22hasLocalData%22:false}}&scriptType=android&scriptVersion=${BuildConfig.VERSION_NAME}")
sut.assertEquals("https://cdn.privacy-mgmt.com/wrapper/v2/consent-status?env=prod&accountId=22&propertyId=17801&hasCsp=false&withSiteActions=false&includeData=%7B%0A%20%20%22TCData%22%3A%20%7B%0A%20%20%20%20%22type%22%3A%20%22RecordString%22%0A%20%20%7D%2C%0A%20%20%22webConsentPayload%22%3A%20%7B%0A%20%20%20%20%22type%22%3A%20%22RecordString%22%0A%20%20%7D%0A%7D&authId=user_auth_id&metadata={%22ccpa%22:{%22applies%22:true},%22gdpr%22:{%22applies%22:true,%22uuid%22:%22e47e539d-41dd-442b-bb08-5cf52b1e33d4%22,%22hasLocalData%22:false}}&scriptType=android&scriptVersion=${BuildConfig.VERSION_NAME}")
}

@Test
Expand Down Expand Up @@ -278,10 +281,13 @@ class HttpUrlManagerTest {
metadata = JSONObject("""{"ccpa":{"applies":true}, "gdpr":{"applies":true, "uuid": "e47e539d-41dd-442b-bb08-5cf52b1e33d4", "hasLocalData": false}}""").toString(),
propertyId = 17801,
authId = null,
localState = null
localState = null,
hasCsp = false,
withSiteActions = false,
includeData = IncludeData.generateIncludeDataForConsentStatus(),
)
val sut = HttpUrlManagerSingleton.getConsentStatusUrl(param).toString()
sut.assertEquals("https://cdn.privacy-mgmt.com/wrapper/v2/consent-status?env=prod&accountId=22&propertyId=17801&hasCsp=true&withSiteActions=false&includeData=%7B%22TCData%22%3A%20%7B%22type%22%3A%20%22RecordString%22%7D%2C%20%22webConsentPayload%22%3A%20%7B%22type%22%3A%20%22RecordString%22%7D%7D&metadata={%22ccpa%22:{%22applies%22:true},%22gdpr%22:{%22applies%22:true,%22uuid%22:%22e47e539d-41dd-442b-bb08-5cf52b1e33d4%22,%22hasLocalData%22:false}}&scriptType=android&scriptVersion=${BuildConfig.VERSION_NAME}")
sut.assertEquals("https://cdn.privacy-mgmt.com/wrapper/v2/consent-status?env=prod&accountId=22&propertyId=17801&hasCsp=false&withSiteActions=false&includeData=%7B%0A%20%20%22TCData%22%3A%20%7B%0A%20%20%20%20%22type%22%3A%20%22RecordString%22%0A%20%20%7D%2C%0A%20%20%22webConsentPayload%22%3A%20%7B%0A%20%20%20%20%22type%22%3A%20%22RecordString%22%0A%20%20%7D%0A%7D&authId=null&metadata={%22ccpa%22:{%22applies%22:true},%22gdpr%22:{%22applies%22:true,%22uuid%22:%22e47e539d-41dd-442b-bb08-5cf52b1e33d4%22,%22hasLocalData%22:false}}&scriptType=android&scriptVersion=${BuildConfig.VERSION_NAME}")
}

@Test
Expand Down

0 comments on commit 9338e9e

Please sign in to comment.