Skip to content

Commit b906cf8

Browse files
committed
dashboard/app: simplify url parameters extraction
Get parameters are the internal interface.
1 parent 3d899f2 commit b906cf8

File tree

1 file changed

+35
-68
lines changed

1 file changed

+35
-68
lines changed

dashboard/app/coverage.go

Lines changed: 35 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package main
55

66
import (
77
"context"
8-
"errors"
98
"fmt"
109
"html/template"
1110
"net/http"
@@ -72,91 +71,60 @@ const minPeriodsOnThePage = 1
7271
const maxPeriodsOnThePage = 12
7372

7473
func makeHeatmapParams(ctx context.Context, r *http.Request) (*coverageHeatmapParams, error) {
75-
minCoverLinesDrop, err := getIntParam(r, covPageParams[MinCoverLinesDrop], 0)
76-
if err != nil {
77-
return nil, err
78-
}
79-
onlyUnique, err := getBoolParam(r, covPageParams[UniqueOnly], false)
80-
if err != nil {
81-
return nil, err
82-
}
83-
orderByCoverDrop, err := getBoolParam(r, covPageParams[OrderByCoverDrop], false)
84-
if err != nil {
85-
return nil, err
86-
}
87-
periodType, err := getStringParam(r, covPageParams[PeriodType], coveragedb.DayPeriod)
88-
if err != nil {
89-
return nil, err
90-
}
74+
onlyUnique := getParam[bool](r, covPageParams[UniqueOnly], false)
75+
periodType := getParam[string](r, covPageParams[PeriodType])
9176
if !slices.Contains(coveragedb.AllPeriods, periodType) {
9277
return nil, fmt.Errorf("only {%s} are allowed, but received %s instead, %w",
9378
strings.Join(coveragedb.AllPeriods, ", "), periodType, ErrClientBadRequest)
9479
}
95-
96-
nPeriods, err := getIntParam(r, covPageParams[PeriodCount], 4)
97-
if err != nil || nPeriods > maxPeriodsOnThePage || nPeriods < minPeriodsOnThePage {
98-
return nil, fmt.Errorf("periods_count is wrong, expected [%d, %d]: %w",
99-
minPeriodsOnThePage, maxPeriodsOnThePage, err)
100-
}
101-
102-
dateTo := civil.DateOf(timeNow(ctx))
103-
if customDate := r.FormValue(covPageParams[DateTo]); customDate != "" {
104-
if dateTo, err = civil.ParseDate(customDate); err != nil {
105-
return nil, fmt.Errorf("civil.ParseDate(%s): %w", customDate, err)
106-
}
80+
nPeriods := getParam[int](r, covPageParams[PeriodCount], 4)
81+
if nPeriods > maxPeriodsOnThePage || nPeriods < minPeriodsOnThePage {
82+
return nil, fmt.Errorf("periods_count is wrong, expected [%d, %d]",
83+
minPeriodsOnThePage, maxPeriodsOnThePage)
10784
}
10885

10986
return &coverageHeatmapParams{
110-
manager: r.FormValue(covPageParams[ManagerName]),
111-
subsystem: r.FormValue(covPageParams[SubsystemName]),
87+
manager: getParam[string](r, covPageParams[ManagerName]),
88+
subsystem: getParam[string](r, covPageParams[SubsystemName]),
11289
onlyUnique: onlyUnique,
11390
periodType: periodType,
11491
nPeriods: nPeriods,
115-
dateTo: dateTo,
92+
dateTo: getParam[civil.Date](r, covPageParams[DateTo], civil.DateOf(timeNow(ctx))),
11693
Format: cover.Format{
11794
DropCoveredLines0: onlyUnique,
118-
OrderByCoveredLinesDrop: orderByCoverDrop,
119-
FilterMinCoveredLinesDrop: minCoverLinesDrop,
95+
OrderByCoveredLinesDrop: getParam[bool](r, covPageParams[OrderByCoverDrop]),
96+
FilterMinCoveredLinesDrop: getParam[int](r, covPageParams[MinCoverLinesDrop]),
12097
},
12198
}, nil
12299
}
123100

124-
func getIntParam(r *http.Request, name string, orDefault ...int) (int, error) {
125-
if r.FormValue(name) == "" {
126-
if len(orDefault) > 0 {
127-
return orDefault[0], nil
128-
}
129-
return 0, errors.New("missing parameter " + name)
130-
}
131-
res, err := strconv.Atoi(r.FormValue(name))
132-
if err != nil {
133-
return 0, fmt.Errorf("strconv.Atoi(%s): %w", name, err)
101+
func getParam[T int | string | bool | civil.Date](r *http.Request, name string, orDefault ...T) T {
102+
var def T
103+
if len(orDefault) > 0 {
104+
def = orDefault[0]
134105
}
135-
return res, nil
136-
}
137-
138-
func getBoolParam(r *http.Request, name string, orDefault ...bool) (bool, error) {
139106
if r.FormValue(name) == "" {
140-
if len(orDefault) > 0 {
141-
return orDefault[0], nil
142-
}
143-
return false, errors.New("missing parameter " + name)
144-
}
145-
res, err := strconv.ParseBool(r.FormValue(name))
146-
if err != nil {
147-
return false, fmt.Errorf("strconv.ParseBool(%s): %w", name, err)
107+
return def
148108
}
149-
return res, nil
109+
var t T
110+
return extractVal(t, r.FormValue(name)).(T)
150111
}
151112

152-
func getStringParam(r *http.Request, name string, orDefault ...string) (string, error) {
153-
if r.FormValue(name) == "" {
154-
if len(orDefault) > 0 {
155-
return orDefault[0], nil
156-
}
157-
return "", errors.New("missing parameter " + name)
158-
}
159-
return r.FormValue(name), nil
113+
func extractVal(t interface{}, val string) interface{} {
114+
switch t.(type) {
115+
case int:
116+
res, _ := strconv.Atoi(val)
117+
return res
118+
case string:
119+
return val
120+
case bool:
121+
res, _ := strconv.ParseBool(val)
122+
return res
123+
case civil.Date:
124+
res, _ := civil.ParseDate(val)
125+
return res
126+
}
127+
panic("unsupported type")
160128
}
161129

162130
func handleCoverageHeatmap(c context.Context, w http.ResponseWriter, r *http.Request) error {
@@ -168,7 +136,7 @@ func handleCoverageHeatmap(c context.Context, w http.ResponseWriter, r *http.Req
168136
if err != nil {
169137
return fmt.Errorf("%s: %w", err.Error(), ErrClientBadRequest)
170138
}
171-
if requestJSONL, _ := getBoolParam(r, "jsonl", false); requestJSONL {
139+
if getParam[bool](r, "jsonl") {
172140
ns := hdr.Namespace
173141
repo, _ := getNsConfig(c, ns).mainRepoBranch()
174142
w.Header().Set("Content-Type", "application/json")
@@ -332,7 +300,6 @@ func handleFileCoverage(c context.Context, w http.ResponseWriter, r *http.Reques
332300
if err != nil {
333301
return fmt.Errorf("coveragedb.MakeTimePeriod: %w", err)
334302
}
335-
onlyUnique, _ := getBoolParam(r, covPageParams[UniqueOnly], false)
336303
mainNsRepo, _ := nsConfig.mainRepoBranch()
337304
client := getCoverageDBClient(c)
338305
if client == nil {
@@ -344,7 +311,7 @@ func handleFileCoverage(c context.Context, w http.ResponseWriter, r *http.Reques
344311
if err != nil {
345312
return fmt.Errorf("coveragedb.ReadLinesHitCount(%s): %w", manager, err)
346313
}
347-
if onlyUnique {
314+
if getParam[bool](r, covPageParams[UniqueOnly]) {
348315
// This request is expected to be made second by tests.
349316
// Moving it to goroutine don't forget to change multiManagerCovDBFixture.
350317
allHitLines, allHitCounts, err := coveragedb.ReadLinesHitCount(

0 commit comments

Comments
 (0)