mirror of
https://github.com/foomo/sesamy-cli.git
synced 2025-10-16 12:35:36 +00:00
feat: skip tag if disabled
This commit is contained in:
parent
51a8522103
commit
9b852d0079
@ -57,7 +57,13 @@ typescript:
|
|||||||
|
|
||||||
tagmanager:
|
tagmanager:
|
||||||
tags:
|
tags:
|
||||||
ga4_enabled: true
|
ga4:
|
||||||
|
enabled: true
|
||||||
|
umami:
|
||||||
|
enabled: false
|
||||||
|
domain: www.your.domain
|
||||||
|
website_id: 123456-123456-123456-123456
|
||||||
|
endpoint_url: https://site-gtm-umami-ummi/api/send
|
||||||
packages:
|
packages:
|
||||||
- path: 'github.com/username/repository/event'
|
- path: 'github.com/username/repository/event'
|
||||||
types:
|
types:
|
||||||
|
|||||||
@ -2,10 +2,11 @@ package cmd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/foomo/sesamy-cli/pkg/tagmanager"
|
"github.com/foomo/sesamy-cli/pkg/tagmanager"
|
||||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/client"
|
containervariable "github.com/foomo/sesamy-cli/pkg/tagmanager/common/variable"
|
||||||
client2 "github.com/foomo/sesamy-cli/pkg/tagmanager/tag"
|
containerclient "github.com/foomo/sesamy-cli/pkg/tagmanager/server/client"
|
||||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/trigger"
|
containertag "github.com/foomo/sesamy-cli/pkg/tagmanager/server/tag"
|
||||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/variable"
|
containertemplate "github.com/foomo/sesamy-cli/pkg/tagmanager/server/template"
|
||||||
|
containertrigger "github.com/foomo/sesamy-cli/pkg/tagmanager/server/trigger"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"google.golang.org/api/option"
|
"google.golang.org/api/option"
|
||||||
tagmanager2 "google.golang.org/api/tagmanager/v2"
|
tagmanager2 "google.golang.org/api/tagmanager/v2"
|
||||||
@ -56,33 +57,26 @@ func NewTagManagerServerCmd(root *cobra.Command) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var ga4MeasurementID *tagmanager2.Variable
|
|
||||||
{
|
|
||||||
name := p.Variables.ConstantName("Google Analytics GA4 ID")
|
|
||||||
if ga4MeasurementID, err = c.UpsertVariable(variable.NewConstant(name, c.MeasurementID())); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var webContainerMeasurementID *tagmanager2.Variable
|
var webContainerMeasurementID *tagmanager2.Variable
|
||||||
{
|
{
|
||||||
name := p.Variables.ConstantName("Google Tag Mangager Web Container ID")
|
name := p.Variables.ConstantName("Google Tag Mangager Web Container ID")
|
||||||
if webContainerMeasurementID, err = c.UpsertVariable(variable.NewConstant(name, cfg.Google.GTM.Web.MeasurementID)); err != nil {
|
if webContainerMeasurementID, err = c.UpsertVariable(containervariable.NewConstant(name, cfg.Google.GTM.Web.MeasurementID)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
name := p.ClientName("Google Tag Manager Web Container")
|
name := p.ClientName("Google Tag Manager Web Container")
|
||||||
if _, err := c.UpsertClient(client.NewGTM(name, webContainerMeasurementID)); err != nil {
|
if _, err := c.UpsertClient(containerclient.NewGTM(name, webContainerMeasurementID)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- MPv2 Client ---
|
||||||
var mpv2Client *tagmanager2.Client
|
var mpv2Client *tagmanager2.Client
|
||||||
{
|
{
|
||||||
name := p.ClientName("Measurement Protocol GA4")
|
name := p.ClientName("Measurement Protocol GA4")
|
||||||
if mpv2Client, err = c.UpsertClient(client.NewMPv2(name)); err != nil {
|
if mpv2Client, err = c.UpsertClient(containerclient.NewMPv2(name)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,15 +84,16 @@ func NewTagManagerServerCmd(root *cobra.Command) {
|
|||||||
var mpv2ClientTrigger *tagmanager2.Trigger
|
var mpv2ClientTrigger *tagmanager2.Trigger
|
||||||
{
|
{
|
||||||
name := p.Triggers.ClientName("Measurement Protocol GA4 Client")
|
name := p.Triggers.ClientName("Measurement Protocol GA4 Client")
|
||||||
if mpv2ClientTrigger, err = c.UpsertTrigger(trigger.NewClient(name, mpv2Client)); err != nil {
|
if mpv2ClientTrigger, err = c.UpsertTrigger(containertrigger.NewClient(name, mpv2Client)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- GA4 Client ---
|
||||||
var ga4Client *tagmanager2.Client
|
var ga4Client *tagmanager2.Client
|
||||||
{
|
{
|
||||||
name := p.ClientName("Google Analytics GA4")
|
name := p.ClientName("Google Analytics GA4")
|
||||||
if ga4Client, err = c.UpsertClient(client.NewGA4(name)); err != nil {
|
if ga4Client, err = c.UpsertClient(containerclient.NewGA4(name)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -106,14 +101,40 @@ func NewTagManagerServerCmd(root *cobra.Command) {
|
|||||||
var ga4ClientTrigger *tagmanager2.Trigger
|
var ga4ClientTrigger *tagmanager2.Trigger
|
||||||
{
|
{
|
||||||
name := p.Triggers.ClientName("Google Analytics GA4 Client")
|
name := p.Triggers.ClientName("Google Analytics GA4 Client")
|
||||||
if ga4ClientTrigger, err = c.UpsertTrigger(trigger.NewClient(name, ga4Client)); err != nil {
|
if ga4ClientTrigger, err = c.UpsertTrigger(containertrigger.NewClient(name, ga4Client)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.Tagmanager.Tags.GA4Enabled {
|
// --- Tags ---
|
||||||
|
if cfg.Tagmanager.Tags.GA4.Enabled {
|
||||||
|
var ga4MeasurementID *tagmanager2.Variable
|
||||||
|
{
|
||||||
|
name := p.Variables.ConstantName("Google Analytics GA4 ID")
|
||||||
|
if ga4MeasurementID, err = c.UpsertVariable(containervariable.NewConstant(name, c.MeasurementID())); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
name := p.Tags.ServerGA4EventName("Google Analytics GA4")
|
name := p.Tags.ServerGA4EventName("Google Analytics GA4")
|
||||||
if _, err := c.UpsertTag(client2.NewServerGA4Event(name, ga4MeasurementID, ga4ClientTrigger, mpv2ClientTrigger)); err != nil {
|
if _, err := c.UpsertTag(containertag.NewGoogleAnalyticsGA4(name, ga4MeasurementID, ga4ClientTrigger, mpv2ClientTrigger)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.Tagmanager.Tags.Umami.Enabled {
|
||||||
|
var umamiTemplate *tagmanager2.CustomTemplate
|
||||||
|
if umamiTemplate, err = c.UpsertCustomTemplate(containertemplate.NewUmami("Sesamy Umami")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := c.UpsertTag(containertag.NewUmami(
|
||||||
|
"Umami",
|
||||||
|
cfg.Tagmanager.Tags.Umami.WebsiteID,
|
||||||
|
cfg.Tagmanager.Tags.Umami.Domain,
|
||||||
|
cfg.Tagmanager.Tags.Umami.EndpointURL,
|
||||||
|
umamiTemplate,
|
||||||
|
ga4ClientTrigger,
|
||||||
|
mpv2ClientTrigger,
|
||||||
|
)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,9 +7,9 @@ import (
|
|||||||
"github.com/foomo/gocontemplate/pkg/assume"
|
"github.com/foomo/gocontemplate/pkg/assume"
|
||||||
"github.com/foomo/gocontemplate/pkg/contemplate"
|
"github.com/foomo/gocontemplate/pkg/contemplate"
|
||||||
"github.com/foomo/sesamy-cli/pkg/tagmanager"
|
"github.com/foomo/sesamy-cli/pkg/tagmanager"
|
||||||
client "github.com/foomo/sesamy-cli/pkg/tagmanager/tag"
|
containervariable "github.com/foomo/sesamy-cli/pkg/tagmanager/common/variable"
|
||||||
trigger2 "github.com/foomo/sesamy-cli/pkg/tagmanager/trigger"
|
containertag "github.com/foomo/sesamy-cli/pkg/tagmanager/web/tag"
|
||||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/variable"
|
containertrigger "github.com/foomo/sesamy-cli/pkg/tagmanager/web/trigger"
|
||||||
"github.com/foomo/sesamy-cli/pkg/utils"
|
"github.com/foomo/sesamy-cli/pkg/utils"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -92,7 +92,7 @@ func NewTagmanagerWebCmd(root *cobra.Command) {
|
|||||||
var ga4MeasurementID *tagmanager2.Variable
|
var ga4MeasurementID *tagmanager2.Variable
|
||||||
{
|
{
|
||||||
name := p.Variables.ConstantName("Google Analytics GA4 ID")
|
name := p.Variables.ConstantName("Google Analytics GA4 ID")
|
||||||
if ga4MeasurementID, err = c.UpsertVariable(variable.NewConstant(name, c.MeasurementID())); err != nil {
|
if ga4MeasurementID, err = c.UpsertVariable(containervariable.NewConstant(name, c.MeasurementID())); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -100,7 +100,7 @@ func NewTagmanagerWebCmd(root *cobra.Command) {
|
|||||||
var serverContainerURL *tagmanager2.Variable
|
var serverContainerURL *tagmanager2.Variable
|
||||||
{
|
{
|
||||||
name := p.Variables.ConstantName("Server Container URL")
|
name := p.Variables.ConstantName("Server Container URL")
|
||||||
if serverContainerURL, err = c.UpsertVariable(variable.NewConstant(name, cfg.Google.GT.ServerContainerURL)); err != nil {
|
if serverContainerURL, err = c.UpsertVariable(containervariable.NewConstant(name, cfg.Google.GT.ServerContainerURL)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -108,7 +108,7 @@ func NewTagmanagerWebCmd(root *cobra.Command) {
|
|||||||
var googleTagSettings *tagmanager2.Variable
|
var googleTagSettings *tagmanager2.Variable
|
||||||
{
|
{
|
||||||
name := p.Variables.GTSettingsName("Google Tag")
|
name := p.Variables.GTSettingsName("Google Tag")
|
||||||
if googleTagSettings, err = c.UpsertVariable(variable.NewGTSettings(name, map[string]*tagmanager2.Variable{
|
if googleTagSettings, err = c.UpsertVariable(containervariable.NewGTSettings(name, map[string]*tagmanager2.Variable{
|
||||||
"server_container_url": serverContainerURL,
|
"server_container_url": serverContainerURL,
|
||||||
})); err != nil {
|
})); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -117,7 +117,7 @@ func NewTagmanagerWebCmd(root *cobra.Command) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
name := p.Tags.GoogleTagName("Google Tag")
|
name := p.Tags.GoogleTagName("Google Tag")
|
||||||
if _, err = c.UpsertTag(client.NewGoogleTag(name, ga4MeasurementID, googleTagSettings, map[string]string{
|
if _, err = c.UpsertTag(containertag.NewGoogleTag(name, ga4MeasurementID, googleTagSettings, map[string]string{
|
||||||
"enable_page_views": strconv.FormatBool(cfg.Google.GT.EnablePageViews),
|
"enable_page_views": strconv.FormatBool(cfg.Google.GT.EnablePageViews),
|
||||||
})); err != nil {
|
})); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -128,16 +128,15 @@ func NewTagmanagerWebCmd(root *cobra.Command) {
|
|||||||
var trigger *tagmanager2.Trigger
|
var trigger *tagmanager2.Trigger
|
||||||
{
|
{
|
||||||
name := p.Triggers.CustomEventName(event)
|
name := p.Triggers.CustomEventName(event)
|
||||||
if trigger, err = c.UpsertTrigger(trigger2.NewCustomEvent(name, event)); err != nil {
|
if trigger, err = c.UpsertTrigger(containertrigger.NewCustomEvent(name, event)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.Tagmanager.Tags.GA4Enabled {
|
|
||||||
eventSettingsVariables := make(map[string]*tagmanager2.Variable, len(parameters))
|
eventSettingsVariables := make(map[string]*tagmanager2.Variable, len(parameters))
|
||||||
for _, parameter := range parameters {
|
for _, parameter := range parameters {
|
||||||
name := p.Variables.EventModelName(parameter)
|
name := p.Variables.EventModelName(parameter)
|
||||||
eventSettingsVariables[parameter], err = c.UpsertVariable(variable.NewEventModel(name, parameter))
|
eventSettingsVariables[parameter], err = c.UpsertVariable(containervariable.NewEventModel(name, parameter))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -146,19 +145,18 @@ func NewTagmanagerWebCmd(root *cobra.Command) {
|
|||||||
var eventSettings *tagmanager2.Variable
|
var eventSettings *tagmanager2.Variable
|
||||||
{
|
{
|
||||||
name := p.Variables.GTEventSettingsName(event)
|
name := p.Variables.GTEventSettingsName(event)
|
||||||
if eventSettings, err = c.UpsertVariable(variable.NewGTEventSettings(name, eventSettingsVariables)); err != nil {
|
if eventSettings, err = c.UpsertVariable(containervariable.NewGTEventSettings(name, eventSettingsVariables)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
name := p.Tags.GA4EventName(event)
|
name := p.Tags.GA4EventName(event)
|
||||||
if _, err := c.UpsertTag(client.NewGA4Event(name, event, eventSettings, ga4MeasurementID, trigger)); err != nil {
|
if _, err := c.UpsertTag(containertag.NewGA4Event(name, event, eventSettings, ga4MeasurementID, trigger)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
|||||||
2
go.mod
2
go.mod
@ -1,6 +1,6 @@
|
|||||||
module github.com/foomo/sesamy-cli
|
module github.com/foomo/sesamy-cli
|
||||||
|
|
||||||
go 1.22.3
|
go 1.22.4
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/fatih/structtag v1.2.0
|
github.com/fatih/structtag v1.2.0
|
||||||
|
|||||||
@ -9,7 +9,3 @@ type Tagmanager struct {
|
|||||||
Tags TagmanagerTags `yaml:"tags"`
|
Tags TagmanagerTags `yaml:"tags"`
|
||||||
Prefixes TagmanagerPrefixes `yaml:"prefixes"`
|
Prefixes TagmanagerPrefixes `yaml:"prefixes"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type TagmanagerTags struct {
|
|
||||||
GA4Enabled bool `yaml:"gA4_enabled"`
|
|
||||||
}
|
|
||||||
|
|||||||
5
pkg/config/tagmanagertagga4.go
Normal file
5
pkg/config/tagmanagertagga4.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
type TagmanagerTagGA4 struct {
|
||||||
|
Enabled bool `yaml:"enabled"`
|
||||||
|
}
|
||||||
6
pkg/config/tagmanagertags.go
Normal file
6
pkg/config/tagmanagertags.go
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
type TagmanagerTags struct {
|
||||||
|
GA4 TagmanagerTagGA4 `yaml:"ga4"`
|
||||||
|
Umami TagmanagerTagUmami `yaml:"umami"`
|
||||||
|
}
|
||||||
8
pkg/config/tagmanagertagumami.go
Normal file
8
pkg/config/tagmanagertagumami.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
type TagmanagerTagUmami struct {
|
||||||
|
Enabled bool `yaml:"enabled"`
|
||||||
|
Domain string `yaml:"domain"`
|
||||||
|
WebsiteID string `yaml:"website_id"`
|
||||||
|
EndpointURL string `yaml:"endpoint_url"`
|
||||||
|
}
|
||||||
@ -6,6 +6,7 @@ import (
|
|||||||
"log/slog"
|
"log/slog"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/davecgh/go-spew/spew"
|
||||||
"github.com/mitchellh/hashstructure/v2"
|
"github.com/mitchellh/hashstructure/v2"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"google.golang.org/api/option"
|
"google.golang.org/api/option"
|
||||||
@ -35,6 +36,7 @@ type (
|
|||||||
builtInVariables map[string]*tagmanager.BuiltInVariable
|
builtInVariables map[string]*tagmanager.BuiltInVariable
|
||||||
triggers map[string]*tagmanager.Trigger
|
triggers map[string]*tagmanager.Trigger
|
||||||
tags map[string]*tagmanager.Tag
|
tags map[string]*tagmanager.Tag
|
||||||
|
customTemplates map[string]*tagmanager.CustomTemplate
|
||||||
}
|
}
|
||||||
ClientOption func(*Client)
|
ClientOption func(*Client)
|
||||||
)
|
)
|
||||||
@ -345,6 +347,37 @@ func (c *Client) LoadTags() (map[string]*tagmanager.Tag, error) {
|
|||||||
return c.tags, nil
|
return c.tags, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) CustomTemplate(name string) (*tagmanager.CustomTemplate, error) {
|
||||||
|
elems, err := c.LoadCustomTemplates()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := elems[name]; !ok {
|
||||||
|
return nil, ErrNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
return elems[name], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) LoadCustomTemplates() (map[string]*tagmanager.CustomTemplate, error) {
|
||||||
|
if c.tags == nil {
|
||||||
|
c.l.Debug("loading", "type", "CustomTemplate")
|
||||||
|
r, err := c.Service().Accounts.Containers.Workspaces.Templates.List(c.WorkspacePath()).Do()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
res := map[string]*tagmanager.CustomTemplate{}
|
||||||
|
for _, value := range r.Template {
|
||||||
|
res[value.Name] = value
|
||||||
|
}
|
||||||
|
c.customTemplates = res
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.customTemplates, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Client) UpsertClient(item *tagmanager.Client) (*tagmanager.Client, error) {
|
func (c *Client) UpsertClient(item *tagmanager.Client) (*tagmanager.Client, error) {
|
||||||
l := c.l.With("type", "Client", "name", item.Name)
|
l := c.l.With("type", "Client", "name", item.Name)
|
||||||
|
|
||||||
@ -543,3 +576,32 @@ func (c *Client) UpsertTag(item *tagmanager.Tag) (*tagmanager.Tag, error) {
|
|||||||
|
|
||||||
return c.Tag(item.Name)
|
return c.Tag(item.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) UpsertCustomTemplate(item *tagmanager.CustomTemplate) (*tagmanager.CustomTemplate, error) {
|
||||||
|
l := c.l.With("type", "CustomTemplate", "name", item.Name)
|
||||||
|
|
||||||
|
item.AccountId = c.AccountID()
|
||||||
|
item.ContainerId = c.ContainerID()
|
||||||
|
item.WorkspaceId = c.WorkspaceID()
|
||||||
|
|
||||||
|
cache, err := c.CustomTemplate(item.Name)
|
||||||
|
if err != nil && !errors.Is(err, ErrNotFound) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if cache == nil {
|
||||||
|
l.Info("⚠️ creating")
|
||||||
|
c.customTemplates[item.Name], err = c.Service().Accounts.Containers.Workspaces.Templates.Create(c.WorkspacePath(), item).Do()
|
||||||
|
} else if item.TemplateData == cache.TemplateData {
|
||||||
|
l.Info("✅ unchanged", "id", cache.TemplateId)
|
||||||
|
} else {
|
||||||
|
l.Info("⚠️ updating", "id", cache.TemplateId)
|
||||||
|
c.customTemplates[item.Name], err = c.Service().Accounts.Containers.Workspaces.Templates.Update(c.WorkspacePath()+"/templates/"+cache.TemplateId, item).Do()
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
spew.Dump(err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.CustomTemplate(item.Name)
|
||||||
|
}
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
package client
|
package tag
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"google.golang.org/api/tagmanager/v2"
|
"google.golang.org/api/tagmanager/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewServerGA4Event(name string, measurementID *tagmanager.Variable, triggers ...*tagmanager.Trigger) *tagmanager.Tag {
|
func NewGoogleAnalyticsGA4(name string, measurementID *tagmanager.Variable, triggers ...*tagmanager.Trigger) *tagmanager.Tag {
|
||||||
triggerIDs := make([]string, len(triggers))
|
triggerIDs := make([]string, len(triggers))
|
||||||
for i, trigger := range triggers {
|
for i, trigger := range triggers {
|
||||||
triggerIDs[i] = trigger.TriggerId
|
triggerIDs[i] = trigger.TriggerId
|
||||||
43
pkg/tagmanager/server/tag/umami.go
Normal file
43
pkg/tagmanager/server/tag/umami.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package tag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"google.golang.org/api/tagmanager/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewUmami(name, websiteID, domain, endpointURL string, template *tagmanager.CustomTemplate, triggers ...*tagmanager.Trigger) *tagmanager.Tag {
|
||||||
|
triggerIDs := make([]string, len(triggers))
|
||||||
|
for i, trigger := range triggers {
|
||||||
|
triggerIDs[i] = trigger.TriggerId
|
||||||
|
}
|
||||||
|
|
||||||
|
return &tagmanager.Tag{
|
||||||
|
FiringTriggerId: triggerIDs,
|
||||||
|
Name: name,
|
||||||
|
TagFiringOption: "oncePerEvent",
|
||||||
|
Parameter: []*tagmanager.Parameter{
|
||||||
|
{
|
||||||
|
Key: "websiteId",
|
||||||
|
Type: "template",
|
||||||
|
Value: websiteID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: "endpointUrl",
|
||||||
|
Type: "template",
|
||||||
|
Value: endpointURL,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: "domain",
|
||||||
|
Type: "template",
|
||||||
|
Value: domain,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: "timeout",
|
||||||
|
Type: "template",
|
||||||
|
Value: "1000",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Type: fmt.Sprintf("cvt_%s_%s", template.ContainerId, template.TemplateId),
|
||||||
|
}
|
||||||
|
}
|
||||||
297
pkg/tagmanager/server/template/umami.go
Normal file
297
pkg/tagmanager/server/template/umami.go
Normal file
@ -0,0 +1,297 @@
|
|||||||
|
package template
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"google.golang.org/api/tagmanager/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
const DataUmami = `___INFO___
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "TAG",
|
||||||
|
"id": "cvt_temp_public_id",
|
||||||
|
"version": 1,
|
||||||
|
"securityGroups": [],
|
||||||
|
"displayName": "%s",
|
||||||
|
"brand": {
|
||||||
|
"id": "brand_dummy",
|
||||||
|
"displayName": "Umami",
|
||||||
|
"thumbnail": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAvgD/ALe9KR/IAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5gwHAwsAtVzgFQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAJmSURBVFjDxVe/SzJxHH5OckgagrsImms4bTm1XEIQhXCqTXBzkLYiKtDFBA/xH2gJQRwP1PPHKuiW3HA4SEMgurlcNRy5HZ936LX3Nd/X1Mx74LMc3Pd5vg98Pt/nwxiGQTARa/P+MBgMoCgKnp6e8Pz8DABgWRZ7e3s4PDzEzs7OfAcahkGzVDabJa/XSwA+ymazkc1mG/t2dHRE9/f3NOu5XwqQZZn29/cJADmdTkqn0/Tw8EC6rtMIuq5Tq9WiTCZDbrebABDP81QoFL4nIBaLEQASBIHK5TLNilqt9iHk+vp6MQHRaJQA0MXFBS2Kq6srAkCRSGQ+AfF4nACQKIr0XWQymalOTAioVCoEgM7Pz2lZGDlRLBYnBDCf54AgCGAYBu12e6n9fnBwgLe3N3Q6nf+3YS6XIwBUKpVo2ajVagRgokXHHAgEAnh5eVn67f92YX19Hc1m888kzOfz6Pf7GA6HaDQa8Pl8SCaTPyJgc3MT9XodNzc32NjYgMPhAPN7gpkGC0yG+QI4jjONfGtrCxaWZU0TYLfbzXXAbrfDEgwGTRPgcrkAVVXHAsUq6/Hx8f0x8ng8KyfneZ4MwyALAJydna3c/nA4PP4Y+f3+ld7+9fV1PA+McsAq6u7u7t+BRBTFHye/vb2dnogSicSPkYdCodkyoSRJSyc/PT2dLxVLkkTb29tLIU+lUovtBd1uly4vL8lqtS5EHI1GSVGUqXsBM8tyqqoqZFlGtVqdDJWf4Ha7cXJyguPj4/dR+wWYebfjTqeDXq8HTdOgaRoAgOM4cByH3d1d8Dw/10BizF7PfwHUW1xlBL8DDgAAAABJRU5ErkJggg\u003d\u003d"
|
||||||
|
},
|
||||||
|
"description": "Send events to Umami",
|
||||||
|
"containerContexts": [
|
||||||
|
"SERVER"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
___TEMPLATE_PARAMETERS___
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "GROUP",
|
||||||
|
"name": "settings",
|
||||||
|
"displayName": "Umami Settings",
|
||||||
|
"groupStyle": "NO_ZIPPY",
|
||||||
|
"subParams": [
|
||||||
|
{
|
||||||
|
"type": "TEXT",
|
||||||
|
"name": "endpointUrl",
|
||||||
|
"displayName": "Endpoint URL",
|
||||||
|
"simpleValueType": true,
|
||||||
|
"help": "Enter your endpoint URL for your own instance or use https://analytics.umami.is/api/send for Umami Cloud",
|
||||||
|
"defaultValue": "https://site-gtm-umami-umami/api/send",
|
||||||
|
"valueValidators": [
|
||||||
|
{
|
||||||
|
"type": "NON_EMPTY"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "TEXT",
|
||||||
|
"name": "websiteId",
|
||||||
|
"displayName": "Website ID",
|
||||||
|
"simpleValueType": true,
|
||||||
|
"valueValidators": [
|
||||||
|
{
|
||||||
|
"type": "NON_EMPTY"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"help": "Paste ID for your website from the Umami settings"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "TEXT",
|
||||||
|
"name": "domain",
|
||||||
|
"displayName": "Host / Domain (Optional)",
|
||||||
|
"simpleValueType": true,
|
||||||
|
"help": "Enter an optional fixed domain to override event data"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "TEXT",
|
||||||
|
"name": "timeout",
|
||||||
|
"displayName": "Timeout (ms)",
|
||||||
|
"simpleValueType": true,
|
||||||
|
"valueValidators": [
|
||||||
|
{
|
||||||
|
"type": "NON_EMPTY"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "POSITIVE_NUMBER"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defaultValue": 1000
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
___SANDBOXED_JS_FOR_SERVER___
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Custom server-side Google Tag Manager Tag Template
|
||||||
|
* Send events to Umami
|
||||||
|
* @version 0.1.0
|
||||||
|
* @see {@link https://github.com/mbaersch|GitHub} for more info
|
||||||
|
* @see {@link https://umami.is/|Umami Homepage}
|
||||||
|
*/
|
||||||
|
|
||||||
|
const JSON = require('JSON');
|
||||||
|
const parseUrl = require('parseUrl');
|
||||||
|
const makeString = require('makeString');
|
||||||
|
const getAllEventData = require('getAllEventData');
|
||||||
|
const sendHttpRequest = require('sendHttpRequest');
|
||||||
|
const getRequestHeader = require('getRequestHeader');
|
||||||
|
const getContainerVersion = require('getContainerVersion');
|
||||||
|
const logToConsole = require('logToConsole');
|
||||||
|
|
||||||
|
const traceId = getRequestHeader('trace-id');
|
||||||
|
const eventData = getAllEventData();
|
||||||
|
const pageLocation = eventData.page_location;
|
||||||
|
|
||||||
|
if (pageLocation) {
|
||||||
|
const name = eventData.event_name || "";
|
||||||
|
const parsedUrl = parseUrl(pageLocation);
|
||||||
|
const serviceUrl = data.endpointUrl;
|
||||||
|
const ref = eventData.page_referrer || "";
|
||||||
|
const hostname = data.domain || parsedUrl.hostname || null;
|
||||||
|
|
||||||
|
// https://github.com/umami-software/umami/blob/7a75639dd3d7aeff46104b71ebfb3853fc0eee09/src/tracker/index.d.ts
|
||||||
|
let umamiEvent = {
|
||||||
|
type: "event",
|
||||||
|
payload: {
|
||||||
|
website: data.websiteId,
|
||||||
|
name: name,
|
||||||
|
hostname: hostname,
|
||||||
|
url: pageLocation.split(parsedUrl.hostname)[1],
|
||||||
|
referrer: ref,
|
||||||
|
language: eventData.language || "",
|
||||||
|
screen: eventData.screen_resolution || "1920x1080"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
logToConsole(
|
||||||
|
JSON.stringify({
|
||||||
|
Name: 'Umami',
|
||||||
|
Type: 'Request',
|
||||||
|
TraceId: traceId,
|
||||||
|
EventName: makeString(umamiEvent.payload.name),
|
||||||
|
RequestMethod: 'POST',
|
||||||
|
RequestUrl: serviceUrl,
|
||||||
|
RequestBody: umamiEvent,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
sendHttpRequest(
|
||||||
|
serviceUrl, (statusCode, headers, body) => {
|
||||||
|
logToConsole(
|
||||||
|
JSON.stringify({
|
||||||
|
Name: 'Umami',
|
||||||
|
Type: 'Response',
|
||||||
|
TraceId: traceId,
|
||||||
|
EventName: makeString(umamiEvent.payload.name),
|
||||||
|
ResponseStatusCode: statusCode,
|
||||||
|
ResponseHeaders: headers,
|
||||||
|
ResponseBody: body,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
if (statusCode >= 200 && statusCode < 300) {
|
||||||
|
data.gtmOnSuccess();
|
||||||
|
} else {
|
||||||
|
data.gtmOnFailure();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
'user-agent': eventData.user_agent || getRequestHeader("user-agent"),
|
||||||
|
'content-type': 'application/json'
|
||||||
|
},
|
||||||
|
method: 'POST',
|
||||||
|
timeout: data.timeout||1000
|
||||||
|
},
|
||||||
|
JSON.stringify(umamiEvent)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
data.gtmOnFailure();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
___SERVER_PERMISSIONS___
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"instance": {
|
||||||
|
"key": {
|
||||||
|
"publicId": "read_request",
|
||||||
|
"versionId": "1"
|
||||||
|
},
|
||||||
|
"param": [
|
||||||
|
{
|
||||||
|
"key": "requestAccess",
|
||||||
|
"value": {
|
||||||
|
"type": 1,
|
||||||
|
"string": "any"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "headerAccess",
|
||||||
|
"value": {
|
||||||
|
"type": 1,
|
||||||
|
"string": "any"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "queryParameterAccess",
|
||||||
|
"value": {
|
||||||
|
"type": 1,
|
||||||
|
"string": "any"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"isRequired": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"instance": {
|
||||||
|
"key": {
|
||||||
|
"publicId": "logging",
|
||||||
|
"versionId": "1"
|
||||||
|
},
|
||||||
|
"param": [
|
||||||
|
{
|
||||||
|
"key": "environments",
|
||||||
|
"value": {
|
||||||
|
"type": 1,
|
||||||
|
"string": "debug"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"isRequired": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"instance": {
|
||||||
|
"key": {
|
||||||
|
"publicId": "read_container_data",
|
||||||
|
"versionId": "1"
|
||||||
|
},
|
||||||
|
"param": []
|
||||||
|
},
|
||||||
|
"isRequired": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"instance": {
|
||||||
|
"key": {
|
||||||
|
"publicId": "read_event_data",
|
||||||
|
"versionId": "1"
|
||||||
|
},
|
||||||
|
"param": [
|
||||||
|
{
|
||||||
|
"key": "eventDataAccess",
|
||||||
|
"value": {
|
||||||
|
"type": 1,
|
||||||
|
"string": "any"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"isRequired": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"instance": {
|
||||||
|
"key": {
|
||||||
|
"publicId": "send_http",
|
||||||
|
"versionId": "1"
|
||||||
|
},
|
||||||
|
"param": [
|
||||||
|
{
|
||||||
|
"key": "allowedUrls",
|
||||||
|
"value": {
|
||||||
|
"type": 1,
|
||||||
|
"string": "any"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"isRequired": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
___TESTS___
|
||||||
|
|
||||||
|
scenarios: []
|
||||||
|
|
||||||
|
|
||||||
|
___NOTES___
|
||||||
|
|
||||||
|
Code generated by sesamy. DO NOT EDIT.
|
||||||
|
`
|
||||||
|
|
||||||
|
func NewUmami(name string) *tagmanager.CustomTemplate {
|
||||||
|
return &tagmanager.CustomTemplate{
|
||||||
|
Name: name,
|
||||||
|
TemplateData: fmt.Sprintf(DataUmami, name),
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
@ -11,8 +12,9 @@ import (
|
|||||||
testingx "github.com/foomo/go/testing"
|
testingx "github.com/foomo/go/testing"
|
||||||
tagx "github.com/foomo/go/testing/tag"
|
tagx "github.com/foomo/go/testing/tag"
|
||||||
"github.com/foomo/sesamy-cli/pkg/tagmanager"
|
"github.com/foomo/sesamy-cli/pkg/tagmanager"
|
||||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/trigger"
|
"github.com/foomo/sesamy-cli/pkg/tagmanager/common/variable"
|
||||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/variable"
|
"github.com/foomo/sesamy-cli/pkg/tagmanager/server/template"
|
||||||
|
webtrigger "github.com/foomo/sesamy-cli/pkg/tagmanager/web/trigger"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"google.golang.org/api/option"
|
"google.golang.org/api/option"
|
||||||
@ -100,6 +102,22 @@ func TestNewClient_Server(t *testing.T) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{ // --- Tags ---
|
||||||
|
t.Run("upsert template", func(t *testing.T) {
|
||||||
|
obj, err := c.UpsertCustomTemplate(template.NewUmami("Sesamy Umami"))
|
||||||
|
require.NoError(t, err)
|
||||||
|
dump(t, obj)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("list templates", func(t *testing.T) {
|
||||||
|
cmd := c.Service().Accounts.Containers.Workspaces.Templates.List(c.WorkspacePath())
|
||||||
|
if r, err := cmd.Do(); assert.NoError(t, err) {
|
||||||
|
// dump(t, r)
|
||||||
|
fmt.Println(r.Template[2].TemplateData)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNewClient_Web(t *testing.T) {
|
func TestNewClient_Web(t *testing.T) {
|
||||||
@ -303,7 +321,7 @@ func TestNewClient_Web(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("upsert trigger", func(t *testing.T) {
|
t.Run("upsert trigger", func(t *testing.T) {
|
||||||
obj, err := c.UpsertTrigger(trigger.NewCustomEvent("Event."+name, name))
|
obj, err := c.UpsertTrigger(webtrigger.NewCustomEvent("Event."+name, name))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
t.Log("ID: " + obj.TriggerId)
|
t.Log("ID: " + obj.TriggerId)
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user