evcc-io/server/http_db_metrics_handler.go

92 lines
2.2 KiB
Go

package server
import (
"errors"
"net/http"
"time"
"github.com/evcc-io/evcc/core/metrics"
"github.com/evcc-io/evcc/server/db"
"github.com/evcc-io/evcc/util"
)
// deleteResult reports the number of affected rows
type deleteResult struct {
Deleted int64 `json:"deleted"`
}
// timeRange parses the mandatory from/to query parameters
func timeRange(r *http.Request) (time.Time, time.Time, error) {
q := r.URL.Query()
from, err := time.Parse(time.RFC3339, q.Get("from"))
if err != nil {
return time.Time{}, time.Time{}, errors.New("invalid 'from' parameter")
}
to, err := time.Parse(time.RFC3339, q.Get("to"))
if err != nil {
return time.Time{}, time.Time{}, errors.New("invalid 'to' parameter")
}
return from, to, nil
}
// deleteEnergyHandler removes energy metrics. Parameters match
// /api/history/energy so the same request can be previewed before deleting.
func deleteEnergyHandler(w http.ResponseWriter, r *http.Request) {
if db.Instance == nil {
jsonError(w, http.StatusBadRequest, errors.New("database offline"))
return
}
from, to, err := timeRange(r)
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
q := r.URL.Query()
filter := metrics.EnergyFilter{
Group: q.Get("group"),
Name: q.Get("name"),
Title: q.Get("title"),
}
rows, err := metrics.DeleteEnergy(from, to, filter)
if err != nil {
jsonError(w, http.StatusInternalServerError, err)
return
}
// invalidate cached values (e.g. the solar scale) derived from the deleted history
util.ResetCached()
jsonWrite(w, deleteResult{rows})
}
// deleteTariffsHandler removes persisted tariff values
func deleteTariffsHandler(w http.ResponseWriter, r *http.Request) {
if db.Instance == nil {
jsonError(w, http.StatusBadRequest, errors.New("database offline"))
return
}
from, to, err := timeRange(r)
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
rows, err := metrics.DeleteTariffs(from, to, r.URL.Query().Get("usage"))
if err != nil {
status := http.StatusInternalServerError
if errors.Is(err, metrics.ErrInvalidUsage) {
status = http.StatusBadRequest
}
jsonError(w, status, err)
return
}
jsonWrite(w, deleteResult{rows})
}