-
This commit is contained in:
David Chen
2026-02-12 00:54:45 +08:00
committed by GitHub
parent 41ddc6b60f
commit f9c40f05c3
14 changed files with 669 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
package controller
import (
"bytes"
"encoding/json"
"io"
"net/http"
"strconv"
"datasource/store"
)
type Controller struct {
store *store.Store
}
func NewController(store *store.Store) *Controller {
return &Controller{store: store}
}
func (c *Controller) GetMetrics(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
service := query.Get("service")
if service == "" {
http.Error(w, "service cannot be empty", http.StatusBadRequest)
return
}
t0, err := strconv.ParseInt(query.Get("t0"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
t1, err := strconv.ParseInt(query.Get("t1"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
if t0 > t1 {
http.Error(w, "t0 cannot be larger than t1", http.StatusBadRequest)
return
}
metrics, err := c.store.GetMetrics(r.Context(), service, t0, t1)
if err != nil {
// todo (david): log internal server error
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
var buf bytes.Buffer
if err := json.NewEncoder(&buf).Encode(metrics); err != nil {
// todo (david): log internal server error
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
if _, err := io.Copy(w, &buf); err != nil {
// too late to return http.StatusInternalServerError
// todo (david): log internal server error
}
}
// todo (david)
// func (c *Controller) DeleteMetrics(w http.ResponseWriter, r *http.Request) {}