From 683a110ecd3afdb4dfb7c7310240edda190a3abd Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Tue, 25 Feb 2025 10:36:56 +0100 Subject: [PATCH 1/4] feat: add status command --- cmd/list/list.go | 2 ++ cmd/list/server.go | 1 + cmd/list/web.go | 1 + 3 files changed, 4 insertions(+) diff --git a/cmd/list/list.go b/cmd/list/list.go index 7ce9d54..9935e07 100644 --- a/cmd/list/list.go +++ b/cmd/list/list.go @@ -34,6 +34,8 @@ func dump(i interface{ MarshalJSON() ([]byte, error) }, err error) error { func list(l *slog.Logger, tm *tagmanager.TagManager, resource string) error { switch resource { + case "status": + return dump(tm.Service().Accounts.Containers.Workspaces.GetStatus(tm.WorkspacePath()).Do()) case "clients": return dump(tm.Service().Accounts.Containers.Workspaces.Clients.List(tm.WorkspacePath()).Do()) case "tags": diff --git a/cmd/list/server.go b/cmd/list/server.go index 35b19a1..7bfe9c2 100644 --- a/cmd/list/server.go +++ b/cmd/list/server.go @@ -17,6 +17,7 @@ func NewServer(root *cobra.Command) { "clients", "folders", "gtag-config", + "status", "tags", "templates", "templates-data", diff --git a/cmd/list/web.go b/cmd/list/web.go index 1d500b2..39e06b1 100644 --- a/cmd/list/web.go +++ b/cmd/list/web.go @@ -16,6 +16,7 @@ func NewWeb(root *cobra.Command) { "built-in-variables", "folders", "gtag-config", + "status", "tags", "templates", "templates-data", From 03a62d1b055106a9e6ace3971da6c4d99246349b Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Tue, 25 Feb 2025 10:37:22 +0100 Subject: [PATCH 2/4] fix(criteo): add application id --- pkg/config/criteo.go | 2 ++ pkg/provider/criteo/constants.go | 1 + pkg/provider/criteo/server.go | 7 ++++++- pkg/provider/criteo/server/tag/eventsapitag.go | 12 +++++++++--- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/pkg/config/criteo.go b/pkg/config/criteo.go index 3dbdee5..f941f4e 100644 --- a/pkg/config/criteo.go +++ b/pkg/config/criteo.go @@ -11,6 +11,8 @@ type Criteo struct { CallerID string `json:"callerId" yaml:"callerId"` // Criteo partner id PartnerID string `json:"partnerId" yaml:"partnerId"` + // Criteo application id + ApplicationID string `json:"applicationId" yaml:"applicationId"` // Google Consent settings GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"` // Google Tag Manager server container settings diff --git a/pkg/provider/criteo/constants.go b/pkg/provider/criteo/constants.go index 77e35c3..4c9eb5f 100644 --- a/pkg/provider/criteo/constants.go +++ b/pkg/provider/criteo/constants.go @@ -5,6 +5,7 @@ const ( Name = "Criteo" NameCallerID = "Criteo Caller ID" NamePartnerID = "Criteo Partner ID" + NameApplicationID = "Criteo Application ID" NameCriteoEventsAPITemplate = "Criteo Events API" NameCriteoUserIdentificationTag = "Criteo User Identification" NameCriteoUserIdentificationTemplate = "Criteo User Identification" diff --git a/pkg/provider/criteo/server.go b/pkg/provider/criteo/server.go index 9edeca2..6d348d5 100644 --- a/pkg/provider/criteo/server.go +++ b/pkg/provider/criteo/server.go @@ -42,6 +42,11 @@ func Server(l *slog.Logger, tm *tagmanager.TagManager, cfg config.Criteo) error return err } + applicationID, err := tm.UpsertVariable(commonvariable.NewConstant(NameApplicationID, cfg.ApplicationID)) + if err != nil { + return err + } + eventParameters, err := utils.LoadEventParams(cfg.ServerContainer) if err != nil { return err @@ -65,7 +70,7 @@ func Server(l *slog.Logger, tm *tagmanager.TagManager, cfg config.Criteo) error return errors.Wrap(err, "failed to upsert event trigger: "+event) } - if _, err := tm.UpsertTag(servertagx.NewEventsAPITag(event, callerID, partnerID, template, eventTrigger)); err != nil { + if _, err := tm.UpsertTag(servertagx.NewEventsAPITag(event, callerID, partnerID, applicationID, template, eventTrigger)); err != nil { return err } } diff --git a/pkg/provider/criteo/server/tag/eventsapitag.go b/pkg/provider/criteo/server/tag/eventsapitag.go index a50d0d9..bcea0d5 100644 --- a/pkg/provider/criteo/server/tag/eventsapitag.go +++ b/pkg/provider/criteo/server/tag/eventsapitag.go @@ -9,7 +9,7 @@ func EventsAPITagName(v string) string { return "Criteo - " + v } -func NewEventsAPITag(name string, callerID, partnerID *tagmanager.Variable, template *tagmanager.CustomTemplate, triggers ...*tagmanager.Trigger) *tagmanager.Tag { +func NewEventsAPITag(name string, callerID, partnerID, applicationID *tagmanager.Variable, template *tagmanager.CustomTemplate, triggers ...*tagmanager.Trigger) *tagmanager.Tag { return &tagmanager.Tag{ FiringTriggerId: utils.TriggerIDs(triggers), Name: EventsAPITagName(name), @@ -34,8 +34,14 @@ func NewEventsAPITag(name string, callerID, partnerID *tagmanager.Variable, temp Value: "false", }, { - Key: "applicationId", - Type: "template", + Key: "callerId", + Type: "template", + Value: "{{" + callerID.Name + "}}", + }, + { + Key: "applicationId", + Type: "template", + Value: "{{" + applicationID.Name + "}}", }, }, Type: utils.TemplateType(template), From bb359681f33c2abf46e04a8e0e3ebb7d74a1b3ff Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Tue, 25 Feb 2025 10:39:54 +0100 Subject: [PATCH 3/4] docs(criteo): update README --- README.md | 32 ++++++++++++++++++++++++++++++++ sesamy.schema.json | 4 ++++ sesamy.yaml | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/README.md b/README.md index 1ed023a..23a06e8 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,15 @@ googleTagManager: containerId: '175348980' # The workspace id that should be used by the api workspaceId: '10' + # Server container variables + serverContainerVariables: + eventData: + - link_url + lookupTables: + link_url_conversion_label: + input: '{{event.link_url}}' + valueTable: + 123456: 'https://foomo.org/' # --- Google Tag settings googleTag: @@ -263,6 +272,29 @@ umami: types: - PageView - SelectItem +# --- Criteo +criteo: + # Enable provider + enabled: true + # Criteo caller id + callerId: 123 + # Criteo partner id + partnerId: 123456 + # Criteo applicaiton id + applicationId: com.foomo + # Google Tag Manager server container settings + serverContainer: + # Contemplate package config for generated events + packages: + - path: github.com/foomo/sesamy-go/pkg/event + types: + - AddToCart + - BeginCheckout + - PageView + - Purchase + - ViewItem + - ViewItemList + - ViewCart # --- Facebook # https://developers.facebook.com/docs/marketing-api/conversions-api/guides/gtm-server-side diff --git a/sesamy.schema.json b/sesamy.schema.json index bb8c6b2..01d4098 100644 --- a/sesamy.schema.json +++ b/sesamy.schema.json @@ -166,6 +166,10 @@ "type": "string", "description": "Criteo partner id" }, + "applicationId": { + "type": "string", + "description": "Criteo application id" + }, "googleConsent": { "$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.GoogleConsent", "description": "Google Consent settings" diff --git a/sesamy.yaml b/sesamy.yaml index 0c61977..bac8d35 100644 --- a/sesamy.yaml +++ b/sesamy.yaml @@ -36,6 +36,15 @@ googleTagManager: containerId: '175348980' # The workspace id that should be used by the api workspaceId: '10' + # Server container variables + serverContainerVariables: + eventData: + - link_url + lookupTables: + link_url_conversion_label: + input: '{{event.link_url}}' + valueTable: + 123456: 'https://foomo.org/' # --- Google Tag settings googleTag: @@ -219,6 +228,30 @@ umami: - PageView - SelectItem +# --- Criteo +criteo: + # Enable provider + enabled: true + # Criteo caller id + callerId: 123 + # Criteo partner id + partnerId: 123456 + # Criteo applicaiton id + applicationId: com.foomo + # Google Tag Manager server container settings + serverContainer: + # Contemplate package config for generated events + packages: + - path: github.com/foomo/sesamy-go/pkg/event + types: + - AddToCart + - BeginCheckout + - PageView + - Purchase + - ViewItem + - ViewItemList + - ViewCart + # --- Facebook # https://developers.facebook.com/docs/marketing-api/conversions-api/guides/gtm-server-side facebook: From b16a17dfa812a4561d1d15e88fe0ee65cbb7d083 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Tue, 25 Feb 2025 10:40:15 +0100 Subject: [PATCH 4/4] fix: lookup table sorting --- pkg/tagmanager/server/variable/lookuptable.go | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/pkg/tagmanager/server/variable/lookuptable.go b/pkg/tagmanager/server/variable/lookuptable.go index 3144eed..24fea1f 100644 --- a/pkg/tagmanager/server/variable/lookuptable.go +++ b/pkg/tagmanager/server/variable/lookuptable.go @@ -1,6 +1,9 @@ package variable import ( + "maps" + "slices" + "github.com/foomo/sesamy-cli/pkg/config" "google.golang.org/api/tagmanager/v2" ) @@ -11,24 +14,32 @@ func LookupTableName(v string) string { func NewLookupTable(name string, data config.LookupTable) *tagmanager.Variable { var list []*tagmanager.Parameter - for k, v := range data.KeyTable { - list = append(list, &tagmanager.Parameter{ - Type: "map", - Map: []*tagmanager.Parameter{ - { - Key: "key", - Type: "template", - Value: k, + { + keys := slices.AppendSeq(make([]string, 0, len(data.KeyTable)), maps.Keys(data.KeyTable)) + slices.Sort(keys) + for _, k := range keys { + v := data.KeyTable[k] + list = append(list, &tagmanager.Parameter{ + Type: "map", + Map: []*tagmanager.Parameter{ + { + Key: "key", + Type: "template", + Value: k, + }, + { + Key: "value", + Type: "template", + Value: v, + }, }, - { - Key: "value", - Type: "template", - Value: v, - }, - }, - }) + }) + } } - for k, v := range data.ValueTable { + keys := slices.AppendSeq(make([]string, 0, len(data.ValueTable)), maps.Keys(data.ValueTable)) + slices.Sort(keys) + for _, k := range keys { + v := data.ValueTable[k] list = append(list, &tagmanager.Parameter{ Type: "map", Map: []*tagmanager.Parameter{