diff --git a/pkg/api/api.go b/pkg/api/api.go index ed029a5171a..c02629ddd8f 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -96,6 +96,7 @@ func Register(r *macaron.Macaron) { r.Delete("/stars/dashboard/:id", wrap(UnstarDashboard)) r.Put("/password", bind(m.ChangeUserPasswordCommand{}), wrap(ChangeUserPassword)) r.Get("/quotas", wrap(GetUserQuotas)) + r.Combo("/prefs").Get(GetUserPreferences).Put(bind(m.SavePreferencesCommand{}), wrap(SaveUserPreferences)) }) // users (admin permission required) diff --git a/pkg/api/preferences.go b/pkg/api/preferences.go new file mode 100644 index 00000000000..b39d0446a9b --- /dev/null +++ b/pkg/api/preferences.go @@ -0,0 +1,39 @@ +package api + +import ( + "github.com/grafana/grafana/pkg/bus" + "github.com/grafana/grafana/pkg/middleware" + m "github.com/grafana/grafana/pkg/models" +) + +// PUT /api/user/prefs +func SaveUserPreferences(c *middleware.Context, cmd m.SavePreferencesCommand) Response { + + cmd.PrefId = c.UserId + cmd.PrefType = `user` + + if err := bus.Dispatch(&cmd); err != nil { + return ApiError(500, "Failed to saved user preferences", err) + } + + return ApiSuccess("User preferences saved") + +} + +// GET /api/user/prefs +func GetUserPreferences(c *middleware.Context) { + + query := m.GetPreferencesQuery{PrefId: c.UserId, PrefType: `user`} + + if err := bus.Dispatch(&query); err != nil { + c.JsonApiErr(500, "Failed to get preferences for user", err) + } + + dto := m.PreferencesDTO{ + PrefId: query.Result.PrefId, + PrefType: query.Result.PrefType, + PrefData: query.Result.PrefData, + } + + c.JSON(200, dto) +} diff --git a/pkg/models/preferences.go b/pkg/models/preferences.go new file mode 100644 index 00000000000..237e577dbc9 --- /dev/null +++ b/pkg/models/preferences.go @@ -0,0 +1,45 @@ +package models + +import ( + "errors" +) + +// Typed errors +var ( + ErrPreferencesNotFound = errors.New("Preferences not found") +) + +type Preferences struct { + Id int64 + PrefId int64 + PrefType string + PrefData map[string]interface{} +} + +// --------------------- +// QUERIES + +type GetPreferencesQuery struct { + PrefId int64 + PrefType string + + Result *Preferences +} + +// --------------------- +// COMMANDS + +type SavePreferencesCommand struct { + PrefData map[string]interface{} `json:"prefData" binding:"Required"` + PrefId int64 `json:"-"` + PrefType string `json:"-"` +} + +// ---------------------- +// DTO & Projections + +type PreferencesDTO struct { + PrefId int64 `json:"prefId"` + PrefType string `json:"prefType"` + PrefData map[string]interface{} `json:"prefData"` +} diff --git a/pkg/services/sqlstore/preferences.go b/pkg/services/sqlstore/preferences.go new file mode 100644 index 00000000000..b03463f8089 --- /dev/null +++ b/pkg/services/sqlstore/preferences.go @@ -0,0 +1,70 @@ +package sqlstore + +import ( + "github.com/grafana/grafana/pkg/bus" + m "github.com/grafana/grafana/pkg/models" +) + +func init() { + bus.AddHandler("sql", GetPreferences) + bus.AddHandler("sql", SavePreferences) +} + +func GetPreferences(query *m.GetPreferencesQuery) error { + + sql := `SELECT * FROM preferences WHERE pref_id = ? ` + + `AND pref_type = ?` + + var prefResults = make([]m.Preferences, 0) + + resultsErr := x.Sql(sql, query.PrefId, query.PrefType).Find(&prefResults) + + if resultsErr != nil { + return resultsErr + } + + if len(prefResults) > 0 { + query.Result = &prefResults[0] + } else { + query.Result = new(m.Preferences) + } + + return nil +} + +func SavePreferences(cmd *m.SavePreferencesCommand) error { + return inTransaction2(func(sess *session) error { + + sql := `SELECT * FROM preferences WHERE pref_id = ? ` + + `AND pref_type = ?` + + var prefResults = make([]m.Preferences, 0) + + resultsErr := sess.Sql(sql, cmd.PrefId, cmd.PrefType).Find(&prefResults) + + if resultsErr != nil { + return resultsErr + } + + var savePref m.Preferences + var affectedRows int64 + var saveErr error + + if len(prefResults) == 0 { + savePref.PrefId = cmd.PrefId + savePref.PrefType = cmd.PrefType + savePref.PrefData = cmd.PrefData + affectedRows, saveErr = sess.Insert(&savePref) + } else { + savePref = prefResults[0] + savePref.PrefData = cmd.PrefData + affectedRows, saveErr = sess.Id(savePref.Id).Update(&savePref) + } + + if affectedRows == 0 { + return m.ErrPreferencesNotFound + } + + return saveErr + }) +}