diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index 29a38e43bd6..d525e1a31e5 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -120,6 +120,16 @@ func PostDashboard(c *middleware.Context, cmd m.SaveDashboardCommand) Response { cmd.UserId = c.UserId } + validateAlertsCmd := alerting.ValidateDashboardAlertsCommand{ + OrgId: c.OrgId, + UserId: c.UserId, + Dashboard: cmd.Result, + } + + if err := bus.Dispatch(&validateAlertsCmd); err != nil { + return ApiError(500, "Invalid alert data. Cannot save dashboard", err) + } + dash := cmd.GetDashboardModel() if dash.Id == 0 { limitReached, err := middleware.QuotaReached(c, "dashboard") diff --git a/pkg/services/alerting/commands.go b/pkg/services/alerting/commands.go index 4e269aca695..62671a559fa 100644 --- a/pkg/services/alerting/commands.go +++ b/pkg/services/alerting/commands.go @@ -11,8 +11,25 @@ type UpdateDashboardAlertsCommand struct { Dashboard *m.Dashboard } +type ValidateDashboardAlertsCommand struct { + UserId int64 + OrgId int64 + Dashboard *m.Dashboard +} + func init() { bus.AddHandler("alerting", updateDashboardAlerts) + bus.AddHandler("alerting", validateDashboardAlerts) +} + +func validateDashboardAlerts(cmd *ValidateDashboardAlertsCommand) error { + extractor := NewDashAlertExtractor(cmd.Dashboard, cmd.OrgId) + + if _, err := extractor.GetAlerts(); err != nil { + return err + } + + return nil } func updateDashboardAlerts(cmd *UpdateDashboardAlertsCommand) error {