88 lines
2 KiB
Go
88 lines
2 KiB
Go
package server
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/evcc-io/evcc/core/metrics"
|
|
"github.com/evcc-io/evcc/server/db"
|
|
)
|
|
|
|
// 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
|
|
}
|
|
|
|
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})
|
|
}
|