Skip to content

Commit

Permalink
update generation of message body for DIA-2458-review-message-param
Browse files Browse the repository at this point in the history
  • Loading branch information
bohdan-go-wombat committed Jul 31, 2023
1 parent c63686d commit 6a94a43
Show file tree
Hide file tree
Showing 13 changed files with 147 additions and 123 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ import com.sourcepoint.cmplibrary.data.network.converter.converter
import com.sourcepoint.cmplibrary.data.network.converter.genericFail
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.includeData.generateIncludeDataForMessages
import com.sourcepoint.cmplibrary.data.network.model.optimized.messages.MessagesBodyReq
import com.sourcepoint.cmplibrary.data.network.model.optimized.messages.OperatingSystemInfoParam
import com.sourcepoint.cmplibrary.data.network.util.Env
import com.sourcepoint.cmplibrary.exception.CampaignType.CCPA
import com.sourcepoint.cmplibrary.exception.CampaignType.GDPR
Expand All @@ -23,6 +26,8 @@ import com.sourcepoint.cmplibrary.model.exposed.SPConsents
import com.sourcepoint.cmplibrary.util.check
import com.sourcepoint.cmplibrary.util.extensions.toJsonObject
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonObject
import org.json.JSONArray
import org.json.JSONObject
Expand Down Expand Up @@ -160,15 +165,24 @@ private class ServiceImpl(

if (campaignManager.shouldCallMessages) {

val body = createGetMessagesRequestBody(
val operatingSystemInfo = OperatingSystemInfoParam()

val localState = campaignManager.messagesOptimizedLocalState?.jsonObject
?: JsonObject(mapOf())

val body = MessagesBodyReq(
accountId = messageReq.accountId,
propertyHref = messageReq.propertyHref,
campaigns = campaignManager.campaigns4Config,
gdprConsentStatus = campaignManager.gdprConsentStatus?.consentStatus,
ccpaConsentStatus = campaignManager.ccpaConsentStatus?.status?.name,
campaignEnv = campaignManager.spConfig.campaignsEnv,
propertyHref = "https://${messageReq.propertyHref}",
campaigns = campaignManager.campaigns4Config.toMetadataBody(
gdprConsentStatus = campaignManager.gdprConsentStatus?.consentStatus,
ccpaConsentStatus = campaignManager.ccpaConsentStatus?.status?.name,
),
campaignEnv = campaignManager.spConfig.campaignsEnv.env,
consentLanguage = campaignManager.messageLanguage.value,
localState = campaignManager.messagesOptimizedLocalState?.jsonObject,
hasCSP = false,
includeData = generateIncludeDataForMessages(),
localState = localState,
operatingSystem = operatingSystemInfo,
)

val messagesParamReq = MessagesParamReq(
Expand All @@ -177,7 +191,7 @@ private class ServiceImpl(
authId = messageReq.authId,
propertyHref = messageReq.propertyHref,
env = messageReq.env,
body = body.toString(),
body = JsonConverter.converter.encodeToString(body),
metadataArg = metadataResponse.getOrNull()?.toMetaDataArg(),
nonKeyedLocalState = campaignManager.nonKeyedLocalState?.jsonObject,
)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -68,22 +68,22 @@ internal fun createGetMessagesRequestBody(
}

internal fun List<CampaignReq>.toMetadataBody(
cs: ConsentStatus? = null,
ccpaStatus: String? = null
gdprConsentStatus: ConsentStatus? = null,
ccpaConsentStatus: String? = null
): JsonObject {
return buildJsonObject {
this@toMetadataBody.forEach { c ->
putJsonObject(c.campaignType.name.lowercase()) {
if (c.campaignType == CampaignType.GDPR) {
put(
"consentStatus",
cs?.let { JsonConverter.converter.encodeToJsonElement(it) } ?: JsonObject(mapOf())
gdprConsentStatus?.let { JsonConverter.converter.encodeToJsonElement(it) } ?: JsonObject(mapOf())
)
put("hasLocalData", cs != null)
put("hasLocalData", gdprConsentStatus != null)
}
if (c.campaignType == CampaignType.CCPA) {
put("status", ccpaStatus ?: "")
put("hasLocalData", ccpaStatus != null)
put("status", ccpaConsentStatus ?: "")
put("hasLocalData", ccpaConsentStatus != null)
}
putJsonObject("targetingParams") {
c.targetingParams.forEach { t -> put(t.key, t.value) }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.sourcepoint.cmplibrary.data.network.model.optimized.includeData

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

@Serializable
data class IncludeData(
@SerialName("localState")
val localState: IncludeDataParam? = null,
@SerialName("TCData")
val tcData: IncludeDataParam? = null,
@SerialName("campaigns")
val campaigns: IncludeDataParam? = null,
@SerialName("customVendorsResponse")
val customVendorsResponse: IncludeDataParam? = null,
@SerialName("messageMetaData")
val messageMetaData: IncludeDataParam? = null,
@SerialName("webConsentPayload")
val webConsentPayload: IncludeDataParam? = null,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.sourcepoint.cmplibrary.data.network.model.optimized.includeData

/**
* Method that generates include data for /messages request. This method pick out proper
* params to add to the IncludeData param of the request.
*/
fun generateIncludeDataForMessages(): IncludeData = IncludeData(
tcData = IncludeDataParam(IncludeDataParamType.RECORD_STRING.type),
campaigns = IncludeDataParam(IncludeDataParamType.RECORD_STRING.type),
webConsentPayload = IncludeDataParam(IncludeDataParamType.RECORD_STRING.type),
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.sourcepoint.cmplibrary.data.network.model.optimized.includeData

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

@Serializable
data class IncludeDataParam(
@SerialName("type")
val type: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.sourcepoint.cmplibrary.data.network.model.optimized.includeData

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

@Serializable
enum class IncludeDataParamType(
@SerialName("type")
val type: String,
) {
STRING("string"),
RECORD_STRING("RecordString"),
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.sourcepoint.cmplibrary.data.network.model.optimized.messages

import com.sourcepoint.cmplibrary.data.network.model.optimized.includeData.IncludeData
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonObject

@Serializable
internal data class MessagesBodyReq(
@SerialName("accountId")
val accountId: Long,
@SerialName("propertyHref")
val propertyHref: String,
@SerialName("campaigns")
val campaigns: JsonObject,
@SerialName("campaignEnv")
val campaignEnv: String?,
@SerialName("consentLanguage")
val consentLanguage: String?,
@SerialName("hasCSP")
val hasCSP: Boolean,
@SerialName("includeData")
val includeData: IncludeData,
@SerialName("localState")
val localState: JsonObject?,
@SerialName("os")
val operatingSystem: OperatingSystemInfoParam,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.sourcepoint.cmplibrary.data.network.model.optimized.messages

import android.os.Build
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
internal data class OperatingSystemInfoParam(
@SerialName("name")
val name: String? = DEFAULT_ANDROID_OS_NAME,
@SerialName("version")
val version: String? = Build.VERSION.SDK_INT.toString(),
) {

companion object {
private const val DEFAULT_ANDROID_OS_NAME = "android"
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.sourcepoint.cmplibrary.model

import com.sourcepoint.cmplibrary.data.network.model.toJsonObject
import com.sourcepoint.cmplibrary.exception.CampaignType
import com.sourcepoint.cmplibrary.model.exposed.SPCustomConsents
import org.json.JSONArray
Expand All @@ -10,42 +9,6 @@ import org.json.JSONObject
* REQUEST
*/

internal data class ConsentReq(
val uuid: String,
val choiceId: String,
val consentLanguage: String,
val meta: String,
val propertyHref: String,
val privacyManagerId: String,
val requestUUID: String,
val accountId: Int,
val actionType: Int,
val requestFromPM: Boolean,
val pubData: JSONObject = JSONObject(),
val pmSaveAndExitVariables: JSONObject = JSONObject(),
val includeData: IncludeData = IncludeData()
)

internal fun ConsentReq.toBodyRequest(): String {
return JSONObject()
.apply {
put("uuid", uuid)
put("choiceId", choiceId)
put("consentLanguage", consentLanguage)
put("meta", meta)
put("propertyHref", propertyHref)
put("privacyManagerId", privacyManagerId)
put("requestUUID", requestUUID)
put("accountId", accountId)
put("actionType", actionType)
put("requestFromPM", requestFromPM)
put("pubData", pubData)
put("includeData", includeData.toJsonObject())
put("pmSaveAndExitVariables", pmSaveAndExitVariables)
}
.toString()
}

internal class CustomConsentReq(
val consentUUID: String,
val propertyId: Int,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,3 @@ internal data class CampaignReqImpl(
override val campaignType: CampaignType,
override val groupPmId: String? = null
) : CampaignReq

data class DataType(val type: String)
data class IncludeData(
val localState: DataType = DataType("RecordString"),
val tCData: DataType = DataType("RecordString"),
val campaigns: DataType = DataType("RecordString"),
val customVendorsResponse: DataType = DataType("RecordString"),
val messageMetaData: DataType = DataType("RecordString"),
val webConsentPayload: DataType = DataType("RecordString"),
)
Original file line number Diff line number Diff line change
@@ -1,16 +1,9 @@
package com.sourcepoint.cmplibrary.data.network.model.optimized

import com.sourcepoint.cmplibrary.assertEquals
import com.sourcepoint.cmplibrary.assertTrue
import com.sourcepoint.cmplibrary.data.network.converter.JsonConverter
import com.sourcepoint.cmplibrary.data.network.converter.converter
import com.sourcepoint.cmplibrary.data.network.util.CampaignsEnv
import com.sourcepoint.cmplibrary.exception.CampaignType
import com.sourcepoint.cmplibrary.model.CampaignReqImpl
import com.sourcepoint.cmplibrary.util.file2String
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.encodeToJsonElement
import org.junit.Test

Expand All @@ -34,38 +27,6 @@ class MessagesApiModelTest {
message.campaignList[1] as GDPR
}

@Test
fun `GIVEN a ConsentStatus RETURN a messages body`() {

val json = "v7/consent_status_with_auth_id.json".file2String()
val cs = JsonConverter.converter.decodeFromString<ConsentStatusResp>(json)
val list = listOf(
CampaignReqImpl(
targetingParams = emptyList(),
campaignsEnv = CampaignsEnv.PUBLIC,
campaignType = CampaignType.GDPR,
groupPmId = null
)
)

val body = createGetMessagesRequestBody(
accountId = 22,
gdprConsentStatus = cs.consentStatusData?.gdpr?.consentStatus,
propertyHref = "tests.unified-script.com",
campaigns = list,
ccpaConsentStatus = null,
consentLanguage = null,
campaignEnv = CampaignsEnv.STAGE,
localState = JsonObject(mapOf()),
)

(body["accountId"] as JsonPrimitive).content.assertEquals("22")
(body["campaignEnv"] as JsonPrimitive).content.assertEquals("stage")
(body["propertyHref"] as JsonPrimitive).content.assertEquals("https://tests.unified-script.com")
(body["hasCSP"] as JsonPrimitive).content.assertEquals("false")
body.contains("campaigns").assertTrue()
}

@Test
fun `GIVEN IncludeData verify the output`() {
val mess = "v7/messagesObjSwitchOrder.json".file2String()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import com.sourcepoint.cmplibrary.assertTrue
import com.sourcepoint.cmplibrary.data.network.converter.JsonConverter
import com.sourcepoint.cmplibrary.data.network.converter.converter
import com.sourcepoint.cmplibrary.data.network.model.optimized.* // ktlint-disable
import com.sourcepoint.cmplibrary.data.network.model.optimized.includeData.generateIncludeDataForMessages
import com.sourcepoint.cmplibrary.data.network.model.optimized.messages.MessagesBodyReq
import com.sourcepoint.cmplibrary.data.network.model.optimized.messages.OperatingSystemInfoParam
import com.sourcepoint.cmplibrary.exception.CampaignType
import com.sourcepoint.cmplibrary.model.CampaignReqImpl
import com.sourcepoint.cmplibrary.model.PMTab
Expand All @@ -15,6 +18,7 @@ import com.sourcepoint.cmplibrary.model.exposed.ActionType
import com.sourcepoint.cmplibrary.model.exposed.MessageSubCategory.* //ktlint-disable
import com.sourcepoint.cmplibrary.util.file2String
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.JsonObject
import org.json.JSONObject
import org.junit.Test
Expand Down Expand Up @@ -295,27 +299,34 @@ class HttpUrlManagerTest {
)
)

val body = createGetMessagesRequestBody(
val operatingSystemInfo = OperatingSystemInfoParam()

val body = MessagesBodyReq(
accountId = 22,
gdprConsentStatus = cs.consentStatusData?.gdpr?.consentStatus,
propertyHref = "tests.unified-script.com",
campaigns = list,
ccpaConsentStatus = null,
propertyHref = "https://tests.unified-script.com",
campaigns = list.toMetadataBody(
gdprConsentStatus = cs.consentStatusData?.gdpr?.consentStatus,
ccpaConsentStatus = null,
),
campaignEnv = CampaignsEnv.STAGE.env,
consentLanguage = "ES",
campaignEnv = CampaignsEnv.STAGE,
hasCSP = false,
includeData = generateIncludeDataForMessages(),
localState = JsonObject(mapOf()),
operatingSystem = operatingSystemInfo,
)

val param = MessagesParamReq(
env = Env.PROD,
body = body.toString(),
body = JsonConverter.converter.encodeToString(body),
metadataArg = JsonConverter.converter.decodeFromString("""{"ccpa":{"applies":true},"gdpr":{"applies":true}}"""),
authId = null,
accountId = 1212,
propertyId = 12,
propertyHref = "asdfasdfasd"
)
val sut = HttpUrlManagerSingleton.getMessagesUrl(param).toString()
sut.assertEquals("https://cdn.privacy-mgmt.com/wrapper/v2/messages?env=prod&nonKeyedLocalState=%7B%7D&body={%22accountId%22:22,%22propertyHref%22:%22https://tests.unified-script.com%22,%22campaigns%22:{%22gdpr%22:{%22consentStatus%22:{%22consentedAll%22:true,%22consentedToAny%22:false,%22granularStatus%22:{%22defaultConsent%22:false,%22previousOptInAll%22:false,%22purposeConsent%22:%22ALL%22,%22purposeLegInt%22:%22ALL%22,%22vendorConsent%22:%22ALL%22,%22vendorLegInt%22:%22ALL%22},%22hasConsentData%22:false,%22rejectedAny%22:false,%22rejectedLI%22:false},%22hasLocalData%22:true,%22targetingParams%22:{}}},%22campaignEnv%22:%22stage%22,%22consentLanguage%22:%22ES%22,%22hasCSP%22:false,%22includeData%22:{%22TCData%22:{%22type%22:%22RecordString%22},%22campaigns%22:{%22type%22:%22RecordString%22},%22webConsentPayload%22:{%22type%22:%22RecordString%22}},%22localState%22:{},%22os%22:{%22name%22:%22android%22,%22version%22:%220%22}}&metadata={%20%20%22ccpa%22:%20{%20%20%20%20%22applies%22:%20true%20%20},%20%20%22gdpr%22:%20{%20%20%20%20%22applies%22:%20true%20%20}}&scriptType=android&scriptVersion=${BuildConfig.VERSION_NAME}")
print("URL - $sut")
sut.assertEquals("https://cdn.privacy-mgmt.com/wrapper/v2/messages?env=prod&nonKeyedLocalState=%7B%7D&body={%20%20%22accountId%22:%2022,%20%20%22propertyHref%22:%20%22https://tests.unified-script.com%22,%20%20%22campaigns%22:%20{%20%20%20%20%22gdpr%22:%20{%20%20%20%20%20%20%22consentStatus%22:%20{%20%20%20%20%20%20%20%20%22consentedAll%22:%20true,%20%20%20%20%20%20%20%20%22consentedToAny%22:%20false,%20%20%20%20%20%20%20%20%22granularStatus%22:%20{%20%20%20%20%20%20%20%20%20%20%22defaultConsent%22:%20false,%20%20%20%20%20%20%20%20%20%20%22previousOptInAll%22:%20false,%20%20%20%20%20%20%20%20%20%20%22purposeConsent%22:%20%22ALL%22,%20%20%20%20%20%20%20%20%20%20%22purposeLegInt%22:%20%22ALL%22,%20%20%20%20%20%20%20%20%20%20%22vendorConsent%22:%20%22ALL%22,%20%20%20%20%20%20%20%20%20%20%22vendorLegInt%22:%20%22ALL%22%20%20%20%20%20%20%20%20},%20%20%20%20%20%20%20%20%22hasConsentData%22:%20false,%20%20%20%20%20%20%20%20%22rejectedAny%22:%20false,%20%20%20%20%20%20%20%20%22rejectedLI%22:%20false%20%20%20%20%20%20},%20%20%20%20%20%20%22hasLocalData%22:%20true,%20%20%20%20%20%20%22targetingParams%22:%20{%20%20%20%20%20%20}%20%20%20%20}%20%20},%20%20%22campaignEnv%22:%20%22stage%22,%20%20%22consentLanguage%22:%20%22ES%22,%20%20%22hasCSP%22:%20false,%20%20%22includeData%22:%20{%20%20%20%20%22TCData%22:%20{%20%20%20%20%20%20%22type%22:%20%22RecordString%22%20%20%20%20},%20%20%20%20%22campaigns%22:%20{%20%20%20%20%20%20%22type%22:%20%22RecordString%22%20%20%20%20},%20%20%20%20%22webConsentPayload%22:%20{%20%20%20%20%20%20%22type%22:%20%22RecordString%22%20%20%20%20}%20%20},%20%20%22localState%22:%20{%20%20},%20%20%22os%22:%20{%20%20%20%20%22name%22:%20%22android%22,%20%20%20%20%22version%22:%20%220%22%20%20}}&metadata={%20%20%22ccpa%22:%20{%20%20%20%20%22applies%22:%20true%20%20},%20%20%22gdpr%22:%20{%20%20%20%20%22applies%22:%20true%20%20}}&scriptType=android&scriptVersion=${BuildConfig.VERSION_NAME}")
}
}

0 comments on commit 6a94a43

Please sign in to comment.