diff --git a/pkg/api/dtos/prefs.go b/pkg/api/dtos/prefs.go new file mode 100644 index 00000000000..f66068edccb --- /dev/null +++ b/pkg/api/dtos/prefs.go @@ -0,0 +1,7 @@ +package dtos + +type Preferences struct { + Theme string `json:"theme"` + HomeDashboardId int64 `json:"homeDashboardId"` + Timezone string `json:"timezone"` +} diff --git a/pkg/api/preferences.go b/pkg/api/preferences.go index f7a8028fd6d..7738d1f987a 100644 --- a/pkg/api/preferences.go +++ b/pkg/api/preferences.go @@ -1,6 +1,7 @@ package api import ( + "github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/middleware" m "github.com/grafana/grafana/pkg/models" @@ -29,11 +30,10 @@ func GetPreferences(c *middleware.Context) { c.JsonApiErr(500, "Failed to get preferences", err) } - dto := m.PreferencesDTO{ - Id: query.Result.Id, - UserId: query.Result.UserId, - OrgId: query.Result.OrgId, - Preference: query.Result.Preference, + dto := dtos.Preferences{ + HomeDashboardId: query.Result.HomeDashboardId, + Timezone: query.Result.Timezone, + Theme: query.Result.Theme, } c.JSON(200, dto) diff --git a/pkg/models/preferences.go b/pkg/models/preferences.go index 3d6ad44a515..5163835daf0 100644 --- a/pkg/models/preferences.go +++ b/pkg/models/preferences.go @@ -11,13 +11,15 @@ var ( ) type Preferences struct { - Id int64 - OrgId int64 - UserId int64 - Version int - Preference map[string]interface{} - Created time.Time - Updated time.Time + Id int64 + OrgId int64 + UserId int64 + Version int + HomeDashboardId int64 + Timezone string + Theme string + Created time.Time + Updated time.Time } // --------------------- @@ -33,19 +35,11 @@ type GetPreferencesQuery struct { // --------------------- // COMMANDS - type SavePreferencesCommand struct { - Preference map[string]interface{} `json:"Preference" binding:"Required"` - UserId int64 `json:"-"` - OrgId int64 `json:"-"` -} + UserId int64 + OrgId int64 -// ---------------------- -// DTO & Projections - -type PreferencesDTO struct { - Id int64 `json:"Id"` - UserId int64 `json:"UserId"` - OrgId int64 `json:"OrgId"` - Preference map[string]interface{} `json:"Preference"` + HomeDashboardId int64 + Timezone string + Theme string } diff --git a/pkg/services/sqlstore/migrations/preferences_mig.go b/pkg/services/sqlstore/migrations/preferences_mig.go index 46a91307a5d..6425c3735bb 100644 --- a/pkg/services/sqlstore/migrations/preferences_mig.go +++ b/pkg/services/sqlstore/migrations/preferences_mig.go @@ -4,20 +4,27 @@ import . "github.com/grafana/grafana/pkg/services/sqlstore/migrator" func addPreferencesMigrations(mg *Migrator) { - preferencesV1 := Table{ + mg.AddMigration("drop preferences table v2", NewDropTableMigration("preferences")) + + preferencesV2 := Table{ Name: "preferences", Columns: []*Column{ {Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true}, - {Name: "org_id", Type: DB_Int, Nullable: false}, - {Name: "user_id", Type: DB_NVarchar, Length: 255, Nullable: false}, + {Name: "org_id", Type: DB_Int, Nullable: true}, + {Name: "user_id", Type: DB_NVarchar, Length: 255, Nullable: true}, {Name: "version", Type: DB_Int, Nullable: false}, - {Name: "preference", Type: DB_Text, Nullable: false}, + {Name: "home_dashboard_id", Type: DB_BigInt, Nullable: true}, + {Name: "timezone", Type: DB_NVarchar, Length: 50, Nullable: true}, + {Name: "theme", Type: DB_NVarchar, Length: 20, Nullable: true}, {Name: "created", Type: DB_DateTime, Nullable: false}, {Name: "updated", Type: DB_DateTime, Nullable: false}, }, + Indices: []*Index{ + {Cols: []string{"org_id"}}, + {Cols: []string{"user_id"}}, + }, } // create table - mg.AddMigration("create preferences table v1", NewAddTableMigration(preferencesV1)) - + mg.AddMigration("create preferences table v2", NewAddTableMigration(preferencesV2)) } diff --git a/pkg/services/sqlstore/preferences.go b/pkg/services/sqlstore/preferences.go index ece113cf523..dfe960d1f39 100644 --- a/pkg/services/sqlstore/preferences.go +++ b/pkg/services/sqlstore/preferences.go @@ -3,7 +3,6 @@ package sqlstore import ( "github.com/grafana/grafana/pkg/bus" m "github.com/grafana/grafana/pkg/models" - "time" ) func init() { @@ -13,19 +12,15 @@ func init() { func GetPreferences(query *m.GetPreferencesQuery) error { - sql := `SELECT * FROM preferences WHERE user_id = ? ` + - `AND org_id = ?` + var prefs m.Preferences + exists, err := x.Where("org_id=? AND user_id=?", query.OrgId, query.UserId).Get(&prefs) - var prefResults = make([]m.Preferences, 0) - - resultsErr := x.Sql(sql, query.UserId, query.OrgId).Find(&prefResults) - - if resultsErr != nil { - return resultsErr + if err != nil { + return err } - if len(prefResults) > 0 { - query.Result = &prefResults[0] + if exists { + query.Result = &prefs } else { query.Result = new(m.Preferences) } @@ -36,51 +31,25 @@ func GetPreferences(query *m.GetPreferencesQuery) error { func SavePreferences(cmd *m.SavePreferencesCommand) error { return inTransaction2(func(sess *session) error { - sql := `SELECT * FROM preferences WHERE user_id = ? ` + - `AND org_id = ?` + var prefs m.Preferences + exists, err := sess.Where("org_id=? AND user_id=?", cmd.OrgId, cmd.UserId).Get(&prefs) - var prefResults = make([]m.Preferences, 0) - - resultsErr := sess.Sql(sql, cmd.UserId, cmd.OrgId).Find(&prefResults) - - if resultsErr != nil { - return resultsErr - } - - var savePref m.Preferences - var affectedRows int64 - var saveErr error - - if len(prefResults) == 0 { - savePref.UserId = cmd.UserId - savePref.OrgId = cmd.OrgId - savePref.Preference = cmd.Preference - savePref = SetPreferencesModel(savePref, false) - affectedRows, saveErr = sess.Insert(&savePref) + if !exists { + prefs = m.Preferences{ + UserId: cmd.UserId, + OrgId: cmd.OrgId, + HomeDashboardId: cmd.HomeDashboardId, + Timezone: cmd.Timezone, + Theme: cmd.Theme, + } + _, err = sess.Insert(&prefs) + return err } else { - savePref = prefResults[0] - savePref.Preference = cmd.Preference - savePref = SetPreferencesModel(savePref, true) - affectedRows, saveErr = sess.Id(savePref.Id).Update(&savePref) + prefs.HomeDashboardId = cmd.HomeDashboardId + prefs.Timezone = cmd.Timezone + prefs.Theme = cmd.Theme + _, err = sess.Id(prefs.Id).Update(&prefs) + return err } - - if affectedRows == 0 { - return m.ErrPreferencesNotFound - } - - return saveErr }) } - -func SetPreferencesModel(pref m.Preferences, updating bool) m.Preferences { - - if updating { - pref.Version = pref.Version + 1 - } else { - pref.Version = 0 - pref.Created = time.Now() - } - pref.Updated = time.Now() - - return pref -} diff --git a/public/app/features/dashboard/dashnav/dashnav.html b/public/app/features/dashboard/dashnav/dashnav.html index e8e1ddc9011..aec626bfe2a 100644 --- a/public/app/features/dashboard/dashnav/dashnav.html +++ b/public/app/features/dashboard/dashnav/dashnav.html @@ -48,7 +48,7 @@
  • View JSON
  • Make Editable
  • Save As...
  • -
  • Save As Home
  • +
  • Set As Home
  • Delete dashboard
  • diff --git a/public/app/features/dashboard/dashnav/dashnav.ts b/public/app/features/dashboard/dashnav/dashnav.ts index 4960b20397a..c6faaf9a738 100644 --- a/public/app/features/dashboard/dashnav/dashnav.ts +++ b/public/app/features/dashboard/dashnav/dashnav.ts @@ -104,22 +104,9 @@ export class DashNavCtrl { }; $scope.saveDashboardAsHome = function() { - var orgId = 'org-' + contextSrv.user.orgId; - backendSrv.get('/api/preferences').then(function(prefs) { - - // Checking if the preferences already exists or not - if (prefs.userId === 0 && prefs.orgId === 0 && prefs.preference === null) { - prefs.preference = {}; - } - if (prefs.preference == null) { - prefs.preference = { - home_dashboard_id: $scope.dashboard.id - }; - } else { - var orgPrefs = prefs.preference; - orgPrefs.home_dashboard = $scope.dashboard.id; - } - backendSrv.put('api/preferences', prefs); + // TODO: this backend method needs to be implemented + backendSrv.post('/api/preferences/set-home-dash', { + dashboardId: $scope.dashboard.id }); };