Files
grafana/pkg/services/librarypanels/api.go
Hugo Häggmark f508a16a43 LibraryPanels: Improves the Get All experience (#32028)
* LibraryPanels: Improves Get All Api

* Refactor: using useReducer instead of useState

* Refactor: adds Pagination to UI

* Tests: adds reducer tests

* Refactor: using Observable instead to avoid flickering

* Refactor: moves exclusion to backend instead

* Chore: changing back the perPage default value
2021-03-18 11:19:41 +01:00

133 lines
5.2 KiB
Go

package librarypanels
import (
"errors"
"github.com/go-macaron/binding"
"github.com/grafana/grafana/pkg/api/response"
"github.com/grafana/grafana/pkg/api/routing"
"github.com/grafana/grafana/pkg/middleware"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/util"
)
func (lps *LibraryPanelService) registerAPIEndpoints() {
if !lps.IsEnabled() {
return
}
lps.RouteRegister.Group("/api/library-panels", func(libraryPanels routing.RouteRegister) {
libraryPanels.Post("/", middleware.ReqSignedIn, binding.Bind(createLibraryPanelCommand{}), routing.Wrap(lps.createHandler))
libraryPanels.Post("/:uid/dashboards/:dashboardId", middleware.ReqSignedIn, routing.Wrap(lps.connectHandler))
libraryPanels.Delete("/:uid", middleware.ReqSignedIn, routing.Wrap(lps.deleteHandler))
libraryPanels.Delete("/:uid/dashboards/:dashboardId", middleware.ReqSignedIn, routing.Wrap(lps.disconnectHandler))
libraryPanels.Get("/", middleware.ReqSignedIn, routing.Wrap(lps.getAllHandler))
libraryPanels.Get("/:uid", middleware.ReqSignedIn, routing.Wrap(lps.getHandler))
libraryPanels.Get("/:uid/dashboards/", middleware.ReqSignedIn, routing.Wrap(lps.getConnectedDashboardsHandler))
libraryPanels.Patch("/:uid", middleware.ReqSignedIn, binding.Bind(patchLibraryPanelCommand{}), routing.Wrap(lps.patchHandler))
})
}
// createHandler handles POST /api/library-panels.
func (lps *LibraryPanelService) createHandler(c *models.ReqContext, cmd createLibraryPanelCommand) response.Response {
panel, err := lps.createLibraryPanel(c, cmd)
if err != nil {
return toLibraryPanelError(err, "Failed to create library panel")
}
return response.JSON(200, util.DynMap{"result": panel})
}
// connectHandler handles POST /api/library-panels/:uid/dashboards/:dashboardId.
func (lps *LibraryPanelService) connectHandler(c *models.ReqContext) response.Response {
err := lps.connectDashboard(c, c.Params(":uid"), c.ParamsInt64(":dashboardId"))
if err != nil {
return toLibraryPanelError(err, "Failed to connect library panel")
}
return response.Success("Library panel connected")
}
// deleteHandler handles DELETE /api/library-panels/:uid.
func (lps *LibraryPanelService) deleteHandler(c *models.ReqContext) response.Response {
err := lps.deleteLibraryPanel(c, c.Params(":uid"))
if err != nil {
return toLibraryPanelError(err, "Failed to delete library panel")
}
return response.Success("Library panel deleted")
}
// disconnectHandler handles DELETE /api/library-panels/:uid/dashboards/:dashboardId.
func (lps *LibraryPanelService) disconnectHandler(c *models.ReqContext) response.Response {
err := lps.disconnectDashboard(c, c.Params(":uid"), c.ParamsInt64(":dashboardId"))
if err != nil {
return toLibraryPanelError(err, "Failed to disconnect library panel")
}
return response.Success("Library panel disconnected")
}
// getHandler handles GET /api/library-panels/:uid.
func (lps *LibraryPanelService) getHandler(c *models.ReqContext) response.Response {
libraryPanel, err := lps.getLibraryPanel(c, c.Params(":uid"))
if err != nil {
return toLibraryPanelError(err, "Failed to get library panel")
}
return response.JSON(200, util.DynMap{"result": libraryPanel})
}
// getAllHandler handles GET /api/library-panels/.
func (lps *LibraryPanelService) getAllHandler(c *models.ReqContext) response.Response {
libraryPanels, err := lps.getAllLibraryPanels(c, c.QueryInt("perPage"), c.QueryInt("page"), c.Query("name"), c.Query("excludeUid"))
if err != nil {
return toLibraryPanelError(err, "Failed to get library panels")
}
return response.JSON(200, util.DynMap{"result": libraryPanels})
}
// getConnectedDashboardsHandler handles GET /api/library-panels/:uid/dashboards/.
func (lps *LibraryPanelService) getConnectedDashboardsHandler(c *models.ReqContext) response.Response {
dashboardIDs, err := lps.getConnectedDashboards(c, c.Params(":uid"))
if err != nil {
return toLibraryPanelError(err, "Failed to get connected dashboards")
}
return response.JSON(200, util.DynMap{"result": dashboardIDs})
}
// patchHandler handles PATCH /api/library-panels/:uid
func (lps *LibraryPanelService) patchHandler(c *models.ReqContext, cmd patchLibraryPanelCommand) response.Response {
libraryPanel, err := lps.patchLibraryPanel(c, cmd, c.Params(":uid"))
if err != nil {
return toLibraryPanelError(err, "Failed to update library panel")
}
return response.JSON(200, util.DynMap{"result": libraryPanel})
}
func toLibraryPanelError(err error, message string) response.Response {
if errors.Is(err, errLibraryPanelAlreadyExists) {
return response.Error(400, errLibraryPanelAlreadyExists.Error(), err)
}
if errors.Is(err, errLibraryPanelNotFound) {
return response.Error(404, errLibraryPanelNotFound.Error(), err)
}
if errors.Is(err, errLibraryPanelDashboardNotFound) {
return response.Error(404, errLibraryPanelDashboardNotFound.Error(), err)
}
if errors.Is(err, errLibraryPanelVersionMismatch) {
return response.Error(412, errLibraryPanelVersionMismatch.Error(), err)
}
if errors.Is(err, models.ErrFolderNotFound) {
return response.Error(404, models.ErrFolderNotFound.Error(), err)
}
if errors.Is(err, models.ErrFolderAccessDenied) {
return response.Error(403, models.ErrFolderAccessDenied.Error(), err)
}
return response.Error(500, message, err)
}