From 3f644f8c526b53bfc642bdf83986903901b01ac5 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Wed, 20 Nov 2024 15:41:56 +0100 Subject: [PATCH] refactor: add event handler middleware --- pkg/collect/collect.go | 90 +++++++------------------------------ pkg/http/gtag/middleware.go | 28 ++++++++++++ pkg/http/mpv2/middleware.go | 15 +++++++ 3 files changed, 59 insertions(+), 74 deletions(-) diff --git a/pkg/collect/collect.go b/pkg/collect/collect.go index 295e50c..bda02a4 100644 --- a/pkg/collect/collect.go +++ b/pkg/collect/collect.go @@ -6,25 +6,18 @@ import ( "net/url" "github.com/foomo/sesamy-go/pkg/encoding/gtag" - "github.com/foomo/sesamy-go/pkg/encoding/gtagencode" "github.com/foomo/sesamy-go/pkg/encoding/mpv2" - "github.com/foomo/sesamy-go/pkg/encoding/mpv2encode" - sesamyhttp "github.com/foomo/sesamy-go/pkg/http" gtaghttp "github.com/foomo/sesamy-go/pkg/http/gtag" mpv2http "github.com/foomo/sesamy-go/pkg/http/mpv2" - "github.com/foomo/sesamy-go/pkg/sesamy" - "github.com/pkg/errors" "go.uber.org/zap" ) type ( Collect struct { - l *zap.Logger - gtagProxy *httputil.ReverseProxy - mpv2Proxy *httputil.ReverseProxy - gtagMiddlewares []gtaghttp.Middleware - mpv2Middlewares []mpv2http.Middleware - eventHandlers []sesamyhttp.EventHandler + l *zap.Logger + taggingProxy *httputil.ReverseProxy + gtagHTTPMiddlewares []gtaghttp.Middleware + mpv2HTTPMiddlewares []mpv2http.Middleware } Option func(*Collect) error ) @@ -33,47 +26,28 @@ type ( // ~ Options // ------------------------------------------------------------------------------------------------ -func WithGTag(endpoint string) Option { +func WithTagging(endpoint string) Option { return func(c *Collect) error { target, err := url.Parse(endpoint) if err != nil { return err } proxy := httputil.NewSingleHostReverseProxy(target) - c.gtagProxy = proxy + c.taggingProxy = proxy return nil } } -func WithMPv2(endpoint string) Option { +func WithGTagHTTPMiddlewares(v ...gtaghttp.Middleware) Option { return func(c *Collect) error { - target, err := url.Parse(endpoint) - if err != nil { - return err - } - proxy := httputil.NewSingleHostReverseProxy(target) - c.mpv2Proxy = proxy + c.gtagHTTPMiddlewares = append(c.gtagHTTPMiddlewares, v...) return nil } } -func WithGTagMiddlewares(v ...gtaghttp.Middleware) Option { +func WithMPv2HTTPMiddlewares(v ...mpv2http.Middleware) Option { return func(c *Collect) error { - c.gtagMiddlewares = append(c.gtagMiddlewares, v...) - return nil - } -} - -func WithMPv2Middlewares(v ...mpv2http.Middleware) Option { - return func(c *Collect) error { - c.mpv2Middlewares = append(c.mpv2Middlewares, v...) - return nil - } -} - -func WithEventHandlers(v ...sesamyhttp.EventHandler) Option { - return func(c *Collect) error { - c.eventHandlers = append(c.eventHandlers, v...) + c.mpv2HTTPMiddlewares = append(c.mpv2HTTPMiddlewares, v...) return nil } } @@ -108,7 +82,7 @@ func (c *Collect) GTagHTTPHandler(w http.ResponseWriter, r *http.Request) { // compose middlewares next := c.gtagHandler - for _, middleware := range c.gtagMiddlewares { + for _, middleware := range c.gtagHTTPMiddlewares { next = middleware(next) } @@ -125,7 +99,7 @@ func (c *Collect) MPv2HTTPHandler(w http.ResponseWriter, r *http.Request) { // compose middlewares next := c.mpv2Handler - for _, middleware := range c.mpv2Middlewares { + for _, middleware := range c.mpv2HTTPMiddlewares { next = middleware(next) } @@ -141,47 +115,15 @@ func (c *Collect) MPv2HTTPHandler(w http.ResponseWriter, r *http.Request) { // ------------------------------------------------------------------------------------------------ func (c *Collect) gtagHandler(l *zap.Logger, w http.ResponseWriter, r *http.Request, payload *gtag.Payload) error { - var mpv2Payload *mpv2.Payload[any] - if err := gtagencode.MPv2(*payload, &mpv2Payload); err != nil { - return errors.Wrap(err, "failed to encode gtag to mpv2") - } - - for i, event := range mpv2Payload.Events { - if err := c.mpv2EventHandler(r, &event); err != nil { - return err - } - mpv2Payload.Events[i] = event - } - - if err := mpv2encode.GTag[any](*mpv2Payload, &payload); err != nil { - return errors.Wrap(err, "failed to encode mpv2 to gtag") - } - - if c.gtagProxy == nil { - c.gtagProxy.ServeHTTP(w, r) + if c.taggingProxy == nil { + c.taggingProxy.ServeHTTP(w, r) } return nil } func (c *Collect) mpv2Handler(l *zap.Logger, w http.ResponseWriter, r *http.Request, payload *mpv2.Payload[any]) error { - for i, event := range payload.Events { - if err := c.mpv2EventHandler(r, &event); err != nil { - return err - } - payload.Events[i] = event - } - - if c.mpv2Proxy == nil { - c.mpv2Proxy.ServeHTTP(w, r) - } - return nil -} - -func (c *Collect) mpv2EventHandler(r *http.Request, event *sesamy.Event[any]) error { - for _, handler := range c.eventHandlers { - if err := handler(r, event); err != nil { - return err - } + if c.taggingProxy == nil { + c.taggingProxy.ServeHTTP(w, r) } return nil } diff --git a/pkg/http/gtag/middleware.go b/pkg/http/gtag/middleware.go index 50e0fbd..b6bfa9a 100644 --- a/pkg/http/gtag/middleware.go +++ b/pkg/http/gtag/middleware.go @@ -4,6 +4,11 @@ import ( "net/http" "github.com/foomo/sesamy-go/pkg/encoding/gtag" + "github.com/foomo/sesamy-go/pkg/encoding/gtagencode" + "github.com/foomo/sesamy-go/pkg/encoding/mpv2" + "github.com/foomo/sesamy-go/pkg/encoding/mpv2encode" + sesamyhttp "github.com/foomo/sesamy-go/pkg/http" + "github.com/pkg/errors" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" ) @@ -13,6 +18,29 @@ type ( MiddlewareHandler func(l *zap.Logger, w http.ResponseWriter, r *http.Request, payload *gtag.Payload) error ) +func MiddlewareEventHandler(h sesamyhttp.EventHandler) Middleware { + return func(next MiddlewareHandler) MiddlewareHandler { + return func(l *zap.Logger, w http.ResponseWriter, r *http.Request, payload *gtag.Payload) error { + var mpv2Payload *mpv2.Payload[any] + if err := gtagencode.MPv2(*payload, &mpv2Payload); err != nil { + return errors.Wrap(err, "failed to encode gtag to mpv2") + } + + for i, event := range mpv2Payload.Events { + if err := h(r, &event); err != nil { + return err + } + mpv2Payload.Events[i] = event + } + + if err := mpv2encode.GTag[any](*mpv2Payload, &payload); err != nil { + return errors.Wrap(err, "failed to encode mpv2 to gtag") + } + return next(l, w, r, payload) + } + } +} + func MiddlewareUserID(cookieName string) Middleware { return func(next MiddlewareHandler) MiddlewareHandler { return func(l *zap.Logger, w http.ResponseWriter, r *http.Request, payload *gtag.Payload) error { diff --git a/pkg/http/mpv2/middleware.go b/pkg/http/mpv2/middleware.go index 87ce917..0172342 100644 --- a/pkg/http/mpv2/middleware.go +++ b/pkg/http/mpv2/middleware.go @@ -6,6 +6,7 @@ import ( "time" "github.com/foomo/sesamy-go/pkg/encoding/mpv2" + sesamyhttp "github.com/foomo/sesamy-go/pkg/http" "github.com/foomo/sesamy-go/pkg/session" "github.com/pkg/errors" "go.opentelemetry.io/otel/trace" @@ -17,6 +18,20 @@ type ( Middleware func(next MiddlewareHandler) MiddlewareHandler ) +func MiddlewareEventHandler(h sesamyhttp.EventHandler) Middleware { + return func(next MiddlewareHandler) MiddlewareHandler { + return func(l *zap.Logger, w http.ResponseWriter, r *http.Request, payload *mpv2.Payload[any]) error { + for i, event := range payload.Events { + if err := h(r, &event); err != nil { + return err + } + payload.Events[i] = event + } + return next(l, w, r, payload) + } + } +} + func MiddlewareSessionID(measurementID string) Middleware { measurementID = strings.Split(measurementID, "-")[1] return func(next MiddlewareHandler) MiddlewareHandler {