feat: add google tag

This commit is contained in:
Kevin Franklin Kim 2024-03-12 16:03:40 +01:00
parent b4fb50d281
commit 61b0b337e7
No known key found for this signature in database
5 changed files with 117 additions and 4 deletions

View File

@ -15,6 +15,7 @@ google:
measurement_id: GTM-57BHX34G
credentials_file: ./tmp/google_service_account_creds.json
server_container_url: http://sst.my-domain.com/
typescript:
packages:

View File

@ -50,6 +50,25 @@ var tagmanagerWebCmd = &cobra.Command{
return err
}
logger.Info("- Variable:", logger.Args("name", "server-container-url"))
serverContainerURL, err := c.UpsertConstantVariable("server-container-url", cfg.Google.ServerContainerURL)
if err != nil {
return err
}
logger.Info("- Variable:", logger.Args("name", "Google Tag Settings"))
googleTagSettings, err := c.UpsertGoogleTagSettingsVariable("Google Tag Settings", map[string]*tagmanager2.Variable{
"server_container_url": serverContainerURL,
})
if err != nil {
return err
}
logger.Info("- Variable:", logger.Args("name", "server-container-url"))
if _, err = c.UpsertGoogleTagWebTag("Google Tag", measurementID, googleTagSettings); err != nil {
return err
}
for event, parameters := range eventParameters {
logger.Info("- GA4 Event Trigger:", logger.Args("name", event))
trigger, err := c.UpsertCustomEventTrigger(event)

View File

@ -13,10 +13,11 @@ type Config struct {
}
type Google struct {
GA4 GA4 `yaml:"ga4"`
GTM GTM `yaml:"gtm"`
CredentialsFile string `yaml:"credentials_file"`
CredentialsJSON string `yaml:"credentials_json"`
GA4 GA4 `yaml:"ga4"`
GTM GTM `yaml:"gtm"`
CredentialsFile string `yaml:"credentials_file"`
CredentialsJSON string `yaml:"credentials_json"`
ServerContainerURL string `yaml:"server_container_url"`
}
type GA4 struct {

View File

@ -525,6 +525,51 @@ func (c *Client) UpsertGTEventSettingsVariable(name string, variables map[string
return c.UpsertVariable(obj)
}
func (c *Client) UpsertGoogleTagSettingsVariable(name string, variables map[string]*tagmanager.Variable) (*tagmanager.Variable, error) {
parameters := make([]string, 0, len(variables))
for k := range variables {
parameters = append(parameters, k)
}
sort.Strings(parameters)
list := make([]*tagmanager.Parameter, len(parameters))
for i, parameter := range parameters {
list[i] = &tagmanager.Parameter{
Type: "map",
Map: []*tagmanager.Parameter{
{
Key: "parameter",
Type: "template",
Value: parameter,
},
{
Key: "parameterValue",
Type: "template",
Value: "{{" + variables[parameter].Name + "}}",
},
},
}
}
obj := &tagmanager.Variable{
AccountId: c.accountID,
ContainerId: c.containerID,
WorkspaceId: c.workspaceID,
Name: name,
Notes: c.notes,
Parameter: []*tagmanager.Parameter{
{
Key: "configSettingsTable",
Type: "list",
List: list,
},
},
Type: "gtes",
}
return c.UpsertVariable(obj)
}
func (c *Client) UpsertCustomEventTrigger(name string) (*tagmanager.Trigger, error) {
fullname := "Event." + name
cache, err := c.Trigger(fullname)
@ -721,6 +766,52 @@ func (c *Client) UpsertGA4WebTag(name string, eventSettings *tagmanager.Variable
return c.Tag(fullname)
}
func (c *Client) UpsertGoogleTagWebTag(name string, measurementID *tagmanager.Variable, configSettings *tagmanager.Variable) (*tagmanager.Tag, error) {
cache, err := c.Tag(name)
if err != nil && !errors.Is(err, ErrNotFound) {
return nil, err
}
folder, err := c.Folder(c.folderName)
if err != nil {
return nil, err
}
obj := &tagmanager.Tag{
AccountId: c.accountID,
ContainerId: c.containerID,
WorkspaceId: c.workspaceID,
FiringTriggerId: []string{"2147479573"},
ParentFolderId: folder.FolderId,
Name: name,
Notes: c.notes,
Parameter: []*tagmanager.Parameter{
{
Key: "tagId",
Type: "template",
Value: "{{" + measurementID.Name + "}}",
},
{
Key: "configSettingsVariable",
Type: "template",
Value: "{{" + configSettings.Name + "}}",
},
},
Type: "googtag",
}
if cache == nil {
c.tags[name], err = c.Service().Accounts.Containers.Workspaces.Tags.Create(c.WorkspacePath(), obj).Do()
} else {
c.tags[name], err = c.Service().Accounts.Containers.Workspaces.Tags.Update(c.WorkspacePath()+"/tags/"+cache.TagId, obj).Do()
}
if err != nil {
return nil, err
}
return c.Tag(name)
}
func (c *Client) UpsertGA4ServerTag(name string, measurementID *tagmanager.Variable, trigger *tagmanager.Trigger) (*tagmanager.Tag, error) {
cache, err := c.Tag(name)
if err != nil && !errors.Is(err, ErrNotFound) {

View File

@ -85,6 +85,7 @@ func TestNewClient_Server(t *testing.T) {
func TestNewClient_Web(t *testing.T) {
t.Skip()
c, err := tagmanager.NewClient(
context.TODO(),
os.Getenv("TEST_ACCOUNT_ID"),