package handlers import ( "encoding/base64" "net/http" "github.com/gin-gonic/gin" "github.com/treytartt/casera-api/internal/services" ) // TrackingHandler handles email tracking endpoints type TrackingHandler struct { onboardingService *services.OnboardingEmailService } // NewTrackingHandler creates a new tracking handler func NewTrackingHandler(onboardingService *services.OnboardingEmailService) *TrackingHandler { return &TrackingHandler{ onboardingService: onboardingService, } } // 1x1 transparent GIF (43 bytes) var transparentGIF, _ = base64.StdEncoding.DecodeString("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7") // TrackEmailOpen handles email open tracking via tracking pixel // GET /api/track/open/:trackingID func (h *TrackingHandler) TrackEmailOpen(c *gin.Context) { trackingID := c.Param("trackingID") if trackingID != "" && h.onboardingService != nil { // Record the open (async, don't block response) go func() { _ = h.onboardingService.RecordEmailOpened(trackingID) }() } // Return 1x1 transparent GIF c.Header("Content-Type", "image/gif") c.Header("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate") c.Header("Pragma", "no-cache") c.Header("Expires", "0") c.Data(http.StatusOK, "image/gif", transparentGIF) }