diff --git a/pkg/api/common_test.go b/pkg/api/common_test.go index 8250c89996a..855fa2ccd15 100644 --- a/pkg/api/common_test.go +++ b/pkg/api/common_test.go @@ -204,7 +204,7 @@ func getContextHandler(t *testing.T, cfg *setting.Cfg) *contexthandler.ContextHa authProxy := authproxy.ProvideAuthProxy(cfg, remoteCacheSvc, loginservice.LoginServiceMock{}, sqlStore) loginService := &logintest.LoginServiceFake{} authenticator := &logintest.AuthenticatorFake{} - ctxHdlr := contexthandler.ProvideService(cfg, userAuthTokenSvc, authJWTSvc, remoteCacheSvc, renderSvc, sqlStore, tracer, authProxy, loginService, nil, authenticator) + ctxHdlr := contexthandler.ProvideService(cfg, userAuthTokenSvc, authJWTSvc, remoteCacheSvc, renderSvc, sqlStore, tracer, authProxy, loginService, nil, authenticator, usertest.NewUserServiceFake()) return ctxHdlr } diff --git a/pkg/middleware/middleware_test.go b/pkg/middleware/middleware_test.go index ea5f8d8d79a..5d4a5c4fb74 100644 --- a/pkg/middleware/middleware_test.go +++ b/pkg/middleware/middleware_test.go @@ -30,6 +30,7 @@ import ( "github.com/grafana/grafana/pkg/services/rendering" "github.com/grafana/grafana/pkg/services/sqlstore/mockstore" "github.com/grafana/grafana/pkg/services/user" + "github.com/grafana/grafana/pkg/services/user/usertest" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/web" @@ -677,7 +678,7 @@ func getContextHandler(t *testing.T, cfg *setting.Cfg, mockSQLStore *mockstore.S tracer := tracing.InitializeTracerForTest() authProxy := authproxy.ProvideAuthProxy(cfg, remoteCacheSvc, loginService, mockSQLStore) authenticator := &logintest.AuthenticatorFake{ExpectedUser: &user.User{}} - return contexthandler.ProvideService(cfg, userAuthTokenSvc, authJWTSvc, remoteCacheSvc, renderSvc, mockSQLStore, tracer, authProxy, loginService, apiKeyService, authenticator) + return contexthandler.ProvideService(cfg, userAuthTokenSvc, authJWTSvc, remoteCacheSvc, renderSvc, mockSQLStore, tracer, authProxy, loginService, apiKeyService, authenticator, usertest.NewUserServiceFake()) } type fakeRenderService struct { diff --git a/pkg/services/contexthandler/auth_proxy_test.go b/pkg/services/contexthandler/auth_proxy_test.go index 117150e13eb..324bc7a42b0 100644 --- a/pkg/services/contexthandler/auth_proxy_test.go +++ b/pkg/services/contexthandler/auth_proxy_test.go @@ -16,6 +16,7 @@ import ( "github.com/grafana/grafana/pkg/services/rendering" "github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/user" + "github.com/grafana/grafana/pkg/services/user/usertest" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/web" "github.com/stretchr/testify/require" @@ -86,7 +87,7 @@ func getContextHandler(t *testing.T) *ContextHandler { authProxy := authproxy.ProvideAuthProxy(cfg, remoteCacheSvc, loginService, &FakeGetSignUserStore{}) authenticator := &fakeAuthenticator{} - return ProvideService(cfg, userAuthTokenSvc, authJWTSvc, remoteCacheSvc, renderSvc, sqlStore, tracer, authProxy, loginService, nil, authenticator) + return ProvideService(cfg, userAuthTokenSvc, authJWTSvc, remoteCacheSvc, renderSvc, sqlStore, tracer, authProxy, loginService, nil, authenticator, &usertest.FakeUserService{}) } type FakeGetSignUserStore struct { diff --git a/pkg/services/contexthandler/contexthandler.go b/pkg/services/contexthandler/contexthandler.go index 0f3d96f5c20..71a99ea83e4 100644 --- a/pkg/services/contexthandler/contexthandler.go +++ b/pkg/services/contexthandler/contexthandler.go @@ -42,7 +42,8 @@ const ServiceName = "ContextHandler" func ProvideService(cfg *setting.Cfg, tokenService models.UserTokenService, jwtService models.JWTService, remoteCache *remotecache.RemoteCache, renderService rendering.Service, sqlStore sqlstore.Store, tracer tracing.Tracer, authProxy *authproxy.AuthProxy, loginService login.Service, - apiKeyService apikey.Service, authenticator loginpkg.Authenticator) *ContextHandler { + apiKeyService apikey.Service, authenticator loginpkg.Authenticator, userService user.Service, +) *ContextHandler { return &ContextHandler{ Cfg: cfg, AuthTokenService: tokenService, @@ -55,6 +56,7 @@ func ProvideService(cfg *setting.Cfg, tokenService models.UserTokenService, jwtS authenticator: authenticator, loginService: loginService, apiKeyService: apiKeyService, + userService: userService, } } @@ -71,6 +73,7 @@ type ContextHandler struct { authenticator loginpkg.Authenticator loginService login.Service apiKeyService apikey.Service + userService user.Service // GetTime returns the current time. // Stubbable by tests. GetTime func() time.Time @@ -160,7 +163,7 @@ func (h *ContextHandler) Middleware(mContext *web.Context) { // update last seen every 5min if reqContext.ShouldUpdateLastSeenAt() { reqContext.Logger.Debug("Updating last user_seen_at", "user_id", reqContext.UserId) - if err := h.SQLStore.UpdateUserLastSeenAt(mContext.Req.Context(), &models.UpdateUserLastSeenAtCommand{UserId: reqContext.UserId}); err != nil { + if err := h.userService.UpdateLastSeenAt(mContext.Req.Context(), &user.UpdateUserLastSeenAtCommand{UserID: reqContext.UserId}); err != nil { reqContext.Logger.Error("Failed to update last_seen_at", "error", err) } } @@ -358,13 +361,13 @@ func (h *ContextHandler) initContextWithBasicAuth(reqContext *models.ReqContext, return true } - user := authQuery.User + usr := authQuery.User - query := models.GetSignedInUserQuery{UserId: user.ID, OrgId: orgID} + query := models.GetSignedInUserQuery{UserId: usr.ID, OrgId: orgID} if err := h.SQLStore.GetSignedInUserWithCacheCtx(ctx, &query); err != nil { reqContext.Logger.Error( "Failed at user signed in", - "id", user.ID, + "id", usr.ID, "org", orgID, ) reqContext.JsonApiErr(401, InvalidUsernamePassword, err) diff --git a/pkg/services/sqlstore/mockstore/mockstore.go b/pkg/services/sqlstore/mockstore/mockstore.go index 5954cf9b3f2..17b5df624ba 100644 --- a/pkg/services/sqlstore/mockstore/mockstore.go +++ b/pkg/services/sqlstore/mockstore/mockstore.go @@ -137,10 +137,6 @@ func (m *SQLStoreMock) CreateUser(ctx context.Context, cmd user.CreateUserComman return nil, m.ExpectedError } -func (m *SQLStoreMock) UpdateUserLastSeenAt(ctx context.Context, cmd *models.UpdateUserLastSeenAtCommand) error { - return m.ExpectedError -} - func (m *SQLStoreMock) SetUsingOrg(ctx context.Context, cmd *models.SetUsingOrgCommand) error { return m.ExpectedSetUsingOrgError } diff --git a/pkg/services/sqlstore/store.go b/pkg/services/sqlstore/store.go index 4710285646f..60aea40e248 100644 --- a/pkg/services/sqlstore/store.go +++ b/pkg/services/sqlstore/store.go @@ -31,7 +31,6 @@ type Store interface { GetUserLoginAttemptCount(ctx context.Context, query *models.GetUserLoginAttemptCountQuery) error DeleteOldLoginAttempts(ctx context.Context, cmd *models.DeleteOldLoginAttemptsCommand) error CreateUser(ctx context.Context, cmd user.CreateUserCommand) (*user.User, error) - UpdateUserLastSeenAt(ctx context.Context, cmd *models.UpdateUserLastSeenAtCommand) error SetUsingOrg(ctx context.Context, cmd *models.SetUsingOrgCommand) error GetUserProfile(ctx context.Context, query *models.GetUserProfileQuery) error GetUserOrgList(ctx context.Context, query *models.GetUserOrgListQuery) error diff --git a/pkg/services/user/model.go b/pkg/services/user/model.go index 4aa4f9cdbb3..1cb3f3755ef 100644 --- a/pkg/services/user/model.go +++ b/pkg/services/user/model.go @@ -82,6 +82,10 @@ type ChangeUserPasswordCommand struct { UserID int64 `json:"-"` } +type UpdateUserLastSeenAtCommand struct { + UserID int64 +} + func (u *User) NameOrFallback() string { if u.Name != "" { return u.Name diff --git a/pkg/services/user/user.go b/pkg/services/user/user.go index a2478db0ad8..80bc56e3223 100644 --- a/pkg/services/user/user.go +++ b/pkg/services/user/user.go @@ -12,4 +12,5 @@ type Service interface { GetByEmail(context.Context, *GetUserByEmailQuery) (*User, error) Update(context.Context, *UpdateUserCommand) error ChangePassword(context.Context, *ChangeUserPasswordCommand) error + UpdateLastSeenAt(context.Context, *UpdateUserLastSeenAtCommand) error } diff --git a/pkg/services/user/userimpl/user.go b/pkg/services/user/userimpl/user.go index 74632a54583..c1d8134a3f8 100644 --- a/pkg/services/user/userimpl/user.go +++ b/pkg/services/user/userimpl/user.go @@ -289,3 +289,11 @@ func (s *Service) ChangePassword(ctx context.Context, cmd *user.ChangeUserPasswo } return s.sqlStore.ChangeUserPassword(ctx, q) } + +// TODO: remove wrapper around sqlstore +func (s *Service) UpdateLastSeenAt(ctx context.Context, cmd *user.UpdateUserLastSeenAtCommand) error { + q := &models.UpdateUserLastSeenAtCommand{ + UserId: cmd.UserID, + } + return s.sqlStore.UpdateUserLastSeenAt(ctx, q) +} diff --git a/pkg/services/user/usertest/fake.go b/pkg/services/user/usertest/fake.go index 6480f77a496..a0f6af5b459 100644 --- a/pkg/services/user/usertest/fake.go +++ b/pkg/services/user/usertest/fake.go @@ -42,3 +42,7 @@ func (f *FakeUserService) Update(ctx context.Context, cmd *user.UpdateUserComman func (f *FakeUserService) ChangePassword(ctx context.Context, cmd *user.ChangeUserPasswordCommand) error { return f.ExpectedError } + +func (f *FakeUserService) UpdateLastSeenAt(ctx context.Context, cmd *user.UpdateUserLastSeenAtCommand) error { + return f.ExpectedError +}