Browse Source

feat(preferences): lots of refactoring and changes to #3214

Torkel Ödegaard 9 years ago
parent
commit
a88176e060

+ 7 - 0
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"`
+}

+ 5 - 5
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)

+ 14 - 20
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:"-"`
-}
-
-// ----------------------
-// DTO & Projections
+	UserId int64
+	OrgId  int64
 
-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
 }

+ 13 - 6
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))
 }

+ 24 - 55
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 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)
+		var prefs m.Preferences
+		exists, err := sess.Where("org_id=? AND user_id=?", cmd.OrgId, cmd.UserId).Get(&prefs)
+
+		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
-}

+ 1 - 1
public/app/features/dashboard/dashnav/dashnav.html

@@ -48,7 +48,7 @@
 			<li ng-if="dashboardMeta.canEdit"><a class="pointer" ng-click="editJson();">View JSON</a></li>
 			<li ng-if="contextSrv.isEditor && !dashboard.editable"><a class="pointer" ng-click="makeEditable();">Make Editable</a></li>
 			<li ng-if="contextSrv.isEditor"><a class="pointer" ng-click="saveDashboardAs();">Save As...</a></li>
-      <li ng-if="contextSrv.isEditor"><a class="pointer" ng-click="saveDashboardAsHome();">Save As Home</a></li>
+      <li ng-if="dashboard.id"><a class="pointer" ng-click="saveDashboardAsHome();">Set As Home</a></li>
 			<li ng-if="dashboardMeta.canSave"><a class="pointer" ng-click="deleteDashboard();">Delete dashboard</a></li>
 		</ul>
 	</li>

+ 3 - 16
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
       });
     };