-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhistoryhandler.go
117 lines (109 loc) · 3.21 KB
/
historyhandler.go
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
117
package main
import (
"net/http"
"strings"
"time"
"github.com/asendia/salmonping/db"
"github.com/gin-gonic/gin"
"github.com/jackc/pgx/v5/pgtype"
)
// historyHandler godoc
//
// @Summary Show salmon ping history
// @Description get ping history based on query string params
// @Tags ping
// @Accept json
// @Produce json
// @Param page query int false "Page" default(1)
// @Param start query string false "Start Date (inclusive)" example("2023-10-28")
// @Param end query string false "End Date (inclusive)" example("2023-10-31")
// @Param name query string false "Names (comma spearated)"
// @Param platform query string false "Platforms (comma spearated)"
// @Param status query string false "Statuses (comma spearated)"
// @Success 200 {object} HistoryResponse
// @Failure 400 {object} DefaultErrorResponse
// @Failure 500 {object} DefaultErrorResponse
// @Router /history [get]
func historyHandler(c *gin.Context) {
// Prepare db connection
ctx := c.Request.Context()
tx, conn, _, message, err := prepareDBConn(ctx)
if conn != nil {
defer conn.Close(ctx)
}
if tx != nil {
// Rollback everything
defer tx.Rollback(ctx)
}
if err != nil {
log := DefaultErrorResponse{
Error: err.Error(),
Level: "error",
Message: message,
}
logJson(log.JSON())
c.JSON(http.StatusInternalServerError, log)
return
}
var payload HistoryPayload
if err := c.ShouldBindQuery(&payload); err != nil {
log := DefaultErrorResponse{
Error: err.Error(),
Level: "error",
Message: "Error binding payload",
Query: c.Request.URL.RawQuery,
}
logJson(log.JSON())
c.JSON(http.StatusBadRequest, log)
return
}
// Query string params
queries := db.New(tx)
limit := int32(100)
if payload.Page == 0 {
payload.Page = 1
}
offset := (int32(payload.Page) - 1) * limit
startDate := parseJakartaDate(payload.StartDate, time.Now().Add(-24*7*time.Hour))
endDate := parseJakartaDate(payload.EndDate, time.Now())
// Add 1 day to endDate
endDate = endDate.Add(24 * time.Hour)
pgStartDate := pgtype.Timestamptz{Time: startDate, Valid: true}
pgEndDate := pgtype.Timestamptz{Time: endDate, Valid: true}
var names = filterEmptyStrings(strings.Split(payload.Name, ","))
var platforms = filterEmptyStrings(strings.Split(payload.Platform, ","))
var statuses = filterEmptyStrings(strings.Split(payload.Status, ","))
listingPings, err := queries.SelectOnlineListingPings(ctx, db.SelectOnlineListingPingsParams{
EndDate: pgEndDate,
Limit: limit,
Names: names,
Offset: offset,
Platforms: platforms,
StartDate: pgStartDate,
Statuses: statuses,
})
if err != nil {
log := DefaultErrorResponse{
Error: err.Error(),
Level: "error",
Message: "Error selecting listing pings",
}
logJson(log.JSON())
c.JSON(http.StatusInternalServerError, log)
return
}
c.JSON(http.StatusOK, HistoryResponse{
ListingPings: listingPings,
})
}
type HistoryPayload struct {
EndDate string `form:"end"`
Name string `form:"name"`
Page int `form:"page"`
Platform string `form:"platform"`
StartDate string `form:"start"`
Status string `form:"status"`
}
type HistoryResponse struct {
ListingPings []db.SelectOnlineListingPingsRow `json:"listing_pings"`
}