From 1a89d97fedfe8e9502176954ae31d2515057e8bb Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Tue, 2 Nov 2021 13:41:45 +0100 Subject: [PATCH] Chore: Propagate context for preferences (#41167) Ref #36734 --- pkg/api/api.go | 8 ++--- pkg/api/preferences.go | 29 +++++++++--------- pkg/api/team.go | 4 +-- pkg/services/sqlstore/preferences.go | 34 +++++++++++---------- pkg/services/sqlstore/preferences_test.go | 36 +++++++++++------------ pkg/services/sqlstore/user_test.go | 8 ++--- 6 files changed, 61 insertions(+), 58 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index 774c92b899d..64623b7f446 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -158,8 +158,8 @@ func (hs *HTTPServer) registerRoutes() { // For dev purpose userRoute.Get("/helpflags/clear", routing.Wrap(ClearHelpFlags)) - userRoute.Get("/preferences", routing.Wrap(GetUserPreferences)) - userRoute.Put("/preferences", bind(dtos.UpdatePrefsCmd{}), routing.Wrap(UpdateUserPreferences)) + userRoute.Get("/preferences", routing.Wrap(hs.GetUserPreferences)) + userRoute.Put("/preferences", bind(dtos.UpdatePrefsCmd{}), routing.Wrap(hs.UpdateUserPreferences)) userRoute.Get("/auth-tokens", routing.Wrap(hs.GetUserAuthTokens)) 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)) // prefs - orgRoute.Get("/preferences", authorize(reqOrgAdmin, ac.EvalPermission(ActionOrgsPreferencesRead, ScopeOrgCurrentID)), routing.Wrap(GetOrgPreferences)) - orgRoute.Put("/preferences", authorize(reqOrgAdmin, ac.EvalPermission(ActionOrgsPreferencesWrite, ScopeOrgCurrentID)), bind(dtos.UpdatePrefsCmd{}), routing.Wrap(UpdateOrgPreferences)) + 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(hs.UpdateOrgPreferences)) }) // current org without requirement of user to be org admin diff --git a/pkg/api/preferences.go b/pkg/api/preferences.go index 6c9cc5b1c10..bbea5f3ed89 100644 --- a/pkg/api/preferences.go +++ b/pkg/api/preferences.go @@ -1,11 +1,12 @@ package api import ( + "context" + "github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/api/response" "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/models" - "github.com/grafana/grafana/pkg/services/sqlstore" ) const ( @@ -19,7 +20,7 @@ func SetHomeDashboard(c *models.ReqContext, cmd models.SavePreferencesCommand) r cmd.UserId = c.UserId 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) } @@ -27,14 +28,14 @@ func SetHomeDashboard(c *models.ReqContext, cmd models.SavePreferencesCommand) r } // GET /api/user/preferences -func GetUserPreferences(c *models.ReqContext) response.Response { - return getPreferencesFor(c.OrgId, c.UserId, 0) +func (hs *HTTPServer) GetUserPreferences(c *models.ReqContext) response.Response { + 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} - 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) } @@ -49,11 +50,11 @@ func getPreferencesFor(orgID, userID, teamID int64) response.Response { } // PUT /api/user/preferences -func UpdateUserPreferences(c *models.ReqContext, dtoCmd dtos.UpdatePrefsCmd) response.Response { - return updatePreferencesFor(c.OrgId, c.UserId, 0, &dtoCmd) +func (hs *HTTPServer) UpdateUserPreferences(c *models.ReqContext, dtoCmd dtos.UpdatePrefsCmd) response.Response { + 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 { return response.Error(400, "Invalid theme", nil) } @@ -67,7 +68,7 @@ func updatePreferencesFor(orgID, userID, teamId int64, dtoCmd *dtos.UpdatePrefsC 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) } @@ -75,11 +76,11 @@ func updatePreferencesFor(orgID, userID, teamId int64, dtoCmd *dtos.UpdatePrefsC } // GET /api/org/preferences -func GetOrgPreferences(c *models.ReqContext) response.Response { - return getPreferencesFor(c.OrgId, 0, 0) +func (hs *HTTPServer) GetOrgPreferences(c *models.ReqContext) response.Response { + return hs.getPreferencesFor(c.Req.Context(), c.OrgId, 0, 0) } // PUT /api/org/preferences -func UpdateOrgPreferences(c *models.ReqContext, dtoCmd dtos.UpdatePrefsCmd) response.Response { - return updatePreferencesFor(c.OrgId, 0, 0, &dtoCmd) +func (hs *HTTPServer) UpdateOrgPreferences(c *models.ReqContext, dtoCmd dtos.UpdatePrefsCmd) response.Response { + return hs.updatePreferencesFor(c.Req.Context(), c.OrgId, 0, 0, &dtoCmd) } diff --git a/pkg/api/team.go b/pkg/api/team.go index eeeeeeded31..4eb4e18d10c 100644 --- a/pkg/api/team.go +++ b/pkg/api/team.go @@ -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 getPreferencesFor(orgId, 0, teamId) + return hs.getPreferencesFor(c.Req.Context(), orgId, 0, teamId) } // 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 updatePreferencesFor(orgId, 0, teamId, &dtoCmd) + return hs.updatePreferencesFor(c.Req.Context(), orgId, 0, teamId, &dtoCmd) } // createTeam creates a team. diff --git a/pkg/services/sqlstore/preferences.go b/pkg/services/sqlstore/preferences.go index 68b45ef8293..f0d549a3407 100644 --- a/pkg/services/sqlstore/preferences.go +++ b/pkg/services/sqlstore/preferences.go @@ -10,9 +10,9 @@ import ( ) func (ss *SQLStore) addPreferencesQueryAndCommandHandlers() { - bus.AddHandler("sql", GetPreferences) + bus.AddHandlerCtx("sql", ss.GetPreferences) 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 { @@ -68,25 +68,27 @@ func (ss *SQLStore) GetPreferencesWithDefaults(ctx context.Context, query *model }) } -func GetPreferences(query *models.GetPreferencesQuery) error { - var prefs models.Preferences - exists, err := x.Where("org_id=? AND user_id=? AND team_id=?", query.OrgId, query.UserId, query.TeamId).Get(&prefs) +func (ss *SQLStore) GetPreferences(ctx context.Context, query *models.GetPreferencesQuery) error { + return ss.WithDbSession(ctx, func(sess *DBSession) error { + 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 { - return err - } + if err != nil { + return err + } - if exists { - query.Result = &prefs - } else { - query.Result = new(models.Preferences) - } + if exists { + query.Result = &prefs + } else { + query.Result = new(models.Preferences) + } - return nil + return nil + }) } -func SavePreferences(cmd *models.SavePreferencesCommand) error { - return inTransaction(func(sess *DBSession) error { +func (ss *SQLStore) SavePreferences(ctx context.Context, cmd *models.SavePreferencesCommand) error { + return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error { var prefs models.Preferences exists, err := sess.Where("org_id=? AND user_id=? AND team_id=?", cmd.OrgId, cmd.UserId, cmd.TeamId).Get(&prefs) if err != nil { diff --git a/pkg/services/sqlstore/preferences_test.go b/pkg/services/sqlstore/preferences_test.go index aa4e0e1b26e..cacfec0f915 100644 --- a/pkg/services/sqlstore/preferences_test.go +++ b/pkg/services/sqlstore/preferences_test.go @@ -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) { - err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) + err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) 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) 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) { - err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) + err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) 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) 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) { - err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) + err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) 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) - 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) 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) { - err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) + err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) 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) - 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) 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) { - err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) + err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) 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) - 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) - 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) 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) { - err := SavePreferences(&models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) + err := ss.SavePreferences(context.Background(), &models.SavePreferencesCommand{OrgId: 1, HomeDashboardId: 1}) 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) - 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) - 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) query := &models.GetPreferencesWithDefaultsQuery{ diff --git a/pkg/services/sqlstore/user_test.go b/pkg/services/sqlstore/user_test.go index cf75547de1d..888b659208d 100644 --- a/pkg/services/sqlstore/user_test.go +++ b/pkg/services/sqlstore/user_test.go @@ -245,7 +245,7 @@ func TestUserDataAccess(t *testing.T) { }) 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", }) require.Nil(t, err) @@ -267,7 +267,7 @@ func TestUserDataAccess(t *testing.T) { require.Len(t, permQuery.Result, 0) 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.EqualValues(t, prefsQuery.Result.OrgId, 0) @@ -296,7 +296,7 @@ func TestUserDataAccess(t *testing.T) { }) 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", }) require.Nil(t, err) @@ -353,7 +353,7 @@ func TestUserDataAccess(t *testing.T) { require.Len(t, permQuery.Result, 0) 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.EqualValues(t, prefsQuery.Result.OrgId, 0)