From 749fd618a949ff5a49b1fe293710fffcf3213f03 Mon Sep 17 00:00:00 2001 From: utkarshcmu Date: Wed, 16 Mar 2016 23:22:27 -0700 Subject: [PATCH 1/5] Saving home dashboard id in table --- pkg/api/api.go | 7 ++++++- pkg/api/preferences.go | 18 ++++++++++++++++-- pkg/models/preferences.go | 6 +++--- pkg/services/sqlstore/preferences.go | 5 +++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index 45ef5e9030d..e360a43f78b 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -160,7 +160,12 @@ func Register(r *macaron.Macaron) { r.Delete("/:id", wrap(DeleteApiKey)) }, reqOrgAdmin) - r.Combo("/preferences").Get(GetPreferences).Put(bind(m.SavePreferencesCommand{}), wrap(SavePreferences)) + // Preferences + r.Group("/preferences", func() { + r.Get("/", wrap(GetPreferences)) + r.Put("/", bind(m.SavePreferencesCommand{}), wrap(SavePreferences)) + r.Post("/set-home-dash", bind(m.SavePreferencesCommand{}), wrap(SetHomeDashboard)) + }) // Data sources r.Group("/datasources", func() { diff --git a/pkg/api/preferences.go b/pkg/api/preferences.go index 7738d1f987a..a3d398dd556 100644 --- a/pkg/api/preferences.go +++ b/pkg/api/preferences.go @@ -7,7 +7,7 @@ import ( m "github.com/grafana/grafana/pkg/models" ) -// PUT /api/user/prefs +// PUT /api/preferences func SavePreferences(c *middleware.Context, cmd m.SavePreferencesCommand) Response { cmd.UserId = c.UserId @@ -21,7 +21,7 @@ func SavePreferences(c *middleware.Context, cmd m.SavePreferencesCommand) Respon } -// GET /api/user/prefs +// GET /api/preferences func GetPreferences(c *middleware.Context) { query := m.GetPreferencesQuery{UserId: c.UserId, OrgId: c.OrgId} @@ -38,3 +38,17 @@ func GetPreferences(c *middleware.Context) { c.JSON(200, dto) } + +// POST /api/preferences/set-home-dash +func SetHomeDashboard(c *middleware.Context, cmd m.SavePreferencesCommand) Response { + + cmd.UserId = c.UserId + cmd.OrgId = c.OrgId + + if err := bus.Dispatch(&cmd); err != nil { + return ApiError(500, "Failed to set home dashboard", err) + } + + return ApiSuccess("Home dashboard set") + +} diff --git a/pkg/models/preferences.go b/pkg/models/preferences.go index 5163835daf0..ac3dcf1481d 100644 --- a/pkg/models/preferences.go +++ b/pkg/models/preferences.go @@ -39,7 +39,7 @@ type SavePreferencesCommand struct { UserId int64 OrgId int64 - HomeDashboardId int64 - Timezone string - Theme string + HomeDashboardId int64 `json:"dashboardId"` + Timezone string `json:"timezone"` + Theme string `json:"theme"` } diff --git a/pkg/services/sqlstore/preferences.go b/pkg/services/sqlstore/preferences.go index dfe960d1f39..f744b2eb50f 100644 --- a/pkg/services/sqlstore/preferences.go +++ b/pkg/services/sqlstore/preferences.go @@ -1,6 +1,7 @@ package sqlstore import ( + "time" "github.com/grafana/grafana/pkg/bus" m "github.com/grafana/grafana/pkg/models" ) @@ -41,6 +42,8 @@ func SavePreferences(cmd *m.SavePreferencesCommand) error { HomeDashboardId: cmd.HomeDashboardId, Timezone: cmd.Timezone, Theme: cmd.Theme, + Created: time.Now(), + Updated: time.Now(), } _, err = sess.Insert(&prefs) return err @@ -48,6 +51,8 @@ func SavePreferences(cmd *m.SavePreferencesCommand) error { prefs.HomeDashboardId = cmd.HomeDashboardId prefs.Timezone = cmd.Timezone prefs.Theme = cmd.Theme + prefs.Updated = time.Now() + prefs.Version += 1 _, err = sess.Id(prefs.Id).Update(&prefs) return err } From 9dd6aefcec34a2fb8770e54c170be7c6f7917a60 Mon Sep 17 00:00:00 2001 From: utkarshcmu Date: Wed, 16 Mar 2016 23:35:06 -0700 Subject: [PATCH 2/5] Minor corrections --- pkg/api/api.go | 12 ++++++------ pkg/api/preferences.go | 12 ++++++------ pkg/models/preferences.go | 6 +++--- pkg/services/sqlstore/preferences.go | 10 +++++----- public/app/features/dashboard/dashnav/dashnav.ts | 2 +- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index e360a43f78b..0abc4bd6026 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -160,12 +160,12 @@ func Register(r *macaron.Macaron) { r.Delete("/:id", wrap(DeleteApiKey)) }, reqOrgAdmin) - // Preferences - r.Group("/preferences", func() { - r.Get("/", wrap(GetPreferences)) - r.Put("/", bind(m.SavePreferencesCommand{}), wrap(SavePreferences)) - r.Post("/set-home-dash", bind(m.SavePreferencesCommand{}), wrap(SetHomeDashboard)) - }) + // Preferences + r.Group("/preferences", func() { + r.Get("/", wrap(GetPreferences)) + r.Put("/", bind(m.SavePreferencesCommand{}), wrap(SavePreferences)) + r.Post("/set-home-dash", bind(m.SavePreferencesCommand{}), wrap(SetHomeDashboard)) + }) // Data sources r.Group("/datasources", func() { diff --git a/pkg/api/preferences.go b/pkg/api/preferences.go index a3d398dd556..74419492d09 100644 --- a/pkg/api/preferences.go +++ b/pkg/api/preferences.go @@ -42,13 +42,13 @@ func GetPreferences(c *middleware.Context) { // POST /api/preferences/set-home-dash func SetHomeDashboard(c *middleware.Context, cmd m.SavePreferencesCommand) Response { - cmd.UserId = c.UserId - cmd.OrgId = c.OrgId + cmd.UserId = c.UserId + cmd.OrgId = c.OrgId - if err := bus.Dispatch(&cmd); err != nil { - return ApiError(500, "Failed to set home dashboard", err) - } + if err := bus.Dispatch(&cmd); err != nil { + return ApiError(500, "Failed to set home dashboard", err) + } - return ApiSuccess("Home dashboard set") + return ApiSuccess("Home dashboard set") } diff --git a/pkg/models/preferences.go b/pkg/models/preferences.go index ac3dcf1481d..523a3bfc83f 100644 --- a/pkg/models/preferences.go +++ b/pkg/models/preferences.go @@ -39,7 +39,7 @@ type SavePreferencesCommand struct { UserId int64 OrgId int64 - HomeDashboardId int64 `json:"dashboardId"` - Timezone string `json:"timezone"` - Theme string `json:"theme"` + HomeDashboardId int64 `json:"homeDashboardId"` + Timezone string `json:"timezone"` + Theme string `json:"theme"` } diff --git a/pkg/services/sqlstore/preferences.go b/pkg/services/sqlstore/preferences.go index f744b2eb50f..8882495329f 100644 --- a/pkg/services/sqlstore/preferences.go +++ b/pkg/services/sqlstore/preferences.go @@ -1,9 +1,9 @@ package sqlstore import ( - "time" "github.com/grafana/grafana/pkg/bus" m "github.com/grafana/grafana/pkg/models" + "time" ) func init() { @@ -42,8 +42,8 @@ func SavePreferences(cmd *m.SavePreferencesCommand) error { HomeDashboardId: cmd.HomeDashboardId, Timezone: cmd.Timezone, Theme: cmd.Theme, - Created: time.Now(), - Updated: time.Now(), + Created: time.Now(), + Updated: time.Now(), } _, err = sess.Insert(&prefs) return err @@ -51,8 +51,8 @@ func SavePreferences(cmd *m.SavePreferencesCommand) error { prefs.HomeDashboardId = cmd.HomeDashboardId prefs.Timezone = cmd.Timezone prefs.Theme = cmd.Theme - prefs.Updated = time.Now() - prefs.Version += 1 + prefs.Updated = time.Now() + prefs.Version += 1 _, err = sess.Id(prefs.Id).Update(&prefs) return err } diff --git a/public/app/features/dashboard/dashnav/dashnav.ts b/public/app/features/dashboard/dashnav/dashnav.ts index c6faaf9a738..14dfa8cc67a 100644 --- a/public/app/features/dashboard/dashnav/dashnav.ts +++ b/public/app/features/dashboard/dashnav/dashnav.ts @@ -106,7 +106,7 @@ export class DashNavCtrl { $scope.saveDashboardAsHome = function() { // TODO: this backend method needs to be implemented backendSrv.post('/api/preferences/set-home-dash', { - dashboardId: $scope.dashboard.id + homeDashboardId: $scope.dashboard.id }); }; From 66621d762e84c20e3835ba7386d9e5aeb5ff64d3 Mon Sep 17 00:00:00 2001 From: utkarshcmu Date: Thu, 17 Mar 2016 01:01:58 -0700 Subject: [PATCH 3/5] Added getDashboardSlugById api --- pkg/api/api.go | 1 + pkg/api/dashboard.go | 14 ++++++++++++++ pkg/api/dtos/models.go | 4 ++++ pkg/models/dashboards.go | 5 +++++ pkg/services/sqlstore/dashboard.go | 15 +++++++++++++++ 5 files changed, 39 insertions(+) diff --git a/pkg/api/api.go b/pkg/api/api.go index 0abc4bd6026..a30c88eb58d 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -200,6 +200,7 @@ func Register(r *macaron.Macaron) { r.Get("/home", GetHomeDashboard) r.Get("/tags", GetDashboardTags) r.Post("/import", bind(dtos.ImportDashboardCommand{}), wrap(ImportDashboard)) + r.Get("/id/:id", GetDashboardSlugById) }) // Dashboard snapshots diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index 22f9e1e22a1..d6c0fa0a827 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -204,3 +204,17 @@ func GetDashboardTags(c *middleware.Context) { c.JSON(200, query.Result) } + +func GetDashboardSlugById(c *middleware.Context) { + dashId := c.ParamsInt64(":id") + query := m.GetDashboardSlugByIdQuery{Id: dashId} + err := bus.Dispatch(&query) + if err != nil { + c.JsonApiErr(500, "Failed to get slug from database", err) + return + } + + slug := dtos.DashboardSlug{Slug: query.Result} + + c.JSON(200, &slug) +} diff --git a/pkg/api/dtos/models.go b/pkg/api/dtos/models.go index 26295dd3d3c..9fb48e059b4 100644 --- a/pkg/api/dtos/models.go +++ b/pkg/api/dtos/models.go @@ -57,6 +57,10 @@ type DashboardFullWithMeta struct { Dashboard *simplejson.Json `json:"dashboard"` } +type DashboardSlug struct { + Slug string `json:"slug"` +} + type DataSource struct { Id int64 `json:"id"` OrgId int64 `json:"orgId"` diff --git a/pkg/models/dashboards.go b/pkg/models/dashboards.go index 6243c729624..6b19224f934 100644 --- a/pkg/models/dashboards.go +++ b/pkg/models/dashboards.go @@ -148,3 +148,8 @@ type GetDashboardsQuery struct { DashboardIds []int64 Result *[]Dashboard } + +type GetDashboardSlugByIdQuery struct { + Id int64 + Result string +} diff --git a/pkg/services/sqlstore/dashboard.go b/pkg/services/sqlstore/dashboard.go index 396d507cfd2..2e8fd748154 100644 --- a/pkg/services/sqlstore/dashboard.go +++ b/pkg/services/sqlstore/dashboard.go @@ -18,6 +18,7 @@ func init() { bus.AddHandler("sql", DeleteDashboard) bus.AddHandler("sql", SearchDashboards) bus.AddHandler("sql", GetDashboardTags) + bus.AddHandler("sql", GetDashboardSlugById) } func SaveDashboard(cmd *m.SaveDashboardCommand) error { @@ -255,3 +256,17 @@ func GetDashboards(query *m.GetDashboardsQuery) error { return nil } + +func GetDashboardSlugById(query *m.GetDashboardSlugByIdQuery) error { + dashboard := m.Dashboard{Id: query.Id} + has, err := x.Get(&dashboard) + query.Result = dashboard.Slug + + if err != nil { + return err + } else if has == false { + return m.ErrDashboardNotFound + } + + return nil +} From 4fbe954a7996e65d2a96309fda846138489f1662 Mon Sep 17 00:00:00 2001 From: utkarshcmu Date: Thu, 17 Mar 2016 01:38:18 -0700 Subject: [PATCH 4/5] Home dashboard per user per org works --- pkg/api/api.go | 2 +- public/app/core/routes/dashboard_loaders.js | 22 +++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index a30c88eb58d..d06e3a5fac4 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -162,7 +162,7 @@ func Register(r *macaron.Macaron) { // Preferences r.Group("/preferences", func() { - r.Get("/", wrap(GetPreferences)) + r.Get("/", GetPreferences) r.Put("/", bind(m.SavePreferencesCommand{}), wrap(SavePreferences)) r.Post("/set-home-dash", bind(m.SavePreferencesCommand{}), wrap(SetHomeDashboard)) }) diff --git a/public/app/core/routes/dashboard_loaders.js b/public/app/core/routes/dashboard_loaders.js index 8e2157ad84b..c24ed1ea7a2 100644 --- a/public/app/core/routes/dashboard_loaders.js +++ b/public/app/core/routes/dashboard_loaders.js @@ -7,11 +7,25 @@ function (coreModule) { coreModule.default.controller('LoadDashboardCtrl', function($scope, $routeParams, dashboardLoaderSrv, backendSrv) { if (!$routeParams.slug) { - backendSrv.get('/api/dashboards/home').then(function(result) { - var meta = result.meta; - meta.canSave = meta.canShare = meta.canStar = false; - $scope.initDashboard(result, $scope); + + backendSrv.get('/api/preferences').then(function(preferences) { + if (preferences !== null && preferences.homeDashboardId !== 0) { + backendSrv.get('/api/dashboards/id/' + preferences.homeDashboardId).then(function(dashSlug) { + $routeParams.type = 'db'; + $routeParams.slug = dashSlug.slug; + dashboardLoaderSrv.loadDashboard($routeParams.type, $routeParams.slug).then(function(result) { + $scope.initDashboard(result, $scope); + }); + }); + } else { + backendSrv.get('/api/dashboards/home').then(function(result) { + var meta = result.meta; + meta.canSave = meta.canShare = meta.canStar = false; + $scope.initDashboard(result, $scope); + }); + } }); + return; } From cb42cfc6af43b9ec9a0b2f0416d65fc78f8ce2ed Mon Sep 17 00:00:00 2001 From: utkarshcmu Date: Thu, 17 Mar 2016 02:29:34 -0700 Subject: [PATCH 5/5] Removed unwanted api, moved logic into backend --- pkg/api/api.go | 1 - pkg/api/dashboard.go | 36 +++++++++++++-------- public/app/core/routes/dashboard_loaders.js | 22 +++++-------- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index d06e3a5fac4..0f94e3f7f57 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -200,7 +200,6 @@ func Register(r *macaron.Macaron) { r.Get("/home", GetHomeDashboard) r.Get("/tags", GetDashboardTags) r.Post("/import", bind(dtos.ImportDashboardCommand{}), wrap(ImportDashboard)) - r.Get("/id/:id", GetDashboardSlugById) }) // Dashboard snapshots diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index d6c0fa0a827..1ea22984521 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -159,6 +159,28 @@ func canEditDashboard(role m.RoleType) bool { } func GetHomeDashboard(c *middleware.Context) { + + // Checking if there is any preference set for home dashboard + query := m.GetPreferencesQuery{UserId: c.UserId, OrgId: c.OrgId} + + if err := bus.Dispatch(&query); err != nil { + c.JsonApiErr(500, "Failed to get preferences", err) + } + + if query.Result.HomeDashboardId != 0 { + query := m.GetDashboardSlugByIdQuery{Id: query.Result.HomeDashboardId} + err := bus.Dispatch(&query) + if err != nil { + c.JsonApiErr(500, "Failed to get slug from database", err) + return + } + + slug := dtos.DashboardSlug{Slug: query.Result} + + c.JSON(200, &slug) + return + } + filePath := path.Join(setting.StaticRootPath, "dashboards/home.json") file, err := os.Open(filePath) if err != nil { @@ -204,17 +226,3 @@ func GetDashboardTags(c *middleware.Context) { c.JSON(200, query.Result) } - -func GetDashboardSlugById(c *middleware.Context) { - dashId := c.ParamsInt64(":id") - query := m.GetDashboardSlugByIdQuery{Id: dashId} - err := bus.Dispatch(&query) - if err != nil { - c.JsonApiErr(500, "Failed to get slug from database", err) - return - } - - slug := dtos.DashboardSlug{Slug: query.Result} - - c.JSON(200, &slug) -} diff --git a/public/app/core/routes/dashboard_loaders.js b/public/app/core/routes/dashboard_loaders.js index c24ed1ea7a2..9c276a7c3fd 100644 --- a/public/app/core/routes/dashboard_loaders.js +++ b/public/app/core/routes/dashboard_loaders.js @@ -7,25 +7,19 @@ function (coreModule) { coreModule.default.controller('LoadDashboardCtrl', function($scope, $routeParams, dashboardLoaderSrv, backendSrv) { if (!$routeParams.slug) { - - backendSrv.get('/api/preferences').then(function(preferences) { - if (preferences !== null && preferences.homeDashboardId !== 0) { - backendSrv.get('/api/dashboards/id/' + preferences.homeDashboardId).then(function(dashSlug) { - $routeParams.type = 'db'; - $routeParams.slug = dashSlug.slug; - dashboardLoaderSrv.loadDashboard($routeParams.type, $routeParams.slug).then(function(result) { - $scope.initDashboard(result, $scope); - }); - }); + backendSrv.get('/api/dashboards/home').then(function(result) { + if (result.slug == null) { + var meta = result.meta; + meta.canSave = meta.canShare = meta.canStar = false; + $scope.initDashboard(result, $scope); } else { - backendSrv.get('/api/dashboards/home').then(function(result) { - var meta = result.meta; - meta.canSave = meta.canShare = meta.canStar = false; + $routeParams.type = 'db'; + $routeParams.slug = result.slug; + dashboardLoaderSrv.loadDashboard($routeParams.type, $routeParams.slug).then(function(result) { $scope.initDashboard(result, $scope); }); } }); - return; }