/
resourcehandler.go
99 lines (87 loc) · 2.91 KB
/
resourcehandler.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
/*
* Copyright (c) 2019, salesforce.com, inc.
* All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
*/
package webserver
import (
"bytes"
"fmt"
"html/template"
"net/http"
"path"
"strings"
"time"
"github.com/salesforce/sloop/pkg/sloop/queries"
)
type externalLink struct {
Text string
Url string
}
type resourceData struct {
Namespace string
Name string
Kind string
Uuid string
ClickTime time.Time
SelfUrl string
Links []ComputedLink
EventsUrl string
PayloadUrl string
PlusMinusTime time.Duration
}
func runTextTemplate(templateStr string, data interface{}) (string, error) {
funcMap := template.FuncMap{
"ToUpper": strings.ToUpper,
"ToLower": strings.ToLower,
}
tmpl, err := template.New("").Funcs(funcMap).Parse(templateStr)
if err != nil {
return "", err
}
var tpl bytes.Buffer
err = tmpl.Execute(&tpl, data)
if err != nil {
return "", err
}
return tpl.String(), nil
}
func resourceHandler(resLinks []ResourceLinkTemplate, currentContext string) http.HandlerFunc {
return func(writer http.ResponseWriter, request *http.Request) {
resourceTemplate, err := getTemplate(resourceTemplateFile, _webfilesResourceHtml)
if err != nil {
logWebError(err, "Template.New failed", request, writer)
return
}
d := resourceData{}
d.Namespace = cleanStringFromParam(request, queries.NamespaceParam, "")
d.Name = cleanStringFromParam(request, queries.NameParam, "")
d.Kind = cleanStringFromParam(request, queries.KindParam, "")
d.Uuid = cleanStringFromParam(request, queries.UuidParam, "")
d.ClickTime, err = timeFromUnixTimeParam(request, queries.ClickTimeParam, time.Time{}, time.Millisecond)
if err != nil || d.ClickTime == (time.Time{}) {
logWebError(err, "Invalid click time", request, writer)
return
}
// TODO: Make this selectable in the UX
d.PlusMinusTime = time.Minute * 15
d.SelfUrl = request.URL.String()
d.Links, err = makeResourceLinks(d.Namespace, d.Name, d.Kind, resLinks)
if err != nil {
logWebError(err, "Error creating external links", request, writer)
return
}
queryStart := d.ClickTime.Add(-1 * d.PlusMinusTime).Unix()
queryEnd := d.ClickTime.Add(d.PlusMinusTime).Unix()
dataParams := fmt.Sprintf("?query=%v&namespace=%v&start_time=%v&end_time=%v&kind=%v&name=%v", "GetEventData", d.Namespace, queryStart, queryEnd, d.Kind, d.Name)
d.EventsUrl = path.Join("/", currentContext, "data"+dataParams)
dataParams = fmt.Sprintf("?query=%v&namespace=%v&start_time=%v&end_time=%v&kind=%v&name=%v", "GetResPayload", d.Namespace, queryStart, queryEnd, d.Kind, d.Name)
d.PayloadUrl = path.Join("/", currentContext, "data"+dataParams)
err = resourceTemplate.Execute(writer, d)
if err != nil {
logWebError(err, "Template.ExecuteTemplate failed", request, writer)
return
}
}
}