Jelajahi Sumber

feat(alerting): add api endpoints for listing alerts

bergquist 9 tahun lalu
induk
melakukan
9b50313f11
4 mengubah file dengan 93 tambahan dan 0 penghapusan
  1. 47 0
      pkg/api/alerting.go
  2. 5 0
      pkg/api/api.go
  3. 13 0
      pkg/models/alerts.go
  4. 28 0
      pkg/services/sqlstore/alerting.go

+ 47 - 0
pkg/api/alerting.go

@@ -0,0 +1,47 @@
+package api
+
+import (
+	"github.com/grafana/grafana/pkg/bus"
+	"github.com/grafana/grafana/pkg/middleware"
+	"github.com/grafana/grafana/pkg/models"
+)
+
+func ValidateOrgAlert(c *middleware.Context) {
+	id := c.ParamsInt64(":id")
+	query := models.GetAlertById{Id: id}
+
+	if err := bus.Dispatch(&query); err != nil {
+		c.JsonApiErr(404, "Alert not found", nil)
+		return
+	}
+
+	if c.OrgId != query.Result.OrgId {
+		c.JsonApiErr(403, "You are not allowed to edit/view alert", nil)
+		return
+	}
+}
+
+// GET /api/alert_rule
+func GetAlerts(c *middleware.Context) Response {
+	query := models.GetAlertsQuery{
+		OrgId: c.OrgId,
+	}
+
+	if err := bus.Dispatch(&query); err != nil {
+		return ApiError(500, "List alerts failed", err)
+	}
+
+	return Json(200, query.Result)
+}
+
+// GET /api/alert_rule/:id
+func GetAlert(c *middleware.Context) Response {
+	id := c.ParamsInt64(":id")
+	query := models.GetAlertById{Id: id}
+
+	if err := bus.Dispatch(&query); err != nil {
+		return ApiError(500, "List alerts failed", err)
+	}
+
+	return Json(200, &query.Result)
+}

+ 5 - 0
pkg/api/api.go

@@ -236,6 +236,11 @@ func Register(r *macaron.Macaron) {
 		// metrics
 		r.Get("/metrics/test", GetTestMetrics)
 
+		r.Group("/alert_rule", func() {
+			r.Get("/", wrap(GetAlerts))
+			r.Get("/:id", ValidateOrgAlert, wrap(GetAlert))
+		})
+
 	}, reqSignedIn)
 
 	// admin api

+ 13 - 0
pkg/models/alerts.go

@@ -82,3 +82,16 @@ type SaveAlertsCommand struct {
 
 	Alerts *[]AlertRule
 }
+
+//Queries
+type GetAlertsQuery struct {
+	OrgId int64
+
+	Result []AlertRule
+}
+
+type GetAlertById struct {
+	Id int64
+
+	Result AlertRule
+}

+ 28 - 0
pkg/services/sqlstore/alerting.go

@@ -1,6 +1,7 @@
 package sqlstore
 
 import (
+	"fmt"
 	"github.com/go-xorm/xorm"
 	"github.com/grafana/grafana/pkg/bus"
 	m "github.com/grafana/grafana/pkg/models"
@@ -9,6 +10,33 @@ import (
 
 func init() {
 	bus.AddHandler("sql", SaveAlerts)
+	bus.AddHandler("sql", GetAllAlertsForOrg)
+	bus.AddHandler("sql", GetAlertById)
+}
+
+func GetAlertById(query *m.GetAlertById) error {
+	alert := m.AlertRule{}
+	has, err := x.Id(query.Id).Get(&alert)
+
+	if !has {
+		return fmt.Errorf("could not find alert")
+	}
+	if err != nil {
+		return err
+	}
+	fmt.Printf("\n\n%v\n\n", query)
+	query.Result = alert
+	return nil
+}
+
+func GetAllAlertsForOrg(query *m.GetAlertsQuery) error {
+	alerts := make([]m.AlertRule, 0)
+	if err := x.Where("org_id = ?", query.OrgId).Find(&alerts); err != nil {
+		return err
+	}
+
+	query.Result = alerts
+	return nil
 }
 
 func DeleteAlertDefinition(dashboardId int64, sess *xorm.Session) error {