Skip to content

Commit

Permalink
Merge pull request #39 from foomo/sesamy-cli-0.3.1
Browse files Browse the repository at this point in the history
feat: add emarsys support
  • Loading branch information
franklinkim authored Aug 22, 2024
2 parents fac42de + d0fa3d9 commit fd961cc
Show file tree
Hide file tree
Showing 36 changed files with 1,966 additions and 63 deletions.
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,10 +146,19 @@ googleTag:
- ViewPromotion
- WorkingLead


# --- Google Analytics settings
googleAnalytics:
# Enable provider
enabled: true
# Google GTag.js settings
googleGTag:
# Provision custom client
enabled: true
# Client priority
priority: 10
# Patch ecommerce items
ecommerceItems: true
# Google Tag Manager web container settings
webContainer:
# Contemplate package config for generated events
Expand Down Expand Up @@ -236,6 +245,24 @@ facebook:
- BeginCheckout
- GenerateLead
- ViewItem

# --- Emarsys
emarsys:
# Enable provider
enabled: true
# Emarsys merchant id
merchantId: ''
# Name of the event to mark as new page view
newPageViewEvent: '''
# Google Tag Manager server container settings
serverContainer:
# Contemplate package config for generated events
packages:
- path: github.com/foomo/sesamy-go/pkg/event
types:
- Purchase
- ViewItem
- ViewItemList
```
## Caveats
Expand Down
18 changes: 13 additions & 5 deletions cmd/tagmanager/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package tagmanager
import (
pkgcmd "github.com/foomo/sesamy-cli/pkg/cmd"
conversionlinkerprovider "github.com/foomo/sesamy-cli/pkg/provider/conversionlinker"
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"
Expand Down Expand Up @@ -58,40 +59,47 @@ func NewServer(root *cobra.Command) {
}

if cfg.GoogleAnalytics.Enabled && pkgcmd.Tag(googleanalyticsprovider.Tag, tags) {
l.Info("🅿️ Running provider", "name", googleanalyticsprovider.Name)
l.Info("🅿️ Running provider", "name", googleanalyticsprovider.Name, "tag", googleanalyticsprovider.Tag)
if err := googleanalyticsprovider.Server(tm, cfg.GoogleAnalytics, cfg.RedactVisitorIP); err != nil {
return errors.Wrap(err, "failed to provision google analytics")
}
}

if cfg.ConversionLinker.Enabled && pkgcmd.Tag(conversionlinkerprovider.Tag, tags) {
l.Info("🅿️ Running provider", "name", conversionlinkerprovider.Name)
l.Info("🅿️ Running provider", "name", conversionlinkerprovider.Name, "tag", conversionlinkerprovider.Tag)
if err := conversionlinkerprovider.Server(tm, cfg.ConversionLinker); err != nil {
return errors.Wrap(err, "failed to provision conversion linker")
}
}

if cfg.Umami.Enabled && pkgcmd.Tag(umamiprovider.Tag, tags) {
l.Info("🅿️ Running provider", "name", umamiprovider.Name)
l.Info("🅿️ Running provider", "name", umamiprovider.Name, "tag", umamiprovider.Tag)
if err := umamiprovider.Server(tm, cfg.Umami); err != nil {
return errors.Wrap(err, "failed to provision umammi")
}
}

if cfg.Facebook.Enabled && pkgcmd.Tag(facebookprovider.Tag, tags) {
l.Info("🅿️ Running provider", "name", facebookprovider.Name)
l.Info("🅿️ Running provider", "name", facebookprovider.Name, "tag", facebookprovider.Tag)
if err := facebookprovider.Server(l, tm, cfg.Facebook); err != nil {
return errors.Wrap(err, "failed to provision facebook")
}
}

if cfg.GoogleAds.Enabled && pkgcmd.Tag(googleadsprovider.Tag, tags) {
l.Info("🅿️ Running provider", "name", googleadsprovider.Name)
l.Info("🅿️ Running provider", "name", googleadsprovider.Name, "tag", googleadsprovider.Tag)
if err := googleadsprovider.Server(l, tm, cfg.GoogleAds); err != nil {
return errors.Wrap(err, "failed to provision google ads")
}
}

if cfg.Emarsys.Enabled && pkgcmd.Tag(emarsysprovider.Tag, tags) {
l.Info("🅿️ Running provider", "name", emarsysprovider.Name, "tag", emarsysprovider.Tag)
if err := emarsysprovider.Server(l, tm, cfg.Emarsys); err != nil {
return errors.Wrap(err, "failed to provision emarsys")
}
}

return nil
},
}
Expand Down
7 changes: 7 additions & 0 deletions cmd/tagmanager/web.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package tagmanager

import (
pkgcmd "github.com/foomo/sesamy-cli/pkg/cmd"
emarsysprovider "github.com/foomo/sesamy-cli/pkg/provider/emarsys"
googleanaylticsprovider "github.com/foomo/sesamy-cli/pkg/provider/googleanalytics"
googletagprovider "github.com/foomo/sesamy-cli/pkg/provider/googletag"
"github.com/foomo/sesamy-cli/pkg/tagmanager"
Expand Down Expand Up @@ -52,6 +53,12 @@ func NewWeb(root *cobra.Command) {
}
}

if cfg.Emarsys.Enabled && pkgcmd.Tag(emarsysprovider.Tag, tags) {
if err := emarsysprovider.Web(tm, cfg.Emarsys); err != nil {
return errors.Wrap(err, "failed to provision emarsys tag")
}
}

return nil
},
}
Expand Down
7 changes: 7 additions & 0 deletions pkg/code/section.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ type Section struct {
Parts []string
}

func (s *Section) Sprint(a ...any) {
value := fmt.Sprint(a...)
if !slices.Contains(s.Parts, value) {
s.Parts = append(s.Parts, value)
}
}

func (s *Section) Sprintf(format string, a ...any) {
value := fmt.Sprintf(format, a...)
if !slices.Contains(s.Parts, value) {
Expand Down
1 change: 1 addition & 0 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ type Config struct {
GoogleAnalytics GoogleAnalytics `json:"googleAnalytics" yaml:"googleAnalytics"`
ConversionLinker ConversionLinker `json:"conversionLinker" yaml:"conversionLinker"`
Facebook Facebook `json:"facebook" yaml:"facebook"`
Emarsys Emarsys `json:"emarsys" yaml:"emarsys"`
Umami Umami `json:"umami" yaml:"umami"`
}
13 changes: 13 additions & 0 deletions pkg/config/emarsys.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package config

import (
"github.com/foomo/gocontemplate/pkg/contemplate"
)

type Emarsys struct {
Enabled bool `json:"enabled" yaml:"enabled"`
MerchantID string `json:"merchantId" yaml:"merchantId"`
NewPageViewEvent string `json:"newPageViewEvent" yaml:"newPageViewEvent"`
WebContainer contemplate.Config `json:"webContainer" yaml:"webContainer"`
ServerContainer contemplate.Config `json:"serverContainer" yaml:"serverContainer"`
}
1 change: 1 addition & 0 deletions pkg/config/googleanalytics.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

type GoogleAnalytics struct {
Enabled bool `json:"enabled" yaml:"enabled"`
GoogleGTag GoogleGTag `json:"googleGTag" yaml:"googleGTag"`
WebContainer contemplate.Config `json:"webContainer" yaml:"webContainer"`
ServerContainer contemplate.Config `json:"serverContainer" yaml:"serverContainer"`
}
7 changes: 7 additions & 0 deletions pkg/config/googlegtag.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package config

type GoogleGTag struct {
Enabled bool `json:"enabled" yaml:"enabled"`
Priority int64 `json:"priority" yaml:"priority"`
EcommerceItems bool `json:"ecommerceItems" yaml:"ecommerceItems"`
}
10 changes: 4 additions & 6 deletions pkg/config/googletag.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package config

type GoogleTag struct {
TagID string `json:"tagId" yaml:"tagId"`
DebugMode bool `json:"debugMode" yaml:"debugMode"`
SendPageView bool `json:"sendPageView" yaml:"sendPageView"`
// WebContainer contemplate.Config `json:"webContainer" yaml:"webContainer"`
// ServerContainer contemplate.Config `json:"serverContainer" yaml:"serverContainer"`
TypeScript TypeScript `json:"typeScript" yaml:"typeScript"`
TagID string `json:"tagId" yaml:"tagId"`
DebugMode bool `json:"debugMode" yaml:"debugMode"`
SendPageView bool `json:"sendPageView" yaml:"sendPageView"`
TypeScript TypeScript `json:"typeScript" yaml:"typeScript"`
}
12 changes: 12 additions & 0 deletions pkg/provider/emarsys/constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package emarsys

const (
Tag = "emarsys"
Name = "Emarsys"
NameMerchantIDConstant = "Emarsys Merchant ID"
NameWebEmarsysInitalizationTag = "Emarsys Initialization"
NameWebEmarsysInitalizationTagTemplate = "Emarsys Initialization"
NameServerEmarsysClient = "Emarsys Initialization"
NameServerEmarsysWebExtendTagTemplate = "Emarsys Web Extend"
NameServerEmarsysInitalizationClientTemplate = "Emarsys Initialization"
)
67 changes: 67 additions & 0 deletions pkg/provider/emarsys/server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package emarsys

import (
"log/slog"

"github.com/foomo/sesamy-cli/pkg/config"
serverclientx "github.com/foomo/sesamy-cli/pkg/provider/emarsys/server/client"
servertagx "github.com/foomo/sesamy-cli/pkg/provider/emarsys/server/tag"
"github.com/foomo/sesamy-cli/pkg/provider/emarsys/server/template"
"github.com/foomo/sesamy-cli/pkg/provider/googletag"
"github.com/foomo/sesamy-cli/pkg/tagmanager"
commontrigger "github.com/foomo/sesamy-cli/pkg/tagmanager/common/trigger"
commonvariable "github.com/foomo/sesamy-cli/pkg/tagmanager/common/variable"
"github.com/pkg/errors"
)

func Server(l *slog.Logger, tm *tagmanager.TagManager, cfg config.Emarsys) error {
{ // create folder
if folder, err := tm.UpsertFolder("Sesamy - " + Name); err != nil {
return err
} else {
tm.SetFolderName(folder.Name)
}
}

{ // conversion
merchantID, err := tm.UpsertVariable(commonvariable.NewConstant(NameMerchantIDConstant, cfg.MerchantID))
if err != nil {
return err
}

tagTemplate, err := tm.UpsertCustomTemplate(template.NewEmarsysWebExtendTag(NameServerEmarsysWebExtendTagTemplate))
if err != nil {
return err
}

clientTemplate, err := tm.UpsertCustomTemplate(template.NewEmarsysInitializationClient(NameServerEmarsysInitalizationClientTemplate))
if err != nil {
return err
}

_, err = tm.UpsertClient(serverclientx.NewEmarsys(NameServerEmarsysClient, cfg, clientTemplate))
if err != nil {
return err
}

{ // create tags
eventParameters, err := googletag.CreateServerEventTriggers(tm, cfg.ServerContainer)
if err != nil {
return err
}

for event := range eventParameters {
eventTrigger, err := tm.LookupTrigger(commontrigger.EventName(event))
if err != nil {
return errors.Wrap(err, "failed to lookup event trigger: "+event)
}

if _, err := tm.UpsertTag(servertagx.NewEmarsys(event, cfg.NewPageViewEvent == eventTrigger.Name, merchantID, tagTemplate, eventTrigger)); err != nil {
return err
}
}
}
}

return nil
}
21 changes: 21 additions & 0 deletions pkg/provider/emarsys/server/client/emarsys.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package client

import (
"github.com/foomo/sesamy-cli/pkg/config"
"github.com/foomo/sesamy-cli/pkg/utils"
"google.golang.org/api/tagmanager/v2"
)

func NewEmarsys(name string, cfg config.Emarsys, template *tagmanager.CustomTemplate) *tagmanager.Client {
return &tagmanager.Client{
Name: name,
Parameter: []*tagmanager.Parameter{
{
Key: "merchantId",
Type: "template",
Value: cfg.MerchantID,
},
},
Type: utils.TemplateType(template),
}
}
48 changes: 48 additions & 0 deletions pkg/provider/emarsys/server/tag/emarsys.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package tag

import (
"strconv"

"github.com/foomo/sesamy-cli/pkg/utils"
"google.golang.org/api/tagmanager/v2"
)

func EmarsysName(v string) string {
return "Emarsys - " + v
}

func NewEmarsys(name string, isNewPageView bool, merchantID *tagmanager.Variable, template *tagmanager.CustomTemplate, triggers ...*tagmanager.Trigger) *tagmanager.Tag {
return &tagmanager.Tag{
FiringTriggerId: utils.TriggerIDs(triggers),
Name: EmarsysName(name),
TagFiringOption: "oncePerEvent",
Parameter: []*tagmanager.Parameter{
{
Key: "adStorageConsent",
Type: "template",
Value: "optional",
},
{
Key: "isNewPageView",
Type: "boolean",
Value: strconv.FormatBool(isNewPageView),
},
{
Key: "merchantId",
Type: "template",
Value: "{{" + merchantID.Name + "}}",
},
{
Key: "isTestMode",
Type: "boolean",
Value: "false",
},
{
Key: "isDebugMode",
Type: "boolean",
Value: "false",
},
},
Type: utils.TemplateType(template),
}
}
14 changes: 14 additions & 0 deletions pkg/provider/emarsys/server/template/emarsysinitalizationclient.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package template

import (
"fmt"

"google.golang.org/api/tagmanager/v2"
)

func NewEmarsysInitializationClient(name string) *tagmanager.CustomTemplate {
return &tagmanager.CustomTemplate{
Name: name,
TemplateData: fmt.Sprintf(EmarsysInitializationClientData, name),
}
}
Loading

0 comments on commit fd961cc

Please sign in to comment.