From 43b474143cf1c55264ef033299aa253a7c98e618 Mon Sep 17 00:00:00 2001 From: utkarshcmu Date: Fri, 11 Mar 2016 06:30:05 -0800 Subject: [PATCH 1/3] Preferences model updated --- pkg/api/api.go | 3 +- pkg/api/preferences.go | 23 +++++++------- pkg/models/preferences.go | 30 +++++++++++-------- .../sqlstore/migrations/preferences_mig.go | 9 ++++-- pkg/services/sqlstore/preferences.go | 20 ++++++------- 5 files changed, 48 insertions(+), 37 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index c02629ddd8f..bbf0fc522c9 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -96,7 +96,6 @@ 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) @@ -165,6 +164,8 @@ func Register(r *macaron.Macaron) { r.Delete("/:id", wrap(DeleteApiKey)) }, reqOrgAdmin) + r.Combo("/preferences").Get(GetPreferences).Put(bind(m.SavePreferencesCommand{}), wrap(SavePreferences)) + // Data sources r.Group("/datasources", func() { r.Get("/", GetDataSources) diff --git a/pkg/api/preferences.go b/pkg/api/preferences.go index b39d0446a9b..c95bcd46aa2 100644 --- a/pkg/api/preferences.go +++ b/pkg/api/preferences.go @@ -7,32 +7,33 @@ import ( ) // PUT /api/user/prefs -func SaveUserPreferences(c *middleware.Context, cmd m.SavePreferencesCommand) Response { +func SavePreferences(c *middleware.Context, cmd m.SavePreferencesCommand) Response { - cmd.PrefId = c.UserId - cmd.PrefType = `user` + cmd.UserId = c.UserId + cmd.OrgId = c.OrgId if err := bus.Dispatch(&cmd); err != nil { - return ApiError(500, "Failed to saved user preferences", err) + return ApiError(500, "Failed to saved preferences", err) } - return ApiSuccess("User preferences saved") + return ApiSuccess("Preferences saved") } // GET /api/user/prefs -func GetUserPreferences(c *middleware.Context) { +func GetPreferences(c *middleware.Context) { - query := m.GetPreferencesQuery{PrefId: c.UserId, PrefType: `user`} + query := m.GetPreferencesQuery{UserId: c.UserId, OrgId: c.OrgId} if err := bus.Dispatch(&query); err != nil { - c.JsonApiErr(500, "Failed to get preferences for user", err) + c.JsonApiErr(500, "Failed to get preferences", err) } dto := m.PreferencesDTO{ - PrefId: query.Result.PrefId, - PrefType: query.Result.PrefType, - PrefData: query.Result.PrefData, + Id: query.Result.Id, + UserId: query.Result.UserId, + OrgId: query.Result.OrgId, + Preference: query.Result.Preference, } c.JSON(200, dto) diff --git a/pkg/models/preferences.go b/pkg/models/preferences.go index 237e577dbc9..f2a26da4ba9 100644 --- a/pkg/models/preferences.go +++ b/pkg/models/preferences.go @@ -2,6 +2,7 @@ package models import ( "errors" + "time" ) // Typed errors @@ -10,18 +11,22 @@ var ( ) type Preferences struct { - Id int64 - PrefId int64 - PrefType string - PrefData map[string]interface{} + Id int64 + OrgId int64 + UserId int64 + Version int + Preference map[string]interface{} + Created time.Time + Updated time.Time } // --------------------- // QUERIES type GetPreferencesQuery struct { - PrefId int64 - PrefType string + Id int64 + OrgId int64 + UserId int64 Result *Preferences } @@ -30,16 +35,17 @@ type GetPreferencesQuery struct { // COMMANDS type SavePreferencesCommand struct { - PrefData map[string]interface{} `json:"prefData" binding:"Required"` - PrefId int64 `json:"-"` - PrefType string `json:"-"` + Preference map[string]interface{} `json:"Preference" binding:"Required"` + UserId int64 `json:"-"` + OrgId int64 `json:"-"` } // ---------------------- // DTO & Projections type PreferencesDTO struct { - PrefId int64 `json:"prefId"` - PrefType string `json:"prefType"` - PrefData map[string]interface{} `json:"prefData"` + Id int64 `json:"Id"` + UserId int64 `json:"UserId"` + OrgId int64 `json:"OrgId"` + Preference map[string]interface{} `json:"Preference"` } diff --git a/pkg/services/sqlstore/migrations/preferences_mig.go b/pkg/services/sqlstore/migrations/preferences_mig.go index 0ce01857b75..c14e47a8733 100644 --- a/pkg/services/sqlstore/migrations/preferences_mig.go +++ b/pkg/services/sqlstore/migrations/preferences_mig.go @@ -8,9 +8,12 @@ func addPreferencesMigrations(mg *Migrator) { Name: "preferences", Columns: []*Column{ {Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true}, - {Name: "pref_id", Type: DB_Int, Nullable: false}, - {Name: "pref_type", Type: DB_NVarchar, Length: 255, Nullable: false}, - {Name: "pref_data", Type: DB_Text, Nullable: false}, + {Name: "org_id", Type: DB_Int, Nullable: false}, + {Name: "user_id", Type: DB_NVarchar, Length: 255, Nullable: false}, + {Name: "version", Type: DB_Int, Nullable: false}, + {Name: "preference", Type: DB_Text, Nullable: false}, + {Name: "created", Type: DB_DateTime, Nullable: false}, + {Name: "updated", Type: DB_DateTime, Nullable: false}, }, } diff --git a/pkg/services/sqlstore/preferences.go b/pkg/services/sqlstore/preferences.go index b03463f8089..9d395d95304 100644 --- a/pkg/services/sqlstore/preferences.go +++ b/pkg/services/sqlstore/preferences.go @@ -12,12 +12,12 @@ func init() { func GetPreferences(query *m.GetPreferencesQuery) error { - sql := `SELECT * FROM preferences WHERE pref_id = ? ` + - `AND pref_type = ?` + sql := `SELECT * FROM preferences WHERE user_id = ? ` + + `AND org_id = ?` var prefResults = make([]m.Preferences, 0) - resultsErr := x.Sql(sql, query.PrefId, query.PrefType).Find(&prefResults) + resultsErr := x.Sql(sql, query.UserId, query.OrgId).Find(&prefResults) if resultsErr != nil { return resultsErr @@ -35,12 +35,12 @@ func GetPreferences(query *m.GetPreferencesQuery) error { func SavePreferences(cmd *m.SavePreferencesCommand) error { return inTransaction2(func(sess *session) error { - sql := `SELECT * FROM preferences WHERE pref_id = ? ` + - `AND pref_type = ?` + sql := `SELECT * FROM preferences WHERE user_id = ? ` + + `AND org_id = ?` var prefResults = make([]m.Preferences, 0) - resultsErr := sess.Sql(sql, cmd.PrefId, cmd.PrefType).Find(&prefResults) + resultsErr := sess.Sql(sql, cmd.UserId, cmd.OrgId).Find(&prefResults) if resultsErr != nil { return resultsErr @@ -51,13 +51,13 @@ func SavePreferences(cmd *m.SavePreferencesCommand) error { var saveErr error if len(prefResults) == 0 { - savePref.PrefId = cmd.PrefId - savePref.PrefType = cmd.PrefType - savePref.PrefData = cmd.PrefData + savePref.UserId = cmd.UserId + savePref.OrgId = cmd.OrgId + savePref.Preference = cmd.Preference affectedRows, saveErr = sess.Insert(&savePref) } else { savePref = prefResults[0] - savePref.PrefData = cmd.PrefData + savePref.Preference = cmd.Preference affectedRows, saveErr = sess.Id(savePref.Id).Update(&savePref) } From 0bf721a74ce3cf102142889976fe7f6ff9bc9bda Mon Sep 17 00:00:00 2001 From: utkarshcmu Date: Sun, 13 Mar 2016 23:57:38 -0700 Subject: [PATCH 2/3] Able to save home dashboard --- .../features/dashboard/dashnav/dashnav.html | 1 + .../app/features/dashboard/dashnav/dashnav.ts | 22 ++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/public/app/features/dashboard/dashnav/dashnav.html b/public/app/features/dashboard/dashnav/dashnav.html index 19112f77a43..e8e1ddc9011 100644 --- a/public/app/features/dashboard/dashnav/dashnav.html +++ b/public/app/features/dashboard/dashnav/dashnav.html @@ -48,6 +48,7 @@
  • View JSON
  • Make Editable
  • Save As...
  • +
  • Save As Home
  • Delete dashboard
  • diff --git a/public/app/features/dashboard/dashnav/dashnav.ts b/public/app/features/dashboard/dashnav/dashnav.ts index dcc2f40d0dc..44ab8710144 100644 --- a/public/app/features/dashboard/dashnav/dashnav.ts +++ b/public/app/features/dashboard/dashnav/dashnav.ts @@ -7,7 +7,7 @@ import angular from 'angular'; export class DashNavCtrl { /** @ngInject */ - constructor($scope, $rootScope, alertSrv, $location, playlistSrv, backendSrv, $timeout) { + constructor($scope, $rootScope, alertSrv, $location, playlistSrv, backendSrv, contextSrv, $timeout) { $scope.init = function() { $scope.onAppEvent('save-dashboard', $scope.saveDashboard); @@ -103,6 +103,26 @@ export class DashNavCtrl { }, $scope.handleSaveDashError); }; + $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); + }); + }; + $scope.handleSaveDashError = function(err) { if (err.data && err.data.status === "version-mismatch") { err.isHandled = true; From e371e03696acde9151f8594a740e9682e6fa90d5 Mon Sep 17 00:00:00 2001 From: utkarshcmu Date: Mon, 14 Mar 2016 03:12:52 -0700 Subject: [PATCH 3/3] Able to save preference version, created, updated fields --- pkg/api/api.go | 2 +- pkg/api/preferences.go | 6 +++--- pkg/models/preferences.go | 12 ++++++------ .../sqlstore/migrations/preferences_mig.go | 6 +++--- pkg/services/sqlstore/preferences.go | 16 ++++++++++++++++ 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index bbf0fc522c9..d58f54b1783 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -164,7 +164,7 @@ func Register(r *macaron.Macaron) { r.Delete("/:id", wrap(DeleteApiKey)) }, reqOrgAdmin) - r.Combo("/preferences").Get(GetPreferences).Put(bind(m.SavePreferencesCommand{}), wrap(SavePreferences)) + r.Combo("/preferences").Get(GetPreferences).Put(bind(m.SavePreferencesCommand{}), wrap(SavePreferences)) // Data sources r.Group("/datasources", func() { diff --git a/pkg/api/preferences.go b/pkg/api/preferences.go index c95bcd46aa2..f7a8028fd6d 100644 --- a/pkg/api/preferences.go +++ b/pkg/api/preferences.go @@ -10,10 +10,10 @@ import ( func SavePreferences(c *middleware.Context, cmd m.SavePreferencesCommand) Response { cmd.UserId = c.UserId - cmd.OrgId = c.OrgId + cmd.OrgId = c.OrgId if err := bus.Dispatch(&cmd); err != nil { - return ApiError(500, "Failed to saved preferences", err) + return ApiError(500, "Failed to save preferences", err) } return ApiSuccess("Preferences saved") @@ -32,7 +32,7 @@ func GetPreferences(c *middleware.Context) { dto := m.PreferencesDTO{ Id: query.Result.Id, UserId: query.Result.UserId, - OrgId: query.Result.OrgId, + OrgId: query.Result.OrgId, Preference: query.Result.Preference, } diff --git a/pkg/models/preferences.go b/pkg/models/preferences.go index f2a26da4ba9..3d6ad44a515 100644 --- a/pkg/models/preferences.go +++ b/pkg/models/preferences.go @@ -2,7 +2,7 @@ package models import ( "errors" - "time" + "time" ) // Typed errors @@ -14,10 +14,10 @@ type Preferences struct { Id int64 OrgId int64 UserId int64 - Version int + Version int Preference map[string]interface{} - Created time.Time - Updated time.Time + Created time.Time + Updated time.Time } // --------------------- @@ -26,7 +26,7 @@ type Preferences struct { type GetPreferencesQuery struct { Id int64 OrgId int64 - UserId int64 + UserId int64 Result *Preferences } @@ -46,6 +46,6 @@ type SavePreferencesCommand struct { type PreferencesDTO struct { Id int64 `json:"Id"` UserId int64 `json:"UserId"` - OrgId int64 `json:"OrgId"` + OrgId int64 `json:"OrgId"` Preference map[string]interface{} `json:"Preference"` } diff --git a/pkg/services/sqlstore/migrations/preferences_mig.go b/pkg/services/sqlstore/migrations/preferences_mig.go index c14e47a8733..46a91307a5d 100644 --- a/pkg/services/sqlstore/migrations/preferences_mig.go +++ b/pkg/services/sqlstore/migrations/preferences_mig.go @@ -10,10 +10,10 @@ func addPreferencesMigrations(mg *Migrator) { {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: "version", Type: DB_Int, Nullable: false}, + {Name: "version", Type: DB_Int, Nullable: false}, {Name: "preference", Type: DB_Text, Nullable: false}, - {Name: "created", Type: DB_DateTime, Nullable: false}, - {Name: "updated", Type: DB_DateTime, Nullable: false}, + {Name: "created", Type: DB_DateTime, Nullable: false}, + {Name: "updated", Type: DB_DateTime, Nullable: false}, }, } diff --git a/pkg/services/sqlstore/preferences.go b/pkg/services/sqlstore/preferences.go index 9d395d95304..ece113cf523 100644 --- a/pkg/services/sqlstore/preferences.go +++ b/pkg/services/sqlstore/preferences.go @@ -3,6 +3,7 @@ package sqlstore import ( "github.com/grafana/grafana/pkg/bus" m "github.com/grafana/grafana/pkg/models" + "time" ) func init() { @@ -54,10 +55,12 @@ func SavePreferences(cmd *m.SavePreferencesCommand) error { savePref.UserId = cmd.UserId savePref.OrgId = cmd.OrgId savePref.Preference = cmd.Preference + savePref = SetPreferencesModel(savePref, false) affectedRows, saveErr = sess.Insert(&savePref) } else { savePref = prefResults[0] savePref.Preference = cmd.Preference + savePref = SetPreferencesModel(savePref, true) affectedRows, saveErr = sess.Id(savePref.Id).Update(&savePref) } @@ -68,3 +71,16 @@ func SavePreferences(cmd *m.SavePreferencesCommand) error { 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 +}