blob: 0309b6f3f5ff62f8f1ea62a11ebe6f46b0edd9c8 [file] [log] [blame]
package api
import (
"context"
"encoding/json"
"net/http"
"github.com/go-chi/chi/v5"
"go.skia.org/infra/go/httputils"
"go.skia.org/infra/go/sklog"
"go.skia.org/infra/perf/go/graphsshortcut"
"go.skia.org/infra/perf/go/shortcut"
)
// shortcutsApi provides a struct for handling shortcut api endpoints.
type shortcutsApi struct {
shortcutStore shortcut.Store
graphsShortcutStore graphsshortcut.Store
}
// NewShortCutsApi returns a new instance of the shortcutsApi struct.
func NewShortCutsApi(shortcutStore shortcut.Store, graphsShortcutStore graphsshortcut.Store) shortcutsApi {
return shortcutsApi{
shortcutStore: shortcutStore,
graphsShortcutStore: graphsShortcutStore,
}
}
// RegisterHandlers registers the api handlers for their respective routes.
func (api shortcutsApi) RegisterHandlers(router *chi.Mux) {
router.Post("/_/keys/", api.keysHandler)
router.Post("/_/shortcut/get", api.getGraphsShortcutHandler)
router.Post("/_/shortcut/update", api.createGraphsShortcutHandler)
}
// keysHandler handles the POST requests of a list of keys.
//
// {
// "keys": [
// ",arch=x86,...",
// ",arch=x86,...",
// ]
// }
//
// And returns the ID of the new shortcut to that list of keys:
//
// {
// "id": 123456,
// }
func (api shortcutsApi) keysHandler(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), defaultDatabaseTimeout)
defer cancel()
w.Header().Set("Content-Type", "application/json")
id, err := api.shortcutStore.Insert(ctx, r.Body)
if err != nil {
httputils.ReportError(w, err, "Error inserting shortcut.", http.StatusInternalServerError)
return
}
if err := json.NewEncoder(w).Encode(map[string]string{"id": id}); err != nil {
sklog.Errorf("Failed to write or encode output: %s", err)
}
}
type GetGraphsShortcutRequest struct {
ID string `json:"id"`
}
// getGraphsShortcutHandler returns the graphsShortcut details for the given shortcut id.
func (api shortcutsApi) getGraphsShortcutHandler(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), defaultDatabaseTimeout)
defer cancel()
w.Header().Set("Content-Type", "application/json")
var ggsr GetGraphsShortcutRequest
if err := json.NewDecoder(r.Body).Decode(&ggsr); err != nil {
httputils.ReportError(w, err, "Failed to decode JSON.", http.StatusInternalServerError)
return
}
sc, err := api.graphsShortcutStore.GetShortcut(ctx, ggsr.ID)
if err != nil {
httputils.ReportError(w, err, "Failed to get keys shortcut.", http.StatusInternalServerError)
return
}
if err := json.NewEncoder(w).Encode(sc); err != nil {
sklog.Errorf("Failed to write or encode output: %s", err)
}
}
// createGraphsShortcutHandler creates a new graphsShortcut from the supplied information.
func (api shortcutsApi) createGraphsShortcutHandler(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), defaultDatabaseTimeout)
defer cancel()
w.Header().Set("Content-Type", "application/json")
shortcut := &graphsshortcut.GraphsShortcut{}
if err := json.NewDecoder(r.Body).Decode(shortcut); err != nil {
httputils.ReportError(w, err, "Unable to read shortcut body.", http.StatusInternalServerError)
return
}
id, err := api.graphsShortcutStore.InsertShortcut(ctx, shortcut)
if err != nil {
httputils.ReportError(w, err, "Error inserting graphs shortcut.", http.StatusInternalServerError)
return
}
if err := json.NewEncoder(w).Encode(map[string]string{"id": id}); err != nil {
sklog.Errorf("Failed to write or encode output: %s", err)
}
}