forked from NdoleStudio/httpsms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathevents_handler.go
More file actions
78 lines (66 loc) · 2.54 KB
/
Copy pathevents_handler.go
File metadata and controls
78 lines (66 loc) · 2.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package handlers
import (
"fmt"
cloudevents "github.com/cloudevents/sdk-go/v2"
"github.com/NdoleStudio/httpsms/pkg/services"
"github.com/NdoleStudio/httpsms/pkg/telemetry"
"github.com/davecgh/go-spew/spew"
"github.com/gofiber/fiber/v3"
"github.com/palantir/stacktrace"
)
// EventsHandler handles heartbeat http requests.
type EventsHandler struct {
handler
logger telemetry.Logger
tracer telemetry.Tracer
queueConfig services.PushQueueConfig
service *services.EventDispatcher
}
// NewEventsHandler creates a new EventsHandler
func NewEventsHandler(
logger telemetry.Logger,
tracer telemetry.Tracer,
queueConfig services.PushQueueConfig,
service *services.EventDispatcher,
) (h *EventsHandler) {
return &EventsHandler{
logger: logger.WithService(fmt.Sprintf("%T", h)),
tracer: tracer,
queueConfig: queueConfig,
service: service,
}
}
// RegisterRoutes registers the routes for the MessageHandler
func (h *EventsHandler) RegisterRoutes(router fiber.Router, middlewares ...fiber.Handler) {
h.register(router, fiber.MethodPost, "/v1/events", middlewares, h.Dispatch)
}
// Dispatch a cloud event
// This is an internal API so no documentation provided
func (h *EventsHandler) Dispatch(c fiber.Ctx) error {
ctx, span, ctxLogger := h.tracer.StartFromFiberCtxWithLogger(c, h.logger)
defer span.End()
var request cloudevents.Event
if err := c.Bind().Body(&request); err != nil {
msg := fmt.Sprintf("cannot marshall params [%s] into %T", c.OriginalURL(), request)
ctxLogger.Warn(stacktrace.Propagate(err, msg))
return h.responseBadRequest(c, err)
}
if err := request.Validate(); err != nil {
msg := fmt.Sprintf("validation errors [%s], while dispatching event [%+#v]", spew.Sdump(err.Error()), request)
ctxLogger.Warn(stacktrace.NewError(msg))
return h.responseUnprocessableEntity(c, map[string][]string{"event": {err.Error()}}, "validation errors while dispatching event")
}
if h.userIDFomContext(c) != h.queueConfig.UserID {
msg := fmt.Sprintf("user with ID [%s], cannot dispatch event [%+#v]", h.userIDFomContext(c), request)
ctxLogger.Error(stacktrace.NewError(msg))
return h.responseForbidden(c)
}
ctxLogger.Info(fmt.Sprintf("handling [%s] event with ID [%s]", request.Type(), request.ID()))
err := h.service.DispatchSync(ctx, request)
if err != nil {
msg := fmt.Sprintf("cannot dispatch [%s] event with ID [%s]", request.Type(), request.ID())
ctxLogger.Error(stacktrace.Propagate(err, msg))
return h.responseInternalServerError(c)
}
return h.responseNoContent(c, "event dispatched successfully")
}