mirror of
https://github.com/grafana/grafana.git
synced 2025-07-29 17:02:20 +08:00

* Chore: Replace response status with const var * Apply suggestions from code review Co-authored-by: Sofia Papagiannaki <1632407+papagian@users.noreply.github.com> * Add net/http import --------- Co-authored-by: Sofia Papagiannaki <1632407+papagian@users.noreply.github.com>
113 lines
3.5 KiB
Go
113 lines
3.5 KiB
Go
package api
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"github.com/grafana/grafana/pkg/api/apierrors"
|
|
"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/services/accesscontrol"
|
|
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
|
"github.com/grafana/grafana/pkg/services/dashboardimport"
|
|
"github.com/grafana/grafana/pkg/services/dashboardimport/utils"
|
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
|
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
|
|
"github.com/grafana/grafana/pkg/services/quota"
|
|
"github.com/grafana/grafana/pkg/web"
|
|
)
|
|
|
|
type ImportDashboardAPI struct {
|
|
dashboardImportService dashboardimport.Service
|
|
quotaService QuotaService
|
|
pluginStore pluginstore.Store
|
|
ac accesscontrol.AccessControl
|
|
}
|
|
|
|
func New(dashboardImportService dashboardimport.Service, quotaService QuotaService,
|
|
pluginStore pluginstore.Store, ac accesscontrol.AccessControl) *ImportDashboardAPI {
|
|
return &ImportDashboardAPI{
|
|
dashboardImportService: dashboardImportService,
|
|
quotaService: quotaService,
|
|
pluginStore: pluginStore,
|
|
ac: ac,
|
|
}
|
|
}
|
|
|
|
func (api *ImportDashboardAPI) RegisterAPIEndpoints(routeRegister routing.RouteRegister) {
|
|
authorize := accesscontrol.Middleware(api.ac)
|
|
routeRegister.Group("/api/dashboards", func(route routing.RouteRegister) {
|
|
route.Post(
|
|
"/import",
|
|
authorize(accesscontrol.EvalPermission(dashboards.ActionDashboardsCreate)),
|
|
routing.Wrap(api.ImportDashboard),
|
|
)
|
|
}, middleware.ReqSignedIn)
|
|
}
|
|
|
|
// swagger:route POST /dashboards/import dashboards importDashboard
|
|
//
|
|
// Import dashboard.
|
|
//
|
|
// Responses:
|
|
// 200: importDashboardResponse
|
|
// 400: badRequestError
|
|
// 401: unauthorisedError
|
|
// 412: preconditionFailedError
|
|
// 422: unprocessableEntityError
|
|
// 500: internalServerError
|
|
func (api *ImportDashboardAPI) ImportDashboard(c *contextmodel.ReqContext) response.Response {
|
|
req := dashboardimport.ImportDashboardRequest{}
|
|
if err := web.Bind(c.Req, &req); err != nil {
|
|
return response.Error(http.StatusBadRequest, "bad request data", err)
|
|
}
|
|
|
|
if req.PluginId == "" && req.Dashboard == nil {
|
|
return response.Error(http.StatusUnprocessableEntity, "Dashboard must be set", nil)
|
|
}
|
|
|
|
limitReached, err := api.quotaService.QuotaReached(c, dashboards.QuotaTargetSrv)
|
|
if err != nil {
|
|
return response.Err(err)
|
|
}
|
|
|
|
if limitReached {
|
|
return response.Error(http.StatusForbidden, "Quota reached", nil)
|
|
}
|
|
|
|
req.User = c.SignedInUser
|
|
resp, err := api.dashboardImportService.ImportDashboard(c.Req.Context(), &req)
|
|
if err != nil {
|
|
if errors.Is(err, utils.ErrDashboardInputMissing) {
|
|
return response.Error(http.StatusBadRequest, err.Error(), err)
|
|
}
|
|
return apierrors.ToDashboardErrorResponse(c.Req.Context(), api.pluginStore, err)
|
|
}
|
|
|
|
return response.JSON(http.StatusOK, resp)
|
|
}
|
|
|
|
type QuotaService interface {
|
|
QuotaReached(c *contextmodel.ReqContext, target quota.TargetSrv) (bool, error)
|
|
}
|
|
|
|
type quotaServiceFunc func(c *contextmodel.ReqContext, target quota.TargetSrv) (bool, error)
|
|
|
|
func (fn quotaServiceFunc) QuotaReached(c *contextmodel.ReqContext, target quota.TargetSrv) (bool, error) {
|
|
return fn(c, target)
|
|
}
|
|
|
|
// swagger:parameters importDashboard
|
|
type ImportDashboardParams struct {
|
|
// in:body
|
|
// required:true
|
|
Body dashboardimport.ImportDashboardRequest
|
|
}
|
|
|
|
// swagger:response importDashboardResponse
|
|
type ImportDashboardResponse struct {
|
|
// in: body
|
|
Body dashboardimport.ImportDashboardResponse `json:"body"`
|
|
}
|