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:
|
||||
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:
|
||||
- path: 'github.com/username/repository/event'
|
||||
types:
|
||||
|
||||
@ -2,10 +2,11 @@ package cmd
|
||||
|
||||
import (
|
||||
"github.com/foomo/sesamy-cli/pkg/tagmanager"
|
||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/client"
|
||||
client2 "github.com/foomo/sesamy-cli/pkg/tagmanager/tag"
|
||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/trigger"
|
||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/variable"
|
||||
containervariable "github.com/foomo/sesamy-cli/pkg/tagmanager/common/variable"
|
||||
containerclient "github.com/foomo/sesamy-cli/pkg/tagmanager/server/client"
|
||||
containertag "github.com/foomo/sesamy-cli/pkg/tagmanager/server/tag"
|
||||
containertemplate "github.com/foomo/sesamy-cli/pkg/tagmanager/server/template"
|
||||
containertrigger "github.com/foomo/sesamy-cli/pkg/tagmanager/server/trigger"
|
||||
"github.com/spf13/cobra"
|
||||
"google.golang.org/api/option"
|
||||
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
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
// --- MPv2 Client ---
|
||||
var mpv2Client *tagmanager2.Client
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
@ -90,15 +84,16 @@ func NewTagManagerServerCmd(root *cobra.Command) {
|
||||
var mpv2ClientTrigger *tagmanager2.Trigger
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
// --- GA4 Client ---
|
||||
var ga4Client *tagmanager2.Client
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
@ -106,14 +101,40 @@ func NewTagManagerServerCmd(root *cobra.Command) {
|
||||
var ga4ClientTrigger *tagmanager2.Trigger
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
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")
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,9 +7,9 @@ import (
|
||||
"github.com/foomo/gocontemplate/pkg/assume"
|
||||
"github.com/foomo/gocontemplate/pkg/contemplate"
|
||||
"github.com/foomo/sesamy-cli/pkg/tagmanager"
|
||||
client "github.com/foomo/sesamy-cli/pkg/tagmanager/tag"
|
||||
trigger2 "github.com/foomo/sesamy-cli/pkg/tagmanager/trigger"
|
||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/variable"
|
||||
containervariable "github.com/foomo/sesamy-cli/pkg/tagmanager/common/variable"
|
||||
containertag "github.com/foomo/sesamy-cli/pkg/tagmanager/web/tag"
|
||||
containertrigger "github.com/foomo/sesamy-cli/pkg/tagmanager/web/trigger"
|
||||
"github.com/foomo/sesamy-cli/pkg/utils"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
@ -92,7 +92,7 @@ func NewTagmanagerWebCmd(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 {
|
||||
if ga4MeasurementID, err = c.UpsertVariable(containervariable.NewConstant(name, c.MeasurementID())); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -100,7 +100,7 @@ func NewTagmanagerWebCmd(root *cobra.Command) {
|
||||
var serverContainerURL *tagmanager2.Variable
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
@ -108,7 +108,7 @@ func NewTagmanagerWebCmd(root *cobra.Command) {
|
||||
var googleTagSettings *tagmanager2.Variable
|
||||
{
|
||||
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,
|
||||
})); err != nil {
|
||||
return err
|
||||
@ -117,7 +117,7 @@ func NewTagmanagerWebCmd(root *cobra.Command) {
|
||||
|
||||
{
|
||||
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),
|
||||
})); err != nil {
|
||||
return err
|
||||
@ -128,34 +128,32 @@ func NewTagmanagerWebCmd(root *cobra.Command) {
|
||||
var trigger *tagmanager2.Trigger
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
if cfg.Tagmanager.Tags.GA4Enabled {
|
||||
eventSettingsVariables := make(map[string]*tagmanager2.Variable, len(parameters))
|
||||
for _, parameter := range parameters {
|
||||
name := p.Variables.EventModelName(parameter)
|
||||
eventSettingsVariables[parameter], err = c.UpsertVariable(variable.NewEventModel(name, parameter))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
eventSettingsVariables := make(map[string]*tagmanager2.Variable, len(parameters))
|
||||
for _, parameter := range parameters {
|
||||
name := p.Variables.EventModelName(parameter)
|
||||
eventSettingsVariables[parameter], err = c.UpsertVariable(containervariable.NewEventModel(name, parameter))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
var eventSettings *tagmanager2.Variable
|
||||
{
|
||||
name := p.Variables.GTEventSettingsName(event)
|
||||
if eventSettings, err = c.UpsertVariable(variable.NewGTEventSettings(name, eventSettingsVariables)); err != nil {
|
||||
return err
|
||||
}
|
||||
var eventSettings *tagmanager2.Variable
|
||||
{
|
||||
name := p.Variables.GTEventSettingsName(event)
|
||||
if eventSettings, err = c.UpsertVariable(containervariable.NewGTEventSettings(name, eventSettingsVariables)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
name := p.Tags.GA4EventName(event)
|
||||
if _, err := c.UpsertTag(client.NewGA4Event(name, event, eventSettings, ga4MeasurementID, trigger)); err != nil {
|
||||
return err
|
||||
}
|
||||
{
|
||||
name := p.Tags.GA4EventName(event)
|
||||
if _, err := c.UpsertTag(containertag.NewGA4Event(name, event, eventSettings, ga4MeasurementID, trigger)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
2
go.mod
2
go.mod
@ -1,6 +1,6 @@
|
||||
module github.com/foomo/sesamy-cli
|
||||
|
||||
go 1.22.3
|
||||
go 1.22.4
|
||||
|
||||
require (
|
||||
github.com/fatih/structtag v1.2.0
|
||||
|
||||
@ -9,7 +9,3 @@ type Tagmanager struct {
|
||||
Tags TagmanagerTags `yaml:"tags"`
|
||||
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"
|
||||
"time"
|
||||
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
"github.com/mitchellh/hashstructure/v2"
|
||||
"github.com/pkg/errors"
|
||||
"google.golang.org/api/option"
|
||||
@ -35,6 +36,7 @@ type (
|
||||
builtInVariables map[string]*tagmanager.BuiltInVariable
|
||||
triggers map[string]*tagmanager.Trigger
|
||||
tags map[string]*tagmanager.Tag
|
||||
customTemplates map[string]*tagmanager.CustomTemplate
|
||||
}
|
||||
ClientOption func(*Client)
|
||||
)
|
||||
@ -345,6 +347,37 @@ func (c *Client) LoadTags() (map[string]*tagmanager.Tag, error) {
|
||||
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) {
|
||||
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)
|
||||
}
|
||||
|
||||
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 (
|
||||
"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))
|
||||
for i, trigger := range triggers {
|
||||
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"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
"testing"
|
||||
@ -11,8 +12,9 @@ import (
|
||||
testingx "github.com/foomo/go/testing"
|
||||
tagx "github.com/foomo/go/testing/tag"
|
||||
"github.com/foomo/sesamy-cli/pkg/tagmanager"
|
||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/trigger"
|
||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/variable"
|
||||
"github.com/foomo/sesamy-cli/pkg/tagmanager/common/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/require"
|
||||
"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) {
|
||||
@ -303,7 +321,7 @@ func TestNewClient_Web(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)
|
||||
t.Log("ID: " + obj.TriggerId)
|
||||
})
|
||||
|
||||
Loading…
Reference in New Issue
Block a user