github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/infrastructure/ga_measurement/client.go (about)

     1  package ga_measurement
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  	"os"
     8  	"time"
     9  
    10  	ga "github.com/jpillora/go-ogle-analytics"
    11  	"github.com/morikuni/failure"
    12  	"go.uber.org/zap"
    13  
    14  	"github.com/oinume/lekcije/backend/event_logger"
    15  	"github.com/oinume/lekcije/backend/logger"
    16  	"github.com/oinume/lekcije/backend/model2"
    17  )
    18  
    19  var defaultHTTPClient = &http.Client{
    20  	Transport: &logger.LoggingHTTPTransport{DumpHeaderBody: true},
    21  	Timeout:   time.Second * 7,
    22  }
    23  
    24  type Client interface {
    25  	SendEvent(
    26  		ctx context.Context,
    27  		values *model2.GAMeasurementEvent,
    28  		category,
    29  		action,
    30  		label string,
    31  		value int64,
    32  		userID uint32,
    33  	) error
    34  }
    35  
    36  type client struct {
    37  	eventLogger *event_logger.Logger
    38  	httpClient  *http.Client
    39  }
    40  
    41  var (
    42  	_ Client = (*client)(nil)
    43  	_ Client = (*fakeClient)(nil)
    44  )
    45  
    46  func NewClient(
    47  	httpClient *http.Client,
    48  	eventLogger *event_logger.Logger,
    49  ) *client {
    50  	if httpClient == nil {
    51  		httpClient = defaultHTTPClient
    52  	}
    53  	return &client{
    54  		eventLogger: eventLogger,
    55  		httpClient:  httpClient,
    56  	}
    57  }
    58  
    59  func (c *client) SendEvent(
    60  	ctx context.Context,
    61  	values *model2.GAMeasurementEvent,
    62  	category,
    63  	action,
    64  	label string,
    65  	value int64,
    66  	userID uint32,
    67  ) error {
    68  	gaClient, err := ga.NewClient(os.Getenv("GOOGLE_ANALYTICS_ID"))
    69  	if err != nil {
    70  		return err
    71  	}
    72  	gaClient.HttpClient = c.httpClient
    73  	gaClient.UserAgentOverride(values.UserAgentOverride)
    74  	gaClient.ClientID(values.ClientID)
    75  	gaClient.DocumentHostName(values.DocumentHostName)
    76  	gaClient.DocumentPath(values.DocumentPath)
    77  	gaClient.DocumentTitle(values.DocumentTitle)
    78  	gaClient.DocumentReferrer(values.DocumentReferrer)
    79  	gaClient.IPOverride(values.IPOverride)
    80  
    81  	//logFields := []zapcore.Field{
    82  	//	zap.String("category", category),
    83  	//	zap.String("action", action),
    84  	//}
    85  	event := ga.NewEvent(category, action)
    86  	if label != "" {
    87  		event.Label(label)
    88  		//logFields = append(logFields, zap.String("label", label))
    89  	}
    90  	if value != 0 {
    91  		event.Value(value)
    92  		//logFields = append(logFields, zap.Int64("value", value))
    93  	}
    94  	if userID != 0 {
    95  		gaClient.UserID(fmt.Sprint(userID))
    96  		//logFields = append(logFields, zap.Uint("userID", uint(userID)))
    97  	}
    98  
    99  	c.eventLogger.Log(userID, category, action, zap.String("label", label), zap.Int64("value", value))
   100  	if err := gaClient.Send(event); err != nil {
   101  		return failure.Wrap(err, failure.Messagef("gaClient.Send failed"))
   102  	}
   103  
   104  	return nil
   105  }
   106  
   107  type fakeClient struct{}
   108  
   109  func NewFakeClient() *fakeClient {
   110  	return &fakeClient{}
   111  }
   112  
   113  func (fc *fakeClient) SendEvent(
   114  	ctx context.Context,
   115  	values *model2.GAMeasurementEvent,
   116  	category,
   117  	action,
   118  	label string,
   119  	value int64,
   120  	userID uint32,
   121  ) error {
   122  	return nil
   123  }