1 package webserver
2
3 import (
4 "io"
5 "net/http"
6
7 jsoniter "github.com/json-iterator/go"
8
9 "github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
10 )
11
12 func (server *WebUIServer) handleMetrics(w http.ResponseWriter, r *http.Request) {
13 var (
14 err error
15 params []byte
16 res string
17 )
18
19 defer func() {
20 if err != nil {
21 http.Error(w, err.Error(), http.StatusInternalServerError)
22 }
23 }()
24
25 switch r.Method {
26 case http.MethodGet:
27
28 if res, err = server.GetMetrics(); err != nil {
29 return
30 }
31 _, err = w.Write([]byte(res))
32
33 case http.MethodPost:
34
35 if params, err = io.ReadAll(r.Body); err != nil {
36 return
37 }
38 err = server.UpdateMetric(r.URL.Query().Get("name"), params)
39
40 case http.MethodDelete:
41
42 err = server.DeleteMetric(r.URL.Query().Get("name"))
43
44 case http.MethodOptions:
45 w.Header().Set("Allow", "GET, POST, DELETE, OPTIONS")
46 w.WriteHeader(http.StatusNoContent)
47
48 default:
49 w.Header().Set("Allow", "GET, POST, DELETE, OPTIONS")
50 http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
51 }
52 }
53
54
55 func (server *WebUIServer) GetMetrics() (res string, err error) {
56 var mr *metrics.Metrics
57 if mr, err = server.metricsReaderWriter.GetMetrics(); err != nil {
58 return
59 }
60 b, _ := jsoniter.ConfigFastest.Marshal(mr.MetricDefs)
61 res = string(b)
62 return
63 }
64
65
66 func (server *WebUIServer) UpdateMetric(name string, params []byte) error {
67 var m metrics.Metric
68 err := jsoniter.ConfigFastest.Unmarshal(params, &m)
69 if err != nil {
70 return err
71 }
72 return server.metricsReaderWriter.UpdateMetric(name, m)
73 }
74
75
76 func (server *WebUIServer) DeleteMetric(name string) error {
77 return server.metricsReaderWriter.DeleteMetric(name)
78 }
79
80 func (server *WebUIServer) handlePresets(w http.ResponseWriter, r *http.Request) {
81 var (
82 err error
83 params []byte
84 res string
85 )
86
87 defer func() {
88 if err != nil {
89 http.Error(w, err.Error(), http.StatusInternalServerError)
90 }
91 }()
92
93 switch r.Method {
94 case http.MethodGet:
95
96 if res, err = server.GetPresets(); err != nil {
97 return
98 }
99 _, err = w.Write([]byte(res))
100
101 case http.MethodPost:
102
103 if params, err = io.ReadAll(r.Body); err != nil {
104 return
105 }
106 err = server.UpdatePreset(r.URL.Query().Get("name"), params)
107
108 case http.MethodDelete:
109
110 err = server.DeletePreset(r.URL.Query().Get("name"))
111
112 case http.MethodOptions:
113 w.Header().Set("Allow", "GET, POST, PATCH, DELETE, OPTIONS")
114 w.WriteHeader(http.StatusNoContent)
115
116 default:
117 w.Header().Set("Allow", "GET, POST, PATCH, DELETE, OPTIONS")
118 http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
119 }
120 }
121
122
123 func (server *WebUIServer) UpdatePreset(name string, params []byte) error {
124 var p metrics.Preset
125 err := jsoniter.ConfigFastest.Unmarshal(params, &p)
126 if err != nil {
127 return err
128 }
129 return server.metricsReaderWriter.UpdatePreset(name, p)
130 }
131
132
133 func (server *WebUIServer) GetPresets() (res string, err error) {
134 var mr *metrics.Metrics
135 if mr, err = server.metricsReaderWriter.GetMetrics(); err != nil {
136 return
137 }
138 b, _ := jsoniter.ConfigFastest.Marshal(mr.PresetDefs)
139 res = string(b)
140 return
141 }
142
143
144 func (server *WebUIServer) DeletePreset(name string) error {
145 return server.metricsReaderWriter.DeletePreset(name)
146 }
147