more chart development
This commit is contained in:
@@ -28,6 +28,8 @@ type dashboardResponse struct {
|
||||
Site string `json:"site"`
|
||||
Model string `json:"model"`
|
||||
OpenMeteoURL string `json:"open_meteo_url,omitempty"`
|
||||
RangeStart time.Time `json:"range_start"`
|
||||
RangeEnd time.Time `json:"range_end"`
|
||||
Observations []db.ObservationPoint `json:"observations"`
|
||||
Forecast db.ForecastSeries `json:"forecast"`
|
||||
Latest *db.ObservationPoint `json:"latest"`
|
||||
@@ -90,6 +92,8 @@ func (s *webServer) handleDashboard(w http.ResponseWriter, r *http.Request) {
|
||||
if rangeStr == "" {
|
||||
rangeStr = "24h"
|
||||
}
|
||||
startStr := r.URL.Query().Get("start")
|
||||
endStr := r.URL.Query().Get("end")
|
||||
bucket := r.URL.Query().Get("bucket")
|
||||
if bucket == "" {
|
||||
bucket = "5m"
|
||||
@@ -99,13 +103,37 @@ func (s *webServer) handleDashboard(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
rangeDur, err := time.ParseDuration(rangeStr)
|
||||
if err != nil || rangeDur <= 0 {
|
||||
http.Error(w, "invalid range", http.StatusBadRequest)
|
||||
return
|
||||
var (
|
||||
start time.Time
|
||||
end time.Time
|
||||
err error
|
||||
)
|
||||
if startStr != "" || endStr != "" {
|
||||
if startStr == "" || endStr == "" {
|
||||
http.Error(w, "start and end required", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
start, err = parseTimeParam(startStr)
|
||||
if err != nil {
|
||||
http.Error(w, "invalid start", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
end, err = parseTimeParam(endStr)
|
||||
if err != nil {
|
||||
http.Error(w, "invalid end", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
rangeDur, err := time.ParseDuration(rangeStr)
|
||||
if err != nil || rangeDur <= 0 {
|
||||
http.Error(w, "invalid range", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
end = time.Now().UTC()
|
||||
start = end.Add(-rangeDur)
|
||||
}
|
||||
|
||||
observations, err := s.db.ObservationSeries(r.Context(), s.site.Name, bucket, int64(rangeDur.Seconds()))
|
||||
observations, err := s.db.ObservationSeries(r.Context(), s.site.Name, bucket, start, end)
|
||||
if err != nil {
|
||||
http.Error(w, "failed to query observations", http.StatusInternalServerError)
|
||||
log.Printf("web dashboard observations error: %v", err)
|
||||
@@ -136,6 +164,8 @@ func (s *webServer) handleDashboard(w http.ResponseWriter, r *http.Request) {
|
||||
Site: s.site.Name,
|
||||
Model: s.model,
|
||||
OpenMeteoURL: openMeteoURL,
|
||||
RangeStart: start,
|
||||
RangeEnd: end,
|
||||
Observations: observations,
|
||||
Forecast: forecast,
|
||||
Latest: latest,
|
||||
@@ -147,3 +177,13 @@ func (s *webServer) handleDashboard(w http.ResponseWriter, r *http.Request) {
|
||||
log.Printf("web dashboard encode error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func parseTimeParam(v string) (time.Time, error) {
|
||||
if t, err := time.Parse(time.RFC3339, v); err == nil {
|
||||
return t, nil
|
||||
}
|
||||
if t, err := time.Parse("2006-01-02", v); err == nil {
|
||||
return t, nil
|
||||
}
|
||||
return time.Time{}, errors.New("unsupported time format")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user