diff --git a/pkg/models/alert_notifications.go b/pkg/models/alert_notifications.go index b0dcfcfb82e..5f6fb6b5018 100644 --- a/pkg/models/alert_notifications.go +++ b/pkg/models/alert_notifications.go @@ -27,6 +27,7 @@ type CreateAlertNotificationCommand struct { } type UpdateAlertNotificationCommand struct { + Id int64 Name string Type string OrgID int64 diff --git a/pkg/services/sqlstore/alert_notification.go b/pkg/services/sqlstore/alert_notification.go index 5a173c548b7..d64edf3a043 100644 --- a/pkg/services/sqlstore/alert_notification.go +++ b/pkg/services/sqlstore/alert_notification.go @@ -2,16 +2,25 @@ package sqlstore import ( "bytes" + "fmt" + "time" + "github.com/go-xorm/xorm" "github.com/grafana/grafana/pkg/bus" m "github.com/grafana/grafana/pkg/models" ) func init() { - bus.AddHandler("sql", GetAlertNotifications) + bus.AddHandler("sql", AlertNotificationQuery) + bus.AddHandler("sql", CreateAlertNotificationCommand) + bus.AddHandler("sql", UpdateAlertNotification) } -func GetAlertNotifications(query *m.GetAlertNotificationQuery) error { +func AlertNotificationQuery(query *m.GetAlertNotificationQuery) error { + return getAlertNotifications(query, x.NewSession()) +} + +func getAlertNotifications(query *m.GetAlertNotificationQuery, sess *xorm.Session) error { var sql bytes.Buffer params := make([]interface{}, 0) @@ -35,7 +44,7 @@ func GetAlertNotifications(query *m.GetAlertNotificationQuery) error { } var result []*m.AlertNotification - if err := x.Sql(sql.String(), params...).Find(&result); err != nil { + if err := sess.Sql(sql.String(), params...).Find(&result); err != nil { return err } @@ -43,14 +52,66 @@ func GetAlertNotifications(query *m.GetAlertNotificationQuery) error { return nil } -/* -func CreateAlertNotification(cmd *m.CreateAlertNotificationCommand) error { +func CreateAlertNotificationCommand(cmd *m.CreateAlertNotificationCommand) error { return inTransaction(func(sess *xorm.Session) error { + existingQuery := &m.GetAlertNotificationQuery{OrgID: cmd.OrgID, Name: cmd.Name} + err := getAlertNotifications(existingQuery, sess) + + if err != nil { + return err + } + + if len(existingQuery.Result) > 0 { + return fmt.Errorf("Alert notification name %s already exists", cmd.Name) + } + alertNotification := &m.AlertNotification{ + OrgId: cmd.OrgID, + Name: cmd.Name, + Type: cmd.Type, + Created: time.Now(), + Settings: cmd.Settings, + } + id, err := sess.Insert(alertNotification) + + if err != nil { + return err + } + + alertNotification.Id = id + cmd.Result = alertNotification + return nil }) } func UpdateAlertNotification(cmd *m.UpdateAlertNotificationCommand) error { + return inTransaction(func(sess *xorm.Session) (err error) { + an := &m.AlertNotification{} + + var has bool + has, err = sess.Id(cmd.Id).Get(an) -}*/ + if err != nil { + return err + } + + if !has { + return fmt.Errorf("Alert notification does not exist") + } + + an.Name = cmd.Name + an.Type = cmd.Type + an.Settings = cmd.Settings + an.Updated = time.Now() + + _, err = sess.Id(an.Id).Cols("name", "type", "settings", "updated").Update(an) + + if err != nil { + return err + } + + cmd.Result = an + return nil + }) +} diff --git a/pkg/services/sqlstore/alert_notification_test.go b/pkg/services/sqlstore/alert_notification_test.go index 332394e97be..48dcd23b751 100644 --- a/pkg/services/sqlstore/alert_notification_test.go +++ b/pkg/services/sqlstore/alert_notification_test.go @@ -11,6 +11,7 @@ import ( func TestAlertNotificationSQLAccess(t *testing.T) { Convey("Testing Alert notification sql access", t, func() { InitTestDB(t) + var err error Convey("Alert notifications should be empty", func() { cmd := &m.GetAlertNotificationQuery{ @@ -18,19 +19,49 @@ func TestAlertNotificationSQLAccess(t *testing.T) { Name: "email", } - err := GetAlertNotifications(cmd) + err := AlertNotificationQuery(cmd) fmt.Printf("errror %v", err) So(err, ShouldBeNil) So(len(cmd.Result), ShouldEqual, 0) }) - /* - Convey("Can save Alert Notification", func() { - cmd := &m.CreateAlertNotificationCommand{} - var err error - err = CreateAlertNotification(cmd) + Convey("Can save Alert Notification", func() { + cmd := &m.CreateAlertNotificationCommand{ + Name: "ops", + Type: "email", + } + + err = CreateAlertNotificationCommand(cmd) + So(err, ShouldBeNil) + So(cmd.Result.Id, ShouldNotEqual, 0) + Convey("Cannot save Alert Notification with the same name", func() { + err = CreateAlertNotificationCommand(cmd) + So(err, ShouldNotBeNil) + }) + + Convey("Cannot update alert notification that does not exist", func() { + newCmd := &m.UpdateAlertNotificationCommand{ + Name: "NewName", + Type: cmd.Result.Type, + OrgID: cmd.Result.OrgId, + Id: 1337, + } + err = UpdateAlertNotification(newCmd) + So(err, ShouldNotBeNil) + }) + + Convey("Can update alert notification", func() { + newCmd := &m.UpdateAlertNotificationCommand{ + Name: "NewName", + Type: cmd.Result.Type, + OrgID: cmd.Result.OrgId, + Id: cmd.Result.Id, + } + err = UpdateAlertNotification(newCmd) So(err, ShouldBeNil) - }) */ + So(newCmd.Result.Name, ShouldEqual, "NewName") + }) + }) }) }