feat: update client

This commit is contained in:
Kevin Franklin Kim 2024-03-05 17:06:46 +01:00
parent d943476d76
commit 7100ab858b
No known key found for this signature in database
13 changed files with 96 additions and 12 deletions

View File

@ -115,7 +115,7 @@ func (p *Publisher) Publish(topic string, messages ...*message.Message) error {
resp, err := p.client.Do(req)
if err != nil {
return errors.Wrapf(err, "publishing message %s failed", msg.UUID)
return errors.Wrapf(err, "failed to publish message: %s", msg.UUID)
}
if err = p.handleResponseBody(resp); err != nil {

View File

@ -1,9 +1,10 @@
package v2
import (
"context"
"io"
"net/http"
"net/url"
"strings"
"github.com/pkg/errors"
"go.uber.org/zap"
@ -11,11 +12,19 @@ import (
type (
Client struct {
l *zap.Logger
url string
httpClient *http.Client
l *zap.Logger
url string
cookies []string
richsstsse string
trackingID string
measurementID string
protocolVersion string
httpClient *http.Client
middlewares []ClientMiddleware
}
ClientOption func(*Client)
ClientOption func(*Client)
ClientHandler func(r *http.Request, event *Event) error
ClientMiddleware func(next ClientHandler) ClientHandler
)
// ------------------------------------------------------------------------------------------------
@ -28,15 +37,30 @@ func ClientWithHTTPClient(v *http.Client) ClientOption {
}
}
func ClientWithCookies(v ...string) ClientOption {
return func(o *Client) {
o.cookies = append(o.cookies, v...)
}
}
func ClientWithMiddlewares(v ...ClientMiddleware) ClientOption {
return func(o *Client) {
o.middlewares = append(o.middlewares, v...)
}
}
// ------------------------------------------------------------------------------------------------
// ~ Constructor
// ------------------------------------------------------------------------------------------------
func NewClient(l *zap.Logger, url string, opts ...ClientOption) *Client {
func NewClient(l *zap.Logger, url, trackingID string, opts ...ClientOption) *Client {
inst := &Client{
l: l,
url: url,
httpClient: http.DefaultClient,
l: l,
url: url,
cookies: []string{"gtm_auth", "gtm_debug", "gtm_preview"},
trackingID: trackingID,
protocolVersion: "2",
httpClient: http.DefaultClient,
}
for _, opt := range opts {
opt(inst)
@ -56,14 +80,62 @@ func (c *Client) HTTPClient() *http.Client {
// ~ Public methods
// ------------------------------------------------------------------------------------------------
func (c *Client) Send(ctx context.Context, event *Event) error {
func (c *Client) Send(r *http.Request, event *Event) error {
yes := "1"
// set default values
event.TrackingID = &c.trackingID
event.Richsstsse = &c.richsstsse
event.ProtocolVersion = &c.protocolVersion
event.IgnoreReferrer = &yes
{ // set referrer parameter
if referrer, err := url.Parse(r.Referer()); err != nil {
c.l.With(zap.Error(err)).Warn("failed to parse referrer")
} else {
event.DocumentLocation = &referrer.Path
event.DocumentHostname = &referrer.Host
}
}
{ // TODO check
if value, _ := r.Cookie("gtm_debug"); value != nil {
event.IsDebug = &yes
}
}
{ // set client id
if value, _ := r.Cookie("_ga"); value != nil {
clientID := strings.TrimPrefix(value.Value, "GA1.1.")
event.ClientID = &clientID
}
}
{ // pass through cookies
for _, value := range c.cookies {
if cookie, _ := r.Cookie(value); cookie != nil {
r.Header.Add("Cookie", cookie.String())
}
}
}
next := c.SendRaw
for _, middleware := range c.middlewares {
next = middleware(next)
}
return next(r, event)
}
func (c *Client) SendRaw(r *http.Request, event *Event) error {
values, body, err := Marshal(event)
if err != nil {
return errors.Wrap(err, "failed to marshall event")
}
req, err := http.NewRequestWithContext(
ctx,
r.Context(),
http.MethodPost,
c.url+"?"+values.Encode(),
body,

View File

@ -58,6 +58,7 @@ func (e *AddPaymentInfo) MPv2() *mpv2.Event {
eventParameterNumber := map[string]string{}
mp.AddStringMap(eventParameterNumber, mpv2.EventParameterNumberValue.String(), mp.SetFloat64(e.Value))
return &mpv2.Event{
EventName: mp.Set(mpv2.EventNameAddPaymentInfo),
Currency: mp.SetString(e.Currency),
EventParameter: mp.SetStringMap(eventParameter),
EventParameterNumber: mp.SetStringMap(eventParameterNumber),

View File

@ -58,6 +58,7 @@ func (e *AddShippingInfo) MPv2() *mpv2.Event {
eventParameterNumber := map[string]string{}
mp.AddStringMap(eventParameterNumber, mpv2.EventParameterNumberValue.String(), mp.SetFloat64(e.Value))
return &mpv2.Event{
EventName: mp.Set(mpv2.EventNameAddShippingInfo),
Currency: mp.SetString(e.Currency),
EventParameter: mp.SetStringMap(eventParameter),
EventParameterNumber: mp.SetStringMap(eventParameterNumber),

View File

@ -51,8 +51,10 @@ func (e *AddToCart) MPv2() *mpv2.Event {
eventParameterNumber := map[string]string{}
mp.AddStringMap(eventParameterNumber, mpv2.EventParameterNumberValue.String(), mp.SetFloat64(e.Value))
return &mpv2.Event{
EventName: mp.Set(mpv2.EventNameAddToCart),
Currency: mp.SetString(e.Currency),
EventParameterNumber: mp.SetStringMap(eventParameterNumber),
Items: items,
Richsstsse: mp.Set(""),
}
}

View File

@ -51,6 +51,7 @@ func (e *AddToWishlist) MPv2() *mpv2.Event {
eventParameterNumber := map[string]string{}
mp.AddStringMap(eventParameterNumber, mpv2.EventParameterNumberValue.String(), mp.SetFloat64(e.Value))
return &mpv2.Event{
EventName: mp.Set(mpv2.EventNameAddToWishlist),
Currency: mp.SetString(e.Currency),
EventParameterNumber: mp.SetStringMap(eventParameterNumber),
Items: items,

View File

@ -55,6 +55,7 @@ func (e *BeginCheckout) MPv2() *mpv2.Event {
eventParameterNumber := map[string]string{}
mp.AddStringMap(eventParameterNumber, mpv2.EventParameterNumberValue.String(), mp.SetFloat64(e.Value))
return &mpv2.Event{
EventName: mp.Set(mpv2.EventNameBeginCheckout),
Currency: mp.SetString(e.Currency),
EventParameter: mp.SetStringMap(eventParameter),
EventParameterNumber: mp.SetStringMap(eventParameterNumber),

View File

@ -22,6 +22,7 @@ func (e *Login) MPv2() *mpv2.Event {
eventParameter := map[string]string{}
mp.AddStringMap(eventParameter, mpv2.EventParameterMethod.String(), mp.SetString(e.Method))
return &mpv2.Event{
EventName: mp.Set(mpv2.EventNameLogin),
EventParameter: mp.SetStringMap(eventParameter),
}
}

View File

@ -64,6 +64,7 @@ func (e *Purchase) MPv2() *mpv2.Event {
mp.AddStringMap(eventParameterNumber, mpv2.EventParameterNumberShipping.String(), mp.SetFloat64(e.Shipping))
mp.AddStringMap(eventParameterNumber, mpv2.EventParameterNumberTax.String(), mp.SetFloat64(e.Tax))
return &mpv2.Event{
EventName: mp.Set(mpv2.EventNamePurchase),
Currency: mp.SetString(e.Currency),
EventParameter: mp.SetStringMap(eventParameter),
EventParameterNumber: mp.SetStringMap(eventParameterNumber),

View File

@ -64,6 +64,7 @@ func (e *Refund) MPv2() *mpv2.Event {
mp.AddStringMap(eventParameterNumber, mpv2.EventParameterNumberShipping.String(), mp.SetFloat64(e.Shipping))
mp.AddStringMap(eventParameterNumber, mpv2.EventParameterNumberTax.String(), mp.SetFloat64(e.Tax))
return &mpv2.Event{
EventName: mp.Set(mpv2.EventNameRefund),
Currency: mp.SetString(e.Currency),
EventParameter: mp.SetStringMap(eventParameter),
EventParameterNumber: mp.SetStringMap(eventParameterNumber),

View File

@ -51,6 +51,7 @@ func (e *RemoveFromCart) MPv2() *mpv2.Event {
eventParameterNumber := map[string]string{}
mp.AddStringMap(eventParameterNumber, mpv2.EventParameterNumberValue.String(), mp.SetFloat64(e.Value))
return &mpv2.Event{
EventName: mp.Set(mpv2.EventNameRemoveFromCart),
Currency: mp.SetString(e.Currency),
EventParameterNumber: mp.SetStringMap(eventParameterNumber),
Items: items,

View File

@ -22,6 +22,7 @@ func (e *Search) MPv2() *mpv2.Event {
eventParameter := map[string]string{}
mp.AddStringMap(eventParameter, mpv2.EventParameterSearchTerm.String(), mp.SetString(e.SearchTerm))
return &mpv2.Event{
EventName: mp.Set(mpv2.EventNameSearch),
EventParameter: mp.SetStringMap(eventParameter),
}
}

View File

@ -22,6 +22,7 @@ func (e *SignUp) MPv2() *mpv2.Event {
eventParameter := map[string]string{}
mp.AddStringMap(eventParameter, mpv2.EventParameterMethod.String(), mp.SetString(e.Method))
return &mpv2.Event{
EventName: mp.Set(mpv2.EventNameSignUp),
EventParameter: mp.SetStringMap(eventParameter),
}
}