Skip to content

Commit

Permalink
Merge pull request #73 from foomo/sesamy-cli-0.9.0
Browse files Browse the repository at this point in the history
feat(tagmanager): add mpv2 user data transformation
  • Loading branch information
franklinkim authored Dec 10, 2024
2 parents fd02274 + 6c47690 commit ce0258f
Show file tree
Hide file tree
Showing 22 changed files with 538 additions and 91 deletions.
1 change: 1 addition & 0 deletions cmd/tagmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ func NewTagmanager(root *cobra.Command) *cobra.Command {
Short: "Provision Google Tag Manager containers",
}

tagmanager.NewTags(cmd)
tagmanager.NewServer(cmd)
tagmanager.NewWeb(cmd)
root.AddCommand(cmd)
Expand Down
46 changes: 46 additions & 0 deletions cmd/tagmanager/tags.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package tagmanager

import (
conversionlinkerprovider "github.com/foomo/sesamy-cli/pkg/provider/conversionlinker"
criteoprovider "github.com/foomo/sesamy-cli/pkg/provider/criteo"
emarsysprovider "github.com/foomo/sesamy-cli/pkg/provider/emarsys"
facebookprovider "github.com/foomo/sesamy-cli/pkg/provider/facebook"
googleadsprovider "github.com/foomo/sesamy-cli/pkg/provider/googleads"
googleanalyticsprovider "github.com/foomo/sesamy-cli/pkg/provider/googleanalytics"
googletagmanagerprovider "github.com/foomo/sesamy-cli/pkg/provider/googletagmanager"
microsoftadsprovider "github.com/foomo/sesamy-cli/pkg/provider/microsoftads"
tracifyprovider "github.com/foomo/sesamy-cli/pkg/provider/tracify"
umamiprovider "github.com/foomo/sesamy-cli/pkg/provider/umami"
"github.com/pterm/pterm"
"github.com/spf13/cobra"
)

// NewTags represents the tags command
func NewTags(root *cobra.Command) *cobra.Command {
cmd := &cobra.Command{
Use: "tags",
Short: "Print out all available tags",
RunE: func(cmd *cobra.Command, args []string) error {
// Define the data for the first table
data := pterm.TableData{
{"Name", "Tag"},
{conversionlinkerprovider.Name, conversionlinkerprovider.Tag},
{criteoprovider.Name, criteoprovider.Tag},
{emarsysprovider.Name, emarsysprovider.Tag},
{facebookprovider.Name, facebookprovider.Tag},
{googleadsprovider.Name, googleadsprovider.Tag},
{googleanalyticsprovider.Name, googleanalyticsprovider.Tag},
{googletagmanagerprovider.Name, googletagmanagerprovider.Tag},
{microsoftadsprovider.Name, microsoftadsprovider.Tag},
{tracifyprovider.Name, tracifyprovider.Tag},
{umamiprovider.Name, umamiprovider.Tag},
}

return pterm.DefaultTable.WithHasHeader().WithData(data).Render()
},
}

root.AddCommand(cmd)

return cmd
}
33 changes: 23 additions & 10 deletions pkg/config/facebook.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,27 @@ import (
"github.com/foomo/gocontemplate/pkg/contemplate"
)

type Facebook struct {
// Enable provider
Enabled bool `json:"enabled" yaml:"enabled"`
PixelID string `json:"pixelId" yaml:"pixelId"`
APIAccessToken string `json:"apiAccessToken" yaml:"apiAccessToken"`
TestEventToken string `json:"testEventToken" yaml:"testEventToken"`
// Google Consent settings
GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"`
// Google Tag Manager server container settings
ServerContainer contemplate.Config `json:"serverContainer" yaml:"serverContainer"`
type (
Facebook struct {
// Enable provider
Enabled bool `json:"enabled" yaml:"enabled"`
PixelID string `json:"pixelId" yaml:"pixelId"`
APIAccessToken string `json:"apiAccessToken" yaml:"apiAccessToken"`
TestEventToken string `json:"testEventToken" yaml:"testEventToken"`
// Google Consent settings
GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"`
// Google Tag Manager server container settings
ServerContainer FacebookServerContainer `json:"serverContainer" yaml:"serverContainer"`
}
FacebookServerContainer struct {
contemplate.Config `json:",inline" yaml:",squash"`
Settings map[string]FacebookConversionAPITag `json:"settings" yaml:"settings"`
}
)

func (s *FacebookServerContainer) Setting(eventName string) FacebookConversionAPITag {
if value, ok := s.Settings[eventName]; ok {
return value
}
return FacebookConversionAPITag{}
}
8 changes: 8 additions & 0 deletions pkg/config/facebookconversionapitag.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package config

type FacebookConversionAPITag struct {
// Extend Meta Pixel cookies (fbp/fbc)
ExtendCookies bool `json:"extendCookies" yaml:"extendCookies"`
// Enable Use of HTTP Only Secure Cookie (gtmeec) to Enhance Event Data
EnableEventEnhancement bool `json:"enableEventEnhancement" yaml:"enableEventEnhancement"`
}
29 changes: 13 additions & 16 deletions pkg/config/googleadsconversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,20 @@ import (
"github.com/foomo/gocontemplate/pkg/contemplate"
)

type GoogleAdsConversion struct {
// Enable provider
Enabled bool `json:"enabled" yaml:"enabled"`
// Google Tag Manager server container settings
ServerContainer ServerContainer `json:"serverContainer" yaml:"serverContainer"`
}

type ServerContainer struct {
contemplate.Config `json:",inline" yaml:",squash"`
Settings map[string]GoogleAdsConversionTracking `json:"settings" yaml:"settings"`
}

type GoogleAdsConversionTracking struct {
Label string `json:"label" yaml:"label"`
}
type (
GoogleAdsConversion struct {
// Enable provider
Enabled bool `json:"enabled" yaml:"enabled"`
// Google Tag Manager server container settings
ServerContainer GoogleAdsConversionServerContainer `json:"serverContainer" yaml:"serverContainer"`
}
GoogleAdsConversionServerContainer struct {
contemplate.Config `json:",inline" yaml:",squash"`
Settings map[string]GoogleAdsConversionTracking `json:"settings" yaml:"settings"`
}
)

func (s *ServerContainer) Setting(eventName string) GoogleAdsConversionTracking {
func (s *GoogleAdsConversionServerContainer) Setting(eventName string) GoogleAdsConversionTracking {
if value, ok := s.Settings[eventName]; ok {
return value
}
Expand Down
5 changes: 5 additions & 0 deletions pkg/config/googleadsconversiontracking.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package config

type GoogleAdsConversionTracking struct {
Label string `json:"label" yaml:"label"`
}
2 changes: 2 additions & 0 deletions pkg/config/tracify.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ type Tracify struct {
Token string `json:"token" yaml:"token"`
// Tracify customer site id
CustomerSiteID string `json:"customerSiteId" yaml:"customerSiteId"`
// Enable stating mode
StagingModeEnabled bool `json:"stagingModeEnabled" yaml:"stagingModeEnabled"`
// Google Consent settings
GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"`
// Google Tag Manager server container settings
Expand Down
4 changes: 2 additions & 2 deletions pkg/provider/facebook/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func Server(l *slog.Logger, tm *tagmanager.TagManager, cfg config.Facebook) erro
}

{ // create tags
eventParameters, err := utils.LoadEventParams(cfg.ServerContainer)
eventParameters, err := utils.LoadEventParams(cfg.ServerContainer.Config)
if err != nil {
return err
}
Expand All @@ -70,7 +70,7 @@ func Server(l *slog.Logger, tm *tagmanager.TagManager, cfg config.Facebook) erro
return errors.Wrap(err, "failed to upsert event trigger: "+event)
}

if _, err := tm.UpsertTag(servertagx.NewConversionsAPITag(event, pixelID, apiAccessToken, testEventToken, template, eventTrigger)); err != nil {
if _, err := tm.UpsertTag(servertagx.NewConversionsAPITag(event, pixelID, apiAccessToken, testEventToken, cfg.ServerContainer.Setting(event), template, eventTrigger)); err != nil {
return err
}
}
Expand Down
9 changes: 6 additions & 3 deletions pkg/provider/facebook/server/tag/conversionsapitag.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package tag

import (
"strconv"

"github.com/foomo/sesamy-cli/pkg/config"
"github.com/foomo/sesamy-cli/pkg/utils"
"google.golang.org/api/tagmanager/v2"
)
Expand All @@ -9,7 +12,7 @@ func ConversionsAPITagName(v string) string {
return "FB Conversion - " + v
}

func NewConversionsAPITag(name string, pixelID, apiAccessToken, testEventCode *tagmanager.Variable, template *tagmanager.CustomTemplate, triggers ...*tagmanager.Trigger) *tagmanager.Tag {
func NewConversionsAPITag(name string, pixelID, apiAccessToken, testEventCode *tagmanager.Variable, settings config.FacebookConversionAPITag, template *tagmanager.CustomTemplate, triggers ...*tagmanager.Trigger) *tagmanager.Tag {
return &tagmanager.Tag{
FiringTriggerId: utils.TriggerIDs(triggers),
Name: ConversionsAPITagName(name),
Expand All @@ -33,12 +36,12 @@ func NewConversionsAPITag(name string, pixelID, apiAccessToken, testEventCode *t
{
Key: "enableEventEnhancement",
Type: "boolean",
Value: "false",
Value: strconv.FormatBool(settings.EnableEventEnhancement),
},
{
Key: "extendCookies",
Type: "boolean",
Value: "false",
Value: strconv.FormatBool(settings.ExtendCookies),
},
{
Key: "actionSource",
Expand Down
2 changes: 2 additions & 0 deletions pkg/provider/googleanalytics/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ const (
NameGoogleAnalyticsGA4ClientTrigger = "Google Analytics GA4 Client"
NameGoogleGTagClientTemplate = "Google gtag.js"
NameGoogleGTagClient = "Google gtag.js"
NameMPv2UserDataTransformation = "MPv2 User Data"
NameJSONRequestValueTemplate = "JSON Request Value"
NameMeasurementProtocolGA4Client = "Measurement Protocol GA4"
NameMeasurementProtocolGA4ClientTrigger = "Measurement Protocol GA4 Client"
)
26 changes: 22 additions & 4 deletions pkg/provider/googleanalytics/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@ package googleanalytics

import (
"github.com/foomo/sesamy-cli/pkg/config"
client2 "github.com/foomo/sesamy-cli/pkg/provider/googleanalytics/server/client"
googleanalyticsclient "github.com/foomo/sesamy-cli/pkg/provider/googleanalytics/server/client"
containertag "github.com/foomo/sesamy-cli/pkg/provider/googleanalytics/server/tag"
template2 "github.com/foomo/sesamy-cli/pkg/provider/googleanalytics/server/template"
googleanalyticstemplate "github.com/foomo/sesamy-cli/pkg/provider/googleanalytics/server/template"
"github.com/foomo/sesamy-cli/pkg/provider/googleanalytics/server/trigger"
"github.com/foomo/sesamy-cli/pkg/provider/googleconsent"
googleconsentvariable "github.com/foomo/sesamy-cli/pkg/provider/googleconsent/server/variable"
"github.com/foomo/sesamy-cli/pkg/tagmanager"
serverclient "github.com/foomo/sesamy-cli/pkg/tagmanager/server/client"
servertemplate "github.com/foomo/sesamy-cli/pkg/tagmanager/server/template"
servertransformation "github.com/foomo/sesamy-cli/pkg/tagmanager/server/transformation"
servertrigger "github.com/foomo/sesamy-cli/pkg/tagmanager/server/trigger"
servervariable "github.com/foomo/sesamy-cli/pkg/tagmanager/server/variable"
"github.com/foomo/sesamy-cli/pkg/utils"
"github.com/pkg/errors"
)
Expand Down Expand Up @@ -43,15 +46,30 @@ func Server(tm *tagmanager.TagManager, cfg config.GoogleAnalytics, redactVisitor
if _, err = tm.UpsertTrigger(servertrigger.NewClient(NameMeasurementProtocolGA4ClientTrigger, client)); err != nil {
return err
}

userDataTemplate, err := tm.UpsertCustomTemplate(servertemplate.NewJSONRequestValue(NameJSONRequestValueTemplate))
if err != nil {
return err
}

userDataVariable, err := tm.UpsertVariable(servervariable.NewMPv2Data("user_data", userDataTemplate))
if err != nil {
return err
}

_, err = tm.UpsertTransformation(servertransformation.NewMPv2UserData(NameMPv2UserDataTransformation, userDataVariable, client))
if err != nil {
return err
}
}

if cfg.GoogleGTag.Enabled {
template, err := tm.UpsertCustomTemplate(template2.NewGoogleGTagClient(NameGoogleGTagClientTemplate))
template, err := tm.UpsertCustomTemplate(googleanalyticstemplate.NewGoogleGTagClient(NameGoogleGTagClientTemplate))
if err != nil {
return err
}

_, err = tm.UpsertClient(client2.NewGoogleGTag(NameGoogleGTagClient, cfg.GoogleGTag, template))
_, err = tm.UpsertClient(googleanalyticsclient.NewGoogleGTag(NameGoogleGTagClient, cfg.GoogleGTag, template))
if err != nil {
return err
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,5 @@ func NewGoogleConsentModeCheck(name string) *tagmanager.CustomTemplate {
return &tagmanager.CustomTemplate{
Name: name,
TemplateData: fmt.Sprintf(GoogleConsentModeCheckData, name),
// oogleapi: Error 400: galleryReference: This field is invalid (or unsupported).
// GalleryReference: &tagmanager.GalleryReference{
// Host: "github.com",
// Owner: "analytics-engineers",
// Repository: "gtm-server-variable-google-consent-mode-check",
// Signature: "8905ba41f72b510484a3ff9dc27dabaf09c029eb1228e2d1435b5cc2e837cc8d",
// Version: "a31230ca43cdadea1b97ef7dcf76b8e9f8c04725",
// },
}
}
2 changes: 1 addition & 1 deletion pkg/provider/tracify/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func Server(l *slog.Logger, tm *tagmanager.TagManager, cfg config.Tracify) error
return errors.Wrap(err, "failed to upsert event trigger: "+event)
}

if _, err := tm.UpsertTag(servertagx.NewTracify(event, token, customerSiteID, tagTemplate, eventTrigger)); err != nil {
if _, err := tm.UpsertTag(servertagx.NewTracify(event, token, customerSiteID, tagTemplate, cfg, eventTrigger)); err != nil {
return err
}
}
Expand Down
7 changes: 5 additions & 2 deletions pkg/provider/tracify/server/tag/tracify.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package tag

import (
"strconv"

"github.com/foomo/sesamy-cli/pkg/config"
"github.com/foomo/sesamy-cli/pkg/utils"
"google.golang.org/api/tagmanager/v2"
)
Expand All @@ -9,7 +12,7 @@ func TracifyName(v string) string {
return "Tracify - " + v
}

func NewTracify(name string, token, customerSiteID *tagmanager.Variable, template *tagmanager.CustomTemplate, triggers ...*tagmanager.Trigger) *tagmanager.Tag {
func NewTracify(name string, token, customerSiteID *tagmanager.Variable, template *tagmanager.CustomTemplate, cfg config.Tracify, triggers ...*tagmanager.Trigger) *tagmanager.Tag {
return &tagmanager.Tag{
FiringTriggerId: utils.TriggerIDs(triggers),
Name: TracifyName(name),
Expand All @@ -28,7 +31,7 @@ func NewTracify(name string, token, customerSiteID *tagmanager.Variable, templat
{
Key: "isStagingMode",
Type: "boolean",
Value: "false",
Value: strconv.FormatBool(cfg.StagingModeEnabled),
},
{
Key: "token",
Expand Down
Loading

0 comments on commit ce0258f

Please sign in to comment.