75 lines
2.2 KiB
Go
75 lines
2.2 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"github.com/dbiz/cdp/data-layer/api/internal/middleware"
|
|
"github.com/dbiz/cdp/data-layer/api/internal/model"
|
|
"github.com/dbiz/cdp/data-layer/api/internal/service"
|
|
)
|
|
|
|
type EventHandler struct {
|
|
svc *service.QueryService
|
|
log *zap.Logger
|
|
}
|
|
|
|
func NewEventHandler(svc *service.QueryService, log *zap.Logger) *EventHandler {
|
|
return &EventHandler{svc: svc, log: log}
|
|
}
|
|
|
|
type queryEventsRequest struct {
|
|
Table string `json:"table" validate:"required,oneof=events_track events_identify events_page events_group"`
|
|
From *time.Time `json:"from" validate:"required"`
|
|
To *time.Time `json:"to" validate:"required,gtfield=From"`
|
|
UserID string `json:"user_id"`
|
|
AnonymousID string `json:"anonymous_id"`
|
|
EventName string `json:"event"`
|
|
Limit int `json:"limit" validate:"omitempty,min=1,max=1000"`
|
|
Offset int `json:"offset" validate:"omitempty,min=0"`
|
|
}
|
|
|
|
// QueryEvents handles POST /query/events.
|
|
func (h *EventHandler) QueryEvents(w http.ResponseWriter, r *http.Request) {
|
|
var req queryEventsRequest
|
|
if err := decodeAndValidate(r, &req); err != nil {
|
|
writeError(w, err)
|
|
return
|
|
}
|
|
if req.Limit == 0 {
|
|
req.Limit = 100
|
|
}
|
|
|
|
ws := middleware.WorkspaceFromCtx(r.Context())
|
|
res, err := h.svc.Events(r.Context(), model.EventQuery{
|
|
WorkspaceID: ws,
|
|
Table: model.EventTable(req.Table),
|
|
From: *req.From,
|
|
To: *req.To,
|
|
UserID: req.UserID,
|
|
AnonymousID: req.AnonymousID,
|
|
EventName: req.EventName,
|
|
Limit: req.Limit,
|
|
Offset: req.Offset,
|
|
})
|
|
if err != nil {
|
|
h.log.Error("query events",
|
|
zap.String("workspace_id", ws),
|
|
zap.String("table", req.Table),
|
|
zap.Error(err))
|
|
writeError(w, err)
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusOK, res)
|
|
}
|
|
|
|
// Health / Ready -- shared between all handlers but parked here for now.
|
|
func (h *EventHandler) Health(w http.ResponseWriter, _ *http.Request) {
|
|
writeJSON(w, http.StatusOK, map[string]string{"status": "ok"})
|
|
}
|
|
func (h *EventHandler) Ready(w http.ResponseWriter, _ *http.Request) {
|
|
writeJSON(w, http.StatusOK, map[string]string{"status": "ready"})
|
|
}
|