diff --git a/pkg/api/alerting.go b/pkg/api/alerting.go new file mode 100644 index 00000000000..9f817b64d7d --- /dev/null +++ b/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) +} diff --git a/pkg/api/api.go b/pkg/api/api.go index 684633e0bcd..a01a4124c01 100644 --- a/pkg/api/api.go +++ b/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 diff --git a/pkg/models/alerts.go b/pkg/models/alerts.go index 9e84a7cce7b..19c47cb30b4 100644 --- a/pkg/models/alerts.go +++ b/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 +} diff --git a/pkg/services/sqlstore/alerting.go b/pkg/services/sqlstore/alerting.go index 3872dfc6933..f1d7b634d62 100644 --- a/pkg/services/sqlstore/alerting.go +++ b/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 {