Chore: Propagate context for preferences (#41167)

Ref #36734
This commit is contained in:
Marcus Efraimsson 2021-11-02 13:41:45 +01:00 committed by GitHub
parent ad888813c6
commit 1a89d97fed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 61 additions and 58 deletions

View File

@ -158,8 +158,8 @@ func (hs *HTTPServer) registerRoutes() {
// For dev purpose // For dev purpose
userRoute.Get("/helpflags/clear", routing.Wrap(ClearHelpFlags)) userRoute.Get("/helpflags/clear", routing.Wrap(ClearHelpFlags))
userRoute.Get("/preferences", routing.Wrap(GetUserPreferences)) userRoute.Get("/preferences", routing.Wrap(hs.GetUserPreferences))
userRoute.Put("/preferences", bind(dtos.UpdatePrefsCmd{}), routing.Wrap(UpdateUserPreferences)) userRoute.Put("/preferences", bind(dtos.UpdatePrefsCmd{}), routing.Wrap(hs.UpdateUserPreferences))
userRoute.Get("/auth-tokens", routing.Wrap(hs.GetUserAuthTokens)) userRoute.Get("/auth-tokens", routing.Wrap(hs.GetUserAuthTokens))
userRoute.Post("/revoke-auth-token", bind(models.RevokeAuthTokenCmd{}), routing.Wrap(hs.RevokeUserAuthToken)) userRoute.Post("/revoke-auth-token", bind(models.RevokeAuthTokenCmd{}), routing.Wrap(hs.RevokeUserAuthToken))
@ -221,8 +221,8 @@ func (hs *HTTPServer) registerRoutes() {
orgRoute.Patch("/invites/:code/revoke", authorize(reqOrgAdmin, ac.EvalPermission(ac.ActionUsersCreate)), routing.Wrap(RevokeInvite)) orgRoute.Patch("/invites/:code/revoke", authorize(reqOrgAdmin, ac.EvalPermission(ac.ActionUsersCreate)), routing.Wrap(RevokeInvite))
// prefs // prefs
orgRoute.Get("/preferences", authorize(reqOrgAdmin, ac.EvalPermission(ActionOrgsPreferencesRead, ScopeOrgCurrentID)), routing.Wrap(GetOrgPreferences)) orgRoute.Get("/preferences", authorize(reqOrgAdmin, ac.EvalPermission(ActionOrgsPreferencesRead, ScopeOrgCurrentID)), routing.Wrap(hs.GetOrgPreferences))
orgRoute.Put("/preferences", authorize(reqOrgAdmin, ac.EvalPermission(ActionOrgsPreferencesWrite, ScopeOrgCurrentID)), bind(dtos.UpdatePrefsCmd{}), routing.Wrap(UpdateOrgPreferences)) orgRoute.Put("/preferences", authorize(reqOrgAdmin, ac.EvalPermission(ActionOrgsPreferencesWrite, ScopeOrgCurrentID)), bind(dtos.UpdatePrefsCmd{}), routing.Wrap(hs.UpdateOrgPreferences))
}) })
// current org without requirement of user to be org admin // current org without requirement of user to be org admin

View File

@ -1,11 +1,12 @@
package api package api
import ( import (
"context"
"github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/api/dtos"
"github.com/grafana/grafana/pkg/api/response" "github.com/grafana/grafana/pkg/api/response"
"github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/bus"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/sqlstore"
) )
const ( const (
@ -19,7 +20,7 @@ func SetHomeDashboard(c *models.ReqContext, cmd models.SavePreferencesCommand) r
cmd.UserId = c.UserId cmd.UserId = c.UserId
cmd.OrgId = c.OrgId cmd.OrgId = c.OrgId
if err := bus.Dispatch(&cmd); err != nil { if err := bus.DispatchCtx(c.Req.Context(), &cmd); err != nil {
return response.Error(500, "Failed to set home dashboard", err) return response.Error(500, "Failed to set home dashboard", err)
} }
@ -27,14 +28,14 @@ func SetHomeDashboard(c *models.ReqContext, cmd models.SavePreferencesCommand) r
} }
// GET /api/user/preferences // GET /api/user/preferences
func GetUserPreferences(c *models.ReqContext) response.Response { func (hs *HTTPServer) GetUserPreferences(c *models.ReqContext) response.Response {
return getPreferencesFor(c.OrgId, c.UserId, 0) return hs.getPreferencesFor(c.Req.Context(), c.OrgId, c.UserId, 0)
} }
func getPreferencesFor(orgID, userID, teamID int64) response.Response { func (hs *HTTPServer) getPreferencesFor(ctx context.Context, orgID, userID, teamID int64) response.Response {
prefsQuery := models.GetPreferencesQuery{UserId: userID, OrgId: orgID, TeamId: teamID} prefsQuery := models.GetPreferencesQuery{UserId: userID, OrgId: orgID, TeamId: teamID}
if err := sqlstore.GetPreferences(&prefsQuery); err != nil { if err := hs.SQLStore.GetPreferences(ctx, &prefsQuery); err != nil {
return response.Error(500, "Failed to get preferences", err) return response.Error(500, "Failed to get preferences", err)
} }
@ -49,11 +50,11 @@ func getPreferencesFor(orgID, userID, teamID int64) response.Response {
} }
// PUT /api/user/preferences // PUT /api/user/preferences
func UpdateUserPreferences(c *models.ReqContext, dtoCmd dtos.UpdatePrefsCmd) response.Response { func (hs *HTTPServer) UpdateUserPreferences(c *models.ReqContext, dtoCmd dtos.UpdatePrefsCmd) response.Response {
return updatePreferencesFor(c.OrgId, c.UserId, 0, &dtoCmd) return hs.updatePreferencesFor(c.Req.Context(), c.OrgId, c.UserId, 0, &dtoCmd)
} }
func updatePreferencesFor(orgID, userID, teamId int64, dtoCmd *dtos.UpdatePrefsCmd) response.Response { func (hs *HTTPServer) updatePreferencesFor(ctx context.Context, orgID, userID, teamId int64, dtoCmd *dtos.UpdatePrefsCmd) response.Response {
if dtoCmd.Theme != lightTheme && dtoCmd.Theme != darkTheme && dtoCmd.Theme != defaultTheme { if dtoCmd.Theme != lightTheme && dtoCmd.Theme != darkTheme && dtoCmd.Theme != defaultTheme {
return response.Error(400, "Invalid theme", nil) return response.Error(400, "Invalid theme", nil)
} }
@ -67,7 +68,7 @@ func updatePreferencesFor(orgID, userID, teamId int64, dtoCmd *dtos.UpdatePrefsC
HomeDashboardId: dtoCmd.HomeDashboardID, HomeDashboardId: dtoCmd.HomeDashboardID,
} }
if err := sqlstore.SavePreferences(&saveCmd); err != nil { if err := hs.SQLStore.SavePreferences(ctx, &saveCmd); err != nil {
return response.Error(500, "Failed to save preferences", err) return response.Error(500, "Failed to save preferences", err)
} }
@ -75,11 +76,11 @@ func updatePreferencesFor(orgID, userID, teamId int64, dtoCmd *dtos.UpdatePrefsC
} }
// GET /api/org/preferences // GET /api/org/preferences
func GetOrgPreferences(c *models.ReqContext) response.Response { func (hs *HTTPServer) GetOrgPreferences(c *models.ReqContext) response.Response {
return getPreferencesFor(c.OrgId, 0, 0) return hs.getPreferencesFor(c.Req.Context(), c.OrgId, 0, 0)
} }
// PUT /api/org/preferences // PUT /api/org/preferences
func UpdateOrgPreferences(c *models.ReqContext, dtoCmd dtos.UpdatePrefsCmd) response.Response { func (hs *HTTPServer) UpdateOrgPreferences(c *models.ReqContext, dtoCmd dtos.UpdatePrefsCmd) response.Response {
return updatePreferencesFor(c.OrgId, 0, 0, &dtoCmd) return hs.updatePreferencesFor(c.Req.Context(), c.OrgId, 0, 0, &dtoCmd)
} }

View File

@ -155,7 +155,7 @@ func (hs *HTTPServer) GetTeamPreferences(c *models.ReqContext) response.Response
return response.Error(403, "Not allowed to view team preferences.", err) return response.Error(403, "Not allowed to view team preferences.", err)
} }
return getPreferencesFor(orgId, 0, teamId) return hs.getPreferencesFor(c.Req.Context(), orgId, 0, teamId)
} }
// PUT /api/teams/:teamId/preferences // PUT /api/teams/:teamId/preferences
@ -167,7 +167,7 @@ func (hs *HTTPServer) UpdateTeamPreferences(c *models.ReqContext, dtoCmd dtos.Up
return response.Error(403, "Not allowed to update team preferences.", err) return response.Error(403, "Not allowed to update team preferences.", err)
} }
return updatePreferencesFor(orgId, 0, teamId, &dtoCmd) return hs.updatePreferencesFor(c.Req.Context(), orgId, 0, teamId, &dtoCmd)
} }
// createTeam creates a team. // createTeam creates a team.

View File

@ -10,9 +10,9 @@ import (
) )
func (ss *SQLStore) addPreferencesQueryAndCommandHandlers() { func (ss *SQLStore) addPreferencesQueryAndCommandHandlers() {
bus.AddHandler("sql", GetPreferences) bus.AddHandlerCtx("sql", ss.GetPreferences)
bus.AddHandlerCtx("sql", ss.GetPreferencesWithDefaults) bus.AddHandlerCtx("sql", ss.GetPreferencesWithDefaults)
bus.AddHandler("sql", SavePreferences) bus.AddHandlerCtx("sql", ss.SavePreferences)
} }
func (ss *SQLStore) GetPreferencesWithDefaults(ctx context.Context, query *models.GetPreferencesWithDefaultsQuery) error { func (ss *SQLStore) GetPreferencesWithDefaults(ctx context.Context, query *models.GetPreferencesWithDefaultsQuery) error {
@ -68,25 +68,27 @@ func (ss *SQLStore) GetPreferencesWithDefaults(ctx context.Context, query *model
}) })
} }
func GetPreferences(query *models.GetPreferencesQuery) error { func (ss *SQLStore) GetPreferences(ctx context.Context, query *models.GetPreferencesQuery) error {
var prefs models.Preferences return ss.WithDbSession(ctx, func(sess *DBSession) error {
exists, err := x.Where("org_id=? AND user_id=? AND team_id=?", query.OrgId, query.UserId, query.TeamId).Get(&prefs) var prefs models.Preferences
exists, err := sess.Where("org_id=? AND user_id=? AND team_id=?", query.OrgId, query.UserId, query.TeamId).Get(&prefs)
if err != nil { if err != nil {
return err return err
} }
if exists { if exists {
query.Result = &prefs query.Result = &prefs
} else { } else {
query.Result = new(models.Preferences) query.Result = new(models.Preferences)
} }
return nil return nil
})
} }
func SavePreferences(cmd *models.SavePreferencesCommand) error { func (ss *SQLStore) SavePreferences(ctx context.Context, cmd *models.SavePreferencesCommand) error {
return inTransaction(func(sess *DBSession) error { return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error {
var prefs models.Preferences var prefs models.Preferences
exists, err := sess.Where("org_id=? AND user_id=? AND team_id=?", cmd.OrgId, cmd.UserId, cmd.TeamId).Get(&prefs) exists, err := sess.Where("org_id=? AND user_id=? AND team_id=?", cmd.OrgId, cmd.UserId, cmd.TeamId).Get(&prefs)
if err != nil { if err != nil {

View File

@ -27,9 +27,9 @@ func TestPreferencesDataAccess(t *testing.T) {
}) })
t.Run("GetPreferencesWithDefaults with saved org and user home dashboard should return user home dashboard", func(t *testing.T) { t.Run("GetPreferencesWithDefaults with saved org and user home dashboard should return user home dashboard", func(t *testing.T) {
err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, UserId: 1, HomeDashboardId: 4}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, UserId: 1, HomeDashboardId: 4})
require.NoError(t, err) require.NoError(t, err)
query := &models.GetPreferencesWithDefaultsQuery{User: &models.SignedInUser{OrgId: 1, UserId: 1}} query := &models.GetPreferencesWithDefaultsQuery{User: &models.SignedInUser{OrgId: 1, UserId: 1}}
@ -39,9 +39,9 @@ func TestPreferencesDataAccess(t *testing.T) {
}) })
t.Run("GetPreferencesWithDefaults with saved org and other user home dashboard should return org home dashboard", func(t *testing.T) { t.Run("GetPreferencesWithDefaults with saved org and other user home dashboard should return org home dashboard", func(t *testing.T) {
err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, UserId: 1, HomeDashboardId: 4}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, UserId: 1, HomeDashboardId: 4})
require.NoError(t, err) require.NoError(t, err)
query := &models.GetPreferencesWithDefaultsQuery{User: &models.SignedInUser{OrgId: 1, UserId: 2}} query := &models.GetPreferencesWithDefaultsQuery{User: &models.SignedInUser{OrgId: 1, UserId: 2}}
@ -51,11 +51,11 @@ func TestPreferencesDataAccess(t *testing.T) {
}) })
t.Run("GetPreferencesWithDefaults with saved org and teams home dashboard should return last team home dashboard", func(t *testing.T) { t.Run("GetPreferencesWithDefaults with saved org and teams home dashboard should return last team home dashboard", func(t *testing.T) {
err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, TeamId: 2, HomeDashboardId: 2}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, TeamId: 2, HomeDashboardId: 2})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, TeamId: 3, HomeDashboardId: 3}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, TeamId: 3, HomeDashboardId: 3})
require.NoError(t, err) require.NoError(t, err)
query := &models.GetPreferencesWithDefaultsQuery{ query := &models.GetPreferencesWithDefaultsQuery{
@ -67,11 +67,11 @@ func TestPreferencesDataAccess(t *testing.T) {
}) })
t.Run("GetPreferencesWithDefaults with saved org and other teams home dashboard should return org home dashboard", func(t *testing.T) { t.Run("GetPreferencesWithDefaults with saved org and other teams home dashboard should return org home dashboard", func(t *testing.T) {
err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, TeamId: 2, HomeDashboardId: 2}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, TeamId: 2, HomeDashboardId: 2})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, TeamId: 3, HomeDashboardId: 3}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, TeamId: 3, HomeDashboardId: 3})
require.NoError(t, err) require.NoError(t, err)
query := &models.GetPreferencesWithDefaultsQuery{User: &models.SignedInUser{OrgId: 1}} query := &models.GetPreferencesWithDefaultsQuery{User: &models.SignedInUser{OrgId: 1}}
@ -81,13 +81,13 @@ func TestPreferencesDataAccess(t *testing.T) {
}) })
t.Run("GetPreferencesWithDefaults with saved org, teams and user home dashboard should return user home dashboard", func(t *testing.T) { t.Run("GetPreferencesWithDefaults with saved org, teams and user home dashboard should return user home dashboard", func(t *testing.T) {
err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, TeamId: 2, HomeDashboardId: 2}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, TeamId: 2, HomeDashboardId: 2})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, TeamId: 3, HomeDashboardId: 3}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, TeamId: 3, HomeDashboardId: 3})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, UserId: 1, HomeDashboardId: 4}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, UserId: 1, HomeDashboardId: 4})
require.NoError(t, err) require.NoError(t, err)
query := &models.GetPreferencesWithDefaultsQuery{ query := &models.GetPreferencesWithDefaultsQuery{
@ -99,13 +99,13 @@ func TestPreferencesDataAccess(t *testing.T) {
}) })
t.Run("GetPreferencesWithDefaults with saved org, other teams and user home dashboard should return org home dashboard", func(t *testing.T) { t.Run("GetPreferencesWithDefaults with saved org, other teams and user home dashboard should return org home dashboard", func(t *testing.T) {
err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, TeamId: 2, HomeDashboardId: 2}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, TeamId: 2, HomeDashboardId: 2})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, TeamId: 3, HomeDashboardId: 3}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, TeamId: 3, HomeDashboardId: 3})
require.NoError(t, err) require.NoError(t, err)
err = SavePreferences(&models.SavePreferencesCommand{OrgId: 1, UserId: 1, HomeDashboardId: 4}) err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, UserId: 1, HomeDashboardId: 4})
require.NoError(t, err) require.NoError(t, err)
query := &models.GetPreferencesWithDefaultsQuery{ query := &models.GetPreferencesWithDefaultsQuery{

View File

@ -245,7 +245,7 @@ func TestUserDataAccess(t *testing.T) {
}) })
require.Nil(t, err) require.Nil(t, err)
err = SavePreferences(&models.SavePreferencesCommand{ err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{
UserId: users[1].Id, OrgId: users[0].OrgId, HomeDashboardId: 1, Theme: "dark", UserId: users[1].Id, OrgId: users[0].OrgId, HomeDashboardId: 1, Theme: "dark",
}) })
require.Nil(t, err) require.Nil(t, err)
@ -267,7 +267,7 @@ func TestUserDataAccess(t *testing.T) {
require.Len(t, permQuery.Result, 0) require.Len(t, permQuery.Result, 0)
prefsQuery := &models.GetPreferencesQuery{OrgId: users[0].OrgId, UserId: users[1].Id} prefsQuery := &models.GetPreferencesQuery{OrgId: users[0].OrgId, UserId: users[1].Id}
err = GetPreferences(prefsQuery) err = ss.GetPreferences(context.Background(), prefsQuery)
require.Nil(t, err) require.Nil(t, err)
require.EqualValues(t, prefsQuery.Result.OrgId, 0) require.EqualValues(t, prefsQuery.Result.OrgId, 0)
@ -296,7 +296,7 @@ func TestUserDataAccess(t *testing.T) {
}) })
require.Nil(t, err) require.Nil(t, err)
err = SavePreferences(&models.SavePreferencesCommand{ err = ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{
UserId: users[1].Id, OrgId: users[0].OrgId, HomeDashboardId: 1, Theme: "dark", UserId: users[1].Id, OrgId: users[0].OrgId, HomeDashboardId: 1, Theme: "dark",
}) })
require.Nil(t, err) require.Nil(t, err)
@ -353,7 +353,7 @@ func TestUserDataAccess(t *testing.T) {
require.Len(t, permQuery.Result, 0) require.Len(t, permQuery.Result, 0)
prefsQuery = &models.GetPreferencesQuery{OrgId: users[0].OrgId, UserId: users[1].Id} prefsQuery = &models.GetPreferencesQuery{OrgId: users[0].OrgId, UserId: users[1].Id}
err = GetPreferences(prefsQuery) err = ss.GetPreferences(context.Background(), prefsQuery)
require.Nil(t, err) require.Nil(t, err)
require.EqualValues(t, prefsQuery.Result.OrgId, 0) require.EqualValues(t, prefsQuery.Result.OrgId, 0)