mirror of
https://github.com/foomo/sesamy-go.git
synced 2025-10-16 12:35:43 +00:00
refactor: add event handler middleware
This commit is contained in:
parent
a58dfafaef
commit
3f644f8c52
@ -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
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user