| 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) |
| } |
| } |