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 }