forked from NdoleStudio/httpsms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbilling_handler.go
More file actions
116 lines (101 loc) · 4.37 KB
/
billing_handler.go
File metadata and controls
116 lines (101 loc) · 4.37 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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package handlers
import (
"fmt"
"github.com/NdoleStudio/httpsms/pkg/requests"
"github.com/NdoleStudio/httpsms/pkg/services"
"github.com/NdoleStudio/httpsms/pkg/telemetry"
"github.com/NdoleStudio/httpsms/pkg/validators"
"github.com/davecgh/go-spew/spew"
"github.com/gofiber/fiber/v2"
"github.com/palantir/stacktrace"
)
// BillingHandler handles billing http requests.
type BillingHandler struct {
handler
logger telemetry.Logger
tracer telemetry.Tracer
validator *validators.BillingHandlerValidator
service *services.BillingService
}
// NewBillingHandler creates a new BillingHandler
func NewBillingHandler(
logger telemetry.Logger,
tracer telemetry.Tracer,
validator *validators.BillingHandlerValidator,
service *services.BillingService,
) (h *BillingHandler) {
return &BillingHandler{
logger: logger.WithService(fmt.Sprintf("%T", h)),
tracer: tracer,
validator: validator,
service: service,
}
}
// RegisterRoutes registers the routes for the MessageHandler
func (h *BillingHandler) RegisterRoutes(router fiber.Router, middlewares ...fiber.Handler) {
router.Get("/v1/billing/usage-history", h.computeRoute(middlewares, h.UsageHistory)...)
router.Get("/v1/billing/usage", h.computeRoute(middlewares, h.Usage)...)
}
// UsageHistory returns the usage history of a user
// @Summary Get billing usage history.
// @Description Get billing usage records of sent and received messages for a user in the past. It will be sorted by timestamp in descending order.
// @Security ApiKeyAuth
// @Tags Billing
// @Accept json
// @Produce json
// @Param skip query int false "number of heartbeats to skip" minimum(0)
// @Param limit query int false "number of heartbeats to return" minimum(1) maximum(100)
// @Success 200 {object} responses.BillingUsagesResponse
// @Failure 400 {object} responses.BadRequest
// @Failure 401 {object} responses.Unauthorized
// @Failure 422 {object} responses.UnprocessableEntity
// @Failure 500 {object} responses.InternalServerError
// @Router /billing/usage-history [get]
func (h *BillingHandler) UsageHistory(c *fiber.Ctx) error {
ctx, span := h.tracer.StartFromFiberCtx(c)
defer span.End()
ctxLogger := h.tracer.CtxLogger(h.logger, span)
var request requests.BillingUsageHistory
if err := c.QueryParser(&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 errors := h.validator.ValidateHistory(ctx, request.Sanitize()); len(errors) != 0 {
msg := fmt.Sprintf("validation errors [%s], while fetching heartbeats [%+#v]", spew.Sdump(errors), request)
ctxLogger.Warn(stacktrace.NewError(msg))
return h.responseUnprocessableEntity(c, errors, "validation errors while fetching usage history")
}
heartbeats, err := h.service.GetUsageHistory(ctx, h.userIDFomContext(c), request.ToIndexParams())
if err != nil {
msg := fmt.Sprintf("cannot get billing usage history with params [%+#v]", request)
ctxLogger.Error(stacktrace.Propagate(err, msg))
return h.responseInternalServerError(c)
}
return h.responseOK(c, fmt.Sprintf("fetched %d billing usage %s", len(*heartbeats), h.pluralize("record", len(*heartbeats))), heartbeats)
}
// Usage returns the current usage history of a user
// @Summary Get Billing Usage.
// @Description Get the summary of sent and received messages for a user in the current month
// @Security ApiKeyAuth
// @Tags Billing
// @Accept json
// @Produce json
// @Success 200 {object} responses.BillingUsageResponse
// @Failure 400 {object} responses.BadRequest
// @Failure 401 {object} responses.Unauthorized
// @Failure 422 {object} responses.UnprocessableEntity
// @Failure 500 {object} responses.InternalServerError
// @Router /billing/usage [get]
func (h *BillingHandler) Usage(c *fiber.Ctx) error {
ctx, span := h.tracer.StartFromFiberCtx(c)
defer span.End()
ctxLogger := h.tracer.CtxLogger(h.logger, span)
billingUsage, err := h.service.GetCurrentUsage(ctx, h.userIDFomContext(c))
if err != nil {
msg := fmt.Sprintf("cannot get current usage record for user [%s]", h.userFromContext(c))
ctxLogger.Error(stacktrace.Propagate(err, msg))
return h.responseInternalServerError(c)
}
return h.responseOK(c, "fetched current billing usage", billingUsage)
}