feat: fix ecommerce encoding

This commit is contained in:
Kevin Franklin Kim 2024-05-27 13:28:27 +02:00
parent 3bd292ec56
commit f021853848
No known key found for this signature in database
3 changed files with 47 additions and 25 deletions

View File

@ -4,12 +4,11 @@ import (
"maps"
"github.com/foomo/sesamy-go/pkg/encoding/gtag"
"github.com/foomo/sesamy-go/pkg/encoding/mpv2"
"github.com/mitchellh/mapstructure"
"github.com/pkg/errors"
)
func MPv2[P any](source gtag.Payload, target *mpv2.Payload[P]) error {
func MPv2(source gtag.Payload, target any) error {
var sourceData map[string]any
// encode gtag event to map
dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{

View File

@ -5,13 +5,12 @@ import (
"fmt"
"strconv"
"github.com/foomo/sesamy-go/pkg/encoding/gtag"
"github.com/foomo/sesamy-go/pkg/encoding/mpv2"
"github.com/mitchellh/mapstructure"
"github.com/pkg/errors"
)
func GTag[P any](source mpv2.Payload[P], target *gtag.Payload) error {
func GTag[P any](source mpv2.Payload[P], target any) error {
targetData := map[string]any{
"client_id": source.ClientID,
"user_id": source.UserID,
@ -50,23 +49,18 @@ func GTag[P any](source mpv2.Payload[P], target *gtag.Payload) error {
targetData["event_name"] = sourceData["name"]
if params, ok := sourceData["params"].(map[string]any); ok {
targetEcommerceData := map[string]any{
"currency": params["currency"],
"promotion_id": params["promotion_id"],
"promotion_name": params["promotion_name"],
"location_id": params["location_id"],
"is_conversion": params["is_conversion"],
}
targetData["currency"] = params["currency"]
targetData["promotion_id"] = params["promotion_id"]
targetData["promotion_name"] = params["promotion_name"]
targetData["location_id"] = params["location_id"]
targetData["is_conversion"] = params["is_conversion"]
targetData["items"] = params["items"]
delete(params, "currency")
delete(params, "promotion_id")
delete(params, "promotion_name")
delete(params, "location_id")
delete(params, "is_conversion")
targetData["ecommerce"] = targetEcommerceData
targetData["items"] = params["items"]
delete(params, "items")
{ // user_property
targetEventProperty := map[string]any{}
targetEventPropertyNumber := map[string]any{}
@ -91,7 +85,7 @@ func GTag[P any](source mpv2.Payload[P], target *gtag.Payload) error {
dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
WeaklyTypedInput: true,
Squash: true,
Result: &target,
Result: target,
TagName: "json",
IgnoreUntaggedFields: true,
})

View File

@ -6,16 +6,18 @@ import (
"net/url"
"testing"
"github.com/foomo/gostandards/iso4217"
"github.com/foomo/sesamy-go/pkg/encoding/gtag"
"github.com/foomo/sesamy-go/pkg/encoding/gtagencode"
"github.com/foomo/sesamy-go/pkg/encoding/mpv2"
"github.com/foomo/sesamy-go/pkg/encoding/mpv2encode"
"github.com/foomo/sesamy-go/pkg/event/params"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSelectItem(t *testing.T) {
query := "v=2&tid=G-F9XM71K45T&gtm=45he4580v9184715813z89184708445za200&_p=1715430403224&_dbg=1&gcd=13l3l3l2l1&npa=1&dma_cps=sypham&dma=1&cid=179294588.1715353601&ecid=251283723&ul=en-us&sr=3840x1600&_fplc=0&ur=&uaa=arm&uab=64&uafvl=Chromium%3B124.0.6367.119%7CGoogle%2520Chrome%3B124.0.6367.119%7CNot-A.Brand%3B99.0.0.0&uamb=0&uam=&uap=macOS&uapv=14.4.1&uaw=0&are=1&frm=0&pscdl=noapi&sst.gcd=13l3l3l2l1&sst.tft=1715430403224&sst.ude=0&_s=3&sid=1715428762&sct=2&seg=1&dl=https%3A%2F%2Fsesamy.local.bestbytes.net%2F%3Fgtm_debug%3D1715430402906&dr=https%3A%2F%2Ftagassistant.google.com%2F&dt=Home&en=select_item&pr1=idSKU_12345~nmStan%20and%20Friends%20Tee~afGoogle%20Merchandise%20Store~cpSUMMER_FUN~ds2.22~lp0~brGoogle~caApparel~c2Adult~c3Shirts~c4Crew~c5Short%20sleeve~lirelated_products~lnRelated%20Products~vagreen~loChIJIQBpAG2ahYAR_6128GcTUEo~pr10.01~qt3&ep.item_list_id=related_products&ep.item_list_name=Related%20products&_et=89&tfd=8618&richsstsse"
query := "v=2&tid=G-F9XM71K45T&gtm=45he45m0v9184715813z89184708445za200zb9184708445&_p=1716795486104&_dbg=1&gcd=13l3l3l2l1&npa=1&dma_cps=sypham&dma=1&cid=179294588.1715353601&ecid=2065234266&ul=en-us&sr=2056x1329&_fplc=0&ur=&uaa=arm&uab=64&uafvl=Chromium%3B124.0.6367.201%7CGoogle%2520Chrome%3B124.0.6367.201%7CNot-A.Brand%3B99.0.0.0&uamb=0&uam=&uap=macOS&uapv=14.4.1&uaw=0&are=1&frm=0&pscdl=noapi&sst.gcd=13l3l3l2l1&sst.tft=1716795486104&sst.ude=0&_s=18&cu=USD&sid=1716807360&sct=16&seg=1&dl=https%3A%2F%2Fsesamy.local.bestbytes.net%2F%3Fgtm_debug%3D1716795486020&dr=https%3A%2F%2Ftagassistant.google.com%2F&dt=Home&en=remove_from_cart&pr1=idSKU_12345~nmStan%20and%20Friends%20Tee~afGoogle%20Merchandise%20Store~cpSUMMER_FUN~ds2.22~lp0~brGoogle~caApparel~c2Adult~c3Shirts~c4Crew~c5Short%20sleeve~lirelated_products~lnRelated%20Products~vagreen~loChIJIQBpAG2ahYAR_6128GcTUEo~pr10.01~qt3&ep.enable_page_views=false&epn.value=30.03&_et=10086&tfd=9253808&richsstsse"
values, err := url.ParseQuery(query)
require.NoError(t, err)
@ -23,9 +25,12 @@ func TestSelectItem(t *testing.T) {
err = gtag.Decode(values, &incoming)
require.NoError(t, err)
var intermediate mpv2.Payload[params.SelectItem[params.Item]]
var intermediate *mpv2.Payload[params.RemoveFromCart[params.Item]]
err = gtagencode.MPv2(incoming, &intermediate)
require.NoError(t, err)
assert.Equal(t, iso4217.USD, intermediate.Events[0].Params.Currency)
intermediate.Events[0].Params.Currency = iso4217.EUR
{
out, err := json.MarshalIndent(intermediate, "", " ")
@ -33,12 +38,36 @@ func TestSelectItem(t *testing.T) {
fmt.Println(string(out))
}
// var outgoing gtag.Event
// err = event.Encode(intermediate, &outgoing)
// require.NoError(t, err)
// assert.Equal(t, incoming, outgoing)
err = mpv2encode.GTag(intermediate, &incoming)
var outgoing gtag.Payload
err = mpv2encode.GTag(*intermediate, &outgoing)
require.NoError(t, err)
// assert.Equal(t, incoming, outgoing)
assert.Equal(t, iso4217.EUR, gtag.Get(outgoing.ECommerce.Currency))
}
func TestSelectItem_Pointer(t *testing.T) {
query := "v=2&tid=G-F9XM71K45T&gtm=45he45m0v9184715813z89184708445za200zb9184708445&_p=1716795486104&_dbg=1&gcd=13l3l3l2l1&npa=1&dma_cps=sypham&dma=1&cid=179294588.1715353601&ecid=2065234266&ul=en-us&sr=2056x1329&_fplc=0&ur=&uaa=arm&uab=64&uafvl=Chromium%3B124.0.6367.201%7CGoogle%2520Chrome%3B124.0.6367.201%7CNot-A.Brand%3B99.0.0.0&uamb=0&uam=&uap=macOS&uapv=14.4.1&uaw=0&are=1&frm=0&pscdl=noapi&sst.gcd=13l3l3l2l1&sst.tft=1716795486104&sst.ude=0&_s=18&cu=USD&sid=1716807360&sct=16&seg=1&dl=https%3A%2F%2Fsesamy.local.bestbytes.net%2F%3Fgtm_debug%3D1716795486020&dr=https%3A%2F%2Ftagassistant.google.com%2F&dt=Home&en=remove_from_cart&pr1=idSKU_12345~nmStan%20and%20Friends%20Tee~afGoogle%20Merchandise%20Store~cpSUMMER_FUN~ds2.22~lp0~brGoogle~caApparel~c2Adult~c3Shirts~c4Crew~c5Short%20sleeve~lirelated_products~lnRelated%20Products~vagreen~loChIJIQBpAG2ahYAR_6128GcTUEo~pr10.01~qt3&ep.enable_page_views=false&epn.value=30.03&_et=10086&tfd=9253808&richsstsse"
values, err := url.ParseQuery(query)
require.NoError(t, err)
var incoming *gtag.Payload
err = gtag.Decode(values, &incoming)
require.NoError(t, err)
var intermediate *mpv2.Payload[params.RemoveFromCart[params.Item]]
err = gtagencode.MPv2(*incoming, &intermediate)
require.NoError(t, err)
assert.Equal(t, iso4217.USD, intermediate.Events[0].Params.Currency)
// override value
intermediate.Events[0].Params.Currency = iso4217.EUR
// {
// out, err := json.MarshalIndent(intermediate, "", " ")
// require.NoError(t, err)
// fmt.Println(string(out))
// }
err = mpv2encode.GTag(*intermediate, incoming)
require.NoError(t, err)
assert.Equal(t, iso4217.EUR, gtag.Get(incoming.ECommerce.Currency))
}