Skip to content

Commit

Permalink
refactor: route changes (#13)
Browse files Browse the repository at this point in the history
  • Loading branch information
grablack committed Nov 30, 2023
1 parent bc58ce2 commit 6434e30
Show file tree
Hide file tree
Showing 10 changed files with 141 additions and 34 deletions.
12 changes: 6 additions & 6 deletions library/src/main/java/com/paypal/messages/ModalFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -384,9 +384,9 @@ internal class ModalFragment constructor(
val shared = jsonElementToMutableMap(sharedJson)
when (name) {
"onClick" -> {
val linkName = args.get("link_name")?.asString
val linkSrc = args.get("link_src")?.asString
if (linkName == "Apply Now") {
val pageViewLinkName = args.get("page_view_link_name")?.asString
val pageViewLinkSource = args.get("page_view_link_source")?.asString
if (pageViewLinkName == "Apply Now") {
this.onApply()
}
else {
Expand All @@ -395,8 +395,8 @@ internal class ModalFragment constructor(
logEvent(
TrackingEvent(
eventType = EventType.MODAL_CLICK,
linkSrc = linkSrc,
linkName = linkName,
pageViewLinkSource = pageViewLinkSource,
pageViewLinkName = pageViewLinkName,
),
shared,
)
Expand Down Expand Up @@ -468,7 +468,7 @@ internal class ModalFragment constructor(
buyerCountryCode = this.buyerCountry,
type = ComponentType.MODAL.toString(),
instanceId = this.instanceId.toString(),
events = mutableListOf(event),
componentEvents = mutableListOf(event),
__shared__ = dynamicKeys,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -424,8 +424,8 @@ class PayPalMessageView @JvmOverloads constructor(
logEvent(
TrackingEvent(
eventType = EventType.MESSAGE_CLICK,
linkName = "banner_wrapper",
linkSrc = "message",
pageViewLinkName = "banner_wrapper",
pageViewLinkSource = "message",
),
)
showWebView(response)
Expand Down Expand Up @@ -555,7 +555,7 @@ class PayPalMessageView @JvmOverloads constructor(
instanceId = Api.instanceId.toString(),
originatingInstanceId = Api.originatingInstanceId.toString(),
sessionId = Api.sessionId.toString(),
events = mutableListOf(event),
componentEvents = mutableListOf(event),
)

Logger.getInstance(clientId = clientId).log(context, component)
Expand Down
15 changes: 11 additions & 4 deletions library/src/main/java/com/paypal/messages/io/Api.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.paypal.messages.io
import android.content.Context
import com.google.gson.Gson
import com.paypal.messages.BuildConfig
import com.paypal.messages.logger.CloudEvent
import com.paypal.messages.logger.TrackingPayload
import com.paypal.messages.utils.LogCat
import com.paypal.messages.utils.PayPalErrors
Expand Down Expand Up @@ -46,12 +47,19 @@ object Api {

private val rootUrl = ROOT_URLS[environment]
private val presentmentUrl = if (environment === Env.LOCAL) "$rootUrl:8000" else "$rootUrl"
private val loggerUrl = if (environment === Env.LOCAL) "$rootUrl:9090" else "$rootUrl"
private val loggerBase: String = when (environment) {
Env.LIVE -> "https://api.paypal.com"
Env.SANDBOX -> "https://api.sandbox.paypal.com"
Env.STAGE -> "$rootUrl"
Env.STAGE_VPN -> "$rootUrl"
Env.LOCAL -> "$rootUrl:9090"
}
val loggerEnd = "v1/credit/upstream-messaging-events"

val messageData = "$presentmentUrl/credit-presentment/native/message".toHttpUrl()
val messageHash = "$presentmentUrl/credit-presentment/merchant-profile".toHttpUrl()
val modalData = "$presentmentUrl/credit-presentment/lander/modal".toHttpUrl()
val logger = "$loggerUrl/track/native".toHttpUrl()
val logger = "$loggerBase/$loggerEnd".toHttpUrl()
}

private fun HttpUrl.Builder.setMessageDataQuery(config: MessageConfig, hash: String?) {
Expand Down Expand Up @@ -251,8 +259,7 @@ object Api {
}

fun callLoggerEndpoint(payload: TrackingPayload) {
// TODO, Ensure __shared__ property is correctly converted and added to json payload
val json = gson.toJson(payload)
val json = gson.toJson(CloudEvent(data = payload))
val request = createLoggerRequest(json)
val response = client.newCall(request).execute()
response.body?.string()?.let { LogCat.debug(TAG, "callLoggerEndpoint response: $it") }
Expand Down
29 changes: 29 additions & 0 deletions library/src/main/java/com/paypal/messages/logger/CloudEvent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.paypal.messages.logger

import com.google.gson.annotations.SerializedName
import java.text.SimpleDateFormat
import java.util.Date
import java.util.UUID

data class CloudEvent(
@SerializedName("specversion")
val specVersion: String = "1.0",
val id: UUID = UUID.randomUUID(),
val type: String = "com.paypal.credit.upstream-presentment.v1",
val source: String = "urn:paypal:event-src:v1:android:messages",
@SerializedName("datacontenttype")
val dataContentType: String = "application/json",
@Suppress("ktlint:standard:max-line-length")
@SerializedName("dataschema")
val dataSchema: String = "ppaas:events.credit.FinancingPresentmentAsyncAPISpecification/v1/schema/json/credit_upstream_presentment_event.json",
var time: String = "",
val data: TrackingPayload,
) {
init {
val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
val currentDate = Date()

val formattedDate = dateFormat.format(currentDate)
time = formattedDate
}
}
6 changes: 3 additions & 3 deletions library/src/main/java/com/paypal/messages/logger/Logger.kt
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,8 @@ class Logger private constructor() {
val oldComponent = this.payload?.components?.find { it.instanceId == component.instanceId }

if (oldComponent != null) {
val oldEvents = oldComponent.events
component.events.addAll(0, oldEvents)
val oldEvents = oldComponent.componentEvents
component.componentEvents.addAll(0, oldEvents)

val index = this.payload?.components?.indexOfFirst { it.instanceId == component.instanceId }

Expand All @@ -120,7 +120,7 @@ class Logger private constructor() {
val localStorage = LocalStorage(context)
val hash = localStorage.merchantHash
val payloadSummary = finalPayload.components.joinToString("\n") {
val eventsString = it.events.joinToString { event -> event.eventType.toString() }
val eventsString = it.componentEvents.joinToString { event -> event.eventType.toString() }
" type: ${it.type}\n instanceId: ${it.instanceId}\n events: $eventsString\n"
}
LogCat.debug(TAG, "merchantHash: ${hash}\npayloadSummary:\n$payloadSummary")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ data class TrackingComponent(
val originatingInstanceId: String? = null,
@SerializedName("session_id")
val sessionId: String? = null,
@SerializedName("events")
val events: MutableList<TrackingEvent>,
@SerializedName("component_events")
val componentEvents: MutableList<TrackingEvent>,

// Dynamic Properties, not serialized by default
val __shared__: MutableMap<String, Any>? = mutableMapOf(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ data class TrackingEvent(
var renderDuration: Int? = null,
@SerializedName("request_duration")
var requestDuration: Int? = null,
@SerializedName("link_name")
var linkName: String? = null,
@SerializedName("link_src")
var linkSrc: String? = null,
@SerializedName("page_view_link_name")
var pageViewLinkName: String? = null,
@SerializedName("page_view_link_source")
var pageViewLinkSource: String? = null,
@SerializedName("data")
var data: String? = null,
@SerializedName("error_name")
Expand Down
71 changes: 71 additions & 0 deletions library/src/test/java/com/paypal/messages/logger/CloudEventTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.paypal.messages.logger

import com.google.gson.Gson
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

class CloudEventTest {
private val clientId = "test_client_id"
private val merchantId = "test_merchant_id"
private val partnerAttributionId = "test_partner_attribution_id"
private val merchantProfileHash = "test_merchant_profile_hash"
private val deviceId = "test_device_id"
private val sessionId = "test_session_id"
private val instanceId = "test_instance_id"
private val integrationName = "test_integration_name"
private val integrationType = "test_integration_type"
private val integrationVersion = "test_integration_version"
private val libraryVersion = "test_library_version"
private val components = mutableListOf<TrackingComponent>()
private val specVersion = "1.0"
private val type = "com.paypal.credit.upstream-presentment.v1"
private val source = "urn:paypal:event-src:v1:android:messages"
private val dataContentType = "application/json"

@Suppress("ktlint:standard:max-line-length")
private val dataSchema = "ppaas:events.credit.FinancingPresentmentAsyncAPISpecification/v1/schema/json/credit_upstream_presentment_event.json"

private val data = TrackingPayload(
clientId = clientId,
merchantId = merchantId,
partnerAttributionId = partnerAttributionId,
merchantProfileHash = merchantProfileHash,
deviceId = deviceId,
sessionId = sessionId,
instanceId = instanceId,
integrationName = integrationName,
integrationType = integrationType,
integrationVersion = integrationVersion,
libraryVersion = libraryVersion,
components = components,
)

private val cloudWrappedEvent = CloudEvent(
specVersion = specVersion,
type = type,
source = source,
dataContentType = dataContentType,
dataSchema = dataSchema,
data = data,
)

@Test
fun testConstructor() {
assertEquals(cloudWrappedEvent.specVersion, specVersion)
assertEquals(cloudWrappedEvent.type, type)
assertEquals(cloudWrappedEvent.source, source)
assertEquals(cloudWrappedEvent.dataContentType, dataContentType)
assertEquals(cloudWrappedEvent.dataSchema, dataSchema)
assertEquals(cloudWrappedEvent.data, data)
}

@Test
fun testSerialization() {
val gson = Gson()
val json = gson.toJson(cloudWrappedEvent)

@Suppress("ktlint:standard:max-line-length")
val expectedJson = """{"specversion":"1.0","id":"${cloudWrappedEvent.id}","type":"com.paypal.credit.upstream-presentment.v1","source":"urn:paypal:event-src:v1:android:messages","datacontenttype":"application/json","dataschema":"ppaas:events.credit.FinancingPresentmentAsyncAPISpecification/v1/schema/json/credit_upstream_presentment_event.json","time":"${cloudWrappedEvent.time}","data":{"client_id":"test_client_id","merchant_id":"test_merchant_id","partner_attribution_id":"test_partner_attribution_id","merchant_profile_hash":"test_merchant_profile_hash","device_id":"test_device_id","session_id":"test_session_id","instance_id":"test_instance_id","integration_name":"test_integration_name","integration_type":"test_integration_type","integration_version":"test_integration_version","lib_version":"test_library_version","components":[]}}"""
assertEquals(expectedJson, json)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class TrackingComponentTest {
private val instanceId = "test_instance_id"
private val originatingInstanceId = "test_originating_instance_id"
private val sessionId = "test_session_id"
private val events = mutableListOf(TrackingEvent(EventType.MESSAGE_CLICK))
private val componentEvents = mutableListOf(TrackingEvent(EventType.MESSAGE_CLICK))

private val trackingComponent = TrackingComponent(
offerType = offerType,
Expand All @@ -58,9 +58,9 @@ class TrackingComponentTest {
instanceId = instanceId,
originatingInstanceId = originatingInstanceId,
sessionId = sessionId,
events = events,
componentEvents = componentEvents,
)

@Test
fun testConstructor() {
assertEquals(offerType, trackingComponent.offerType)
Expand All @@ -86,7 +86,7 @@ class TrackingComponentTest {
assertEquals(instanceId, trackingComponent.instanceId)
assertEquals(originatingInstanceId, trackingComponent.originatingInstanceId)
assertEquals(sessionId, trackingComponent.sessionId)
assertEquals(events, trackingComponent.events)
assertEquals(componentEvents, trackingComponent.componentEvents)
}

@Test
Expand All @@ -95,7 +95,7 @@ class TrackingComponentTest {
val json = gson.toJson(trackingComponent)

@Suppress("ktlint:standard:max-line-length")
val expectedJson = """{"offer_type":"PAY_LATER_SHORT_TERM","amount":"100.00","placement":"CART","buyer_country_code":"US","channel":"NATIVE","style_logo_type":"ALTERNATIVE","style_color":"MONOCHROME","style_text_align":"CENTER","message_type":"OFFER","views":["VIEW"],"qualified_products":["PRODUCT"],"fdata":"test_fdata","debug_id":"test_debug_id","experimentation_experience_ids":["EXP_1","EXP_2"],"experimentation_treatment_ids":["TRT_1","TRT_2"],"credit_product_identifiers":["CPI_1","CPI_2"],"offer_country_code":"US","merchant_country_code":"US","type":"OFFER","instance_id":"test_instance_id","originating_instance_id":"test_originating_instance_id","session_id":"test_session_id","events":[{"event_type":"MESSAGE_CLICK"}],"__shared__":{}}"""
val expectedJson = """{"offer_type":"PAY_LATER_SHORT_TERM","amount":"100.00","placement":"CART","buyer_country_code":"US","channel":"NATIVE","style_logo_type":"ALTERNATIVE","style_color":"MONOCHROME","style_text_align":"CENTER","message_type":"OFFER","views":["VIEW"],"qualified_products":["PRODUCT"],"fdata":"test_fdata","debug_id":"test_debug_id","experimentation_experience_ids":["EXP_1","EXP_2"],"experimentation_treatment_ids":["TRT_1","TRT_2"],"credit_product_identifiers":["CPI_1","CPI_2"],"offer_country_code":"US","merchant_country_code":"US","type":"OFFER","instance_id":"test_instance_id","originating_instance_id":"test_originating_instance_id","session_id":"test_session_id","component_events":[{"event_type":"MESSAGE_CLICK"}],"__shared__":{}}"""
assertEquals(expectedJson, json)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ class TrackingEventTest {
private val eventType = EventType.MESSAGE_CLICK
private val renderDuration = 100
private val requestDuration = 200
private val linkName = "test_link_name"
private val linkSrc = "test_link_src"
private val pageViewLinkName = "test_link_name"
private val pageViewLinkSource = "test_link_src"
private val data = "test_data"
private val errorName = "test_error_name"
private val errorDescription = "test_error_description"
Expand All @@ -18,8 +18,8 @@ class TrackingEventTest {
eventType = eventType,
renderDuration = renderDuration,
requestDuration = requestDuration,
linkName = linkName,
linkSrc = linkSrc,
pageViewLinkName = pageViewLinkName,
pageViewLinkSource = pageViewLinkSource,
data = data,
errorName = errorName,
errorDescription = errorDescription,
Expand All @@ -30,8 +30,8 @@ class TrackingEventTest {
assertEquals(eventType, trackingEvent.eventType)
assertEquals(renderDuration, trackingEvent.renderDuration)
assertEquals(requestDuration, trackingEvent.requestDuration)
assertEquals(linkName, trackingEvent.linkName)
assertEquals(linkSrc, trackingEvent.linkSrc)
assertEquals(pageViewLinkName, trackingEvent.pageViewLinkName)
assertEquals(pageViewLinkSource, trackingEvent.pageViewLinkSource)
assertEquals(data, trackingEvent.data)
assertEquals(errorName, trackingEvent.errorName)
assertEquals(errorDescription, trackingEvent.errorDescription)
Expand All @@ -43,7 +43,7 @@ class TrackingEventTest {
val json = gson.toJson(trackingEvent)

@Suppress("ktlint:standard:max-line-length")
val expectedJson = """{"event_type":"MESSAGE_CLICK","render_duration":100,"request_duration":200,"link_name":"test_link_name","link_src":"test_link_src","data":"test_data","error_name":"test_error_name","error_description":"test_error_description"}"""
val expectedJson = """{"event_type":"MESSAGE_CLICK","render_duration":100,"request_duration":200,"page_view_link_name":"test_link_name","page_view_link_source":"test_link_src","data":"test_data","error_name":"test_error_name","error_description":"test_error_description"}"""
assertEquals(expectedJson, json)
}
}

0 comments on commit 6434e30

Please sign in to comment.