diff --git a/pkg/api/org_users.go b/pkg/api/org_users.go index a77db3d5fd8..83608604991 100644 --- a/pkg/api/org_users.go +++ b/pkg/api/org_users.go @@ -114,8 +114,8 @@ func (hs *HTTPServer) addOrgUserHelper(c *models.ReqContext, cmd org.AddOrgUserC // 403: forbiddenError // 500: internalServerError func (hs *HTTPServer) GetOrgUsersForCurrentOrg(c *models.ReqContext) response.Response { - result, err := hs.getOrgUsersHelper(c, &models.GetOrgUsersQuery{ - OrgId: c.OrgID, + result, err := hs.getOrgUsersHelper(c, &org.GetOrgUsersQuery{ + OrgID: c.OrgID, Query: c.Query("query"), Limit: c.QueryInt("limit"), User: c.SignedInUser, @@ -143,8 +143,8 @@ func (hs *HTTPServer) GetOrgUsersForCurrentOrg(c *models.ReqContext) response.Re // 500: internalServerError func (hs *HTTPServer) GetOrgUsersForCurrentOrgLookup(c *models.ReqContext) response.Response { - orgUsers, err := hs.getOrgUsersHelper(c, &models.GetOrgUsersQuery{ - OrgId: c.OrgID, + orgUsers, err := hs.getOrgUsersHelper(c, &org.GetOrgUsersQuery{ + OrgID: c.OrgID, Query: c.Query("query"), Limit: c.QueryInt("limit"), User: c.SignedInUser, @@ -159,9 +159,9 @@ func (hs *HTTPServer) GetOrgUsersForCurrentOrgLookup(c *models.ReqContext) respo for _, u := range orgUsers { result = append(result, &dtos.UserLookupDTO{ - UserID: u.UserId, + UserID: u.UserID, Login: u.Login, - AvatarURL: u.AvatarUrl, + AvatarURL: u.AvatarURL, }) } @@ -189,8 +189,8 @@ func (hs *HTTPServer) GetOrgUsers(c *models.ReqContext) response.Response { return response.Error(http.StatusBadRequest, "orgId is invalid", err) } - result, err := hs.getOrgUsersHelper(c, &models.GetOrgUsersQuery{ - OrgId: orgId, + result, err := hs.getOrgUsersHelper(c, &org.GetOrgUsersQuery{ + OrgID: orgId, Query: "", Limit: 0, User: c.SignedInUser, @@ -203,28 +203,29 @@ func (hs *HTTPServer) GetOrgUsers(c *models.ReqContext) response.Response { return response.JSON(http.StatusOK, result) } -func (hs *HTTPServer) getOrgUsersHelper(c *models.ReqContext, query *models.GetOrgUsersQuery, signedInUser *user.SignedInUser) ([]*models.OrgUserDTO, error) { - if err := hs.SQLStore.GetOrgUsers(c.Req.Context(), query); err != nil { +func (hs *HTTPServer) getOrgUsersHelper(c *models.ReqContext, query *org.GetOrgUsersQuery, signedInUser *user.SignedInUser) ([]*org.OrgUserDTO, error) { + result, err := hs.orgService.GetOrgUsers(c.Req.Context(), query) + if err != nil { return nil, err } - filteredUsers := make([]*models.OrgUserDTO, 0, len(query.Result)) + filteredUsers := make([]*org.OrgUserDTO, 0, len(result)) userIDs := map[string]bool{} - for _, user := range query.Result { + for _, user := range result { if dtos.IsHiddenUser(user.Login, signedInUser, hs.Cfg) { continue } - user.AvatarUrl = dtos.GetGravatarUrl(user.Email) + user.AvatarURL = dtos.GetGravatarUrl(user.Email) - userIDs[fmt.Sprint(user.UserId)] = true + userIDs[fmt.Sprint(user.UserID)] = true filteredUsers = append(filteredUsers, user) } // Get accesscontrol metadata for users in the target org - accessControlMetadata := hs.getMultiAccessControlMetadata(c, query.OrgId, "users:id:", userIDs) + accessControlMetadata := hs.getMultiAccessControlMetadata(c, query.OrgID, "users:id:", userIDs) if len(accessControlMetadata) > 0 { for i := range filteredUsers { - filteredUsers[i].AccessControl = accessControlMetadata[fmt.Sprint(filteredUsers[i].UserId)] + filteredUsers[i].AccessControl = accessControlMetadata[fmt.Sprint(filteredUsers[i].UserID)] } } @@ -288,13 +289,13 @@ func (hs *HTTPServer) SearchOrgUsersWithPaging(c *models.ReqContext) response.Re // 403: forbiddenError // 500: internalServerError func (hs *HTTPServer) UpdateOrgUserForCurrentOrg(c *models.ReqContext) response.Response { - cmd := models.UpdateOrgUserCommand{} + cmd := org.UpdateOrgUserCommand{} if err := web.Bind(c.Req, &cmd); err != nil { return response.Error(http.StatusBadRequest, "bad request data", err) } - cmd.OrgId = c.OrgID + cmd.OrgID = c.OrgID var err error - cmd.UserId, err = strconv.ParseInt(web.Params(c.Req)[":userId"], 10, 64) + cmd.UserID, err = strconv.ParseInt(web.Params(c.Req)[":userId"], 10, 64) if err != nil { return response.Error(http.StatusBadRequest, "userId is invalid", err) } @@ -315,30 +316,30 @@ func (hs *HTTPServer) UpdateOrgUserForCurrentOrg(c *models.ReqContext) response. // 403: forbiddenError // 500: internalServerError func (hs *HTTPServer) UpdateOrgUser(c *models.ReqContext) response.Response { - cmd := models.UpdateOrgUserCommand{} + cmd := org.UpdateOrgUserCommand{} var err error if err := web.Bind(c.Req, &cmd); err != nil { return response.Error(http.StatusBadRequest, "bad request data", err) } - cmd.OrgId, err = strconv.ParseInt(web.Params(c.Req)[":orgId"], 10, 64) + cmd.OrgID, err = strconv.ParseInt(web.Params(c.Req)[":orgId"], 10, 64) if err != nil { return response.Error(http.StatusBadRequest, "orgId is invalid", err) } - cmd.UserId, err = strconv.ParseInt(web.Params(c.Req)[":userId"], 10, 64) + cmd.UserID, err = strconv.ParseInt(web.Params(c.Req)[":userId"], 10, 64) if err != nil { return response.Error(http.StatusBadRequest, "userId is invalid", err) } return hs.updateOrgUserHelper(c, cmd) } -func (hs *HTTPServer) updateOrgUserHelper(c *models.ReqContext, cmd models.UpdateOrgUserCommand) response.Response { +func (hs *HTTPServer) updateOrgUserHelper(c *models.ReqContext, cmd org.UpdateOrgUserCommand) response.Response { if !cmd.Role.IsValid() { return response.Error(400, "Invalid role specified", nil) } if !c.OrgRole.Includes(cmd.Role) && !c.IsGrafanaAdmin { return response.Error(http.StatusForbidden, "Cannot assign a role higher than user's role", nil) } - if err := hs.SQLStore.UpdateOrgUser(c.Req.Context(), &cmd); err != nil { + if err := hs.orgService.UpdateOrgUser(c.Req.Context(), &cmd); err != nil { if errors.Is(err, models.ErrLastOrgAdmin) { return response.Error(400, "Cannot change role so that there is no organization admin left", nil) } diff --git a/pkg/api/org_users_test.go b/pkg/api/org_users_test.go index cdfcec8132e..3711d2ea3ea 100644 --- a/pkg/api/org_users_test.go +++ b/pkg/api/org_users_test.go @@ -18,6 +18,8 @@ import ( "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/org" + "github.com/grafana/grafana/pkg/services/org/orgimpl" + "github.com/grafana/grafana/pkg/services/org/orgtest" "github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore/mockstore" "github.com/grafana/grafana/pkg/services/temp_user/tempuserimpl" @@ -46,10 +48,16 @@ func TestOrgUsersAPIEndpoint_userLoggedIn(t *testing.T) { sqlStore := sqlstore.InitTestDB(t) sqlStore.Cfg = settings hs.SQLStore = sqlStore + orgService := orgtest.NewOrgServiceFake() + hs.orgService = orgService mock := mockstore.NewSQLStoreMock() loggedInUserScenario(t, "When calling GET on", "api/org/users", "api/org/users", func(sc *scenarioContext) { setUpGetOrgUsersDB(t, sqlStore) - + orgService.ExpectedOrgUsers = []*org.OrgUserDTO{ + {Login: testUserLogin, Email: "testUser@grafana.com"}, + {Login: "user1", Email: "user1@grafana.com"}, + {Login: "user2", Email: "user2@grafana.com"}, + } sc.handlerFunc = hs.GetOrgUsersForCurrentOrg sc.fakeReqWithParams("GET", sc.url, map[string]string{}).exec() @@ -355,6 +363,7 @@ func TestGetOrgUsersAPIEndpoint_AccessControlMetadata(t *testing.T) { hs.SQLStore, nil, nil, nil, nil, nil, nil, nil, nil, nil, hs.SQLStore.(*sqlstore.SQLStore), ) + hs.orgService = orgimpl.ProvideService(hs.SQLStore, cfg) }) setupOrgUsersDBForAccessControlTests(t, sc.db) setInitCtxSignedInUser(sc.initCtx, tc.user) @@ -459,6 +468,7 @@ func TestGetOrgUsersAPIEndpoint_AccessControl(t *testing.T) { hs.SQLStore, nil, nil, nil, nil, nil, nil, nil, nil, nil, hs.SQLStore.(*sqlstore.SQLStore), ) + hs.orgService = orgimpl.ProvideService(hs.SQLStore, cfg) }) setInitCtxSignedInUser(sc.initCtx, tc.user) setupOrgUsersDBForAccessControlTests(t, sc.db) @@ -809,6 +819,7 @@ func TestPatchOrgUsersAPIEndpoint_AccessControl(t *testing.T) { hs.SQLStore, nil, nil, nil, nil, nil, nil, nil, nil, nil, hs.SQLStore.(*sqlstore.SQLStore), ) + hs.orgService = orgimpl.ProvideService(hs.SQLStore, cfg) }) setupOrgUsersDBForAccessControlTests(t, sc.db) setInitCtxSignedInUser(sc.initCtx, tc.user) diff --git a/pkg/services/login/loginservice/loginservice.go b/pkg/services/login/loginservice/loginservice.go index b720cd02e1e..6744501f118 100644 --- a/pkg/services/login/loginservice/loginservice.go +++ b/pkg/services/login/loginservice/loginservice.go @@ -280,16 +280,16 @@ func (ls *Implementation) syncOrgRoles(ctx context.Context, usr *user.User, extU deleteOrgIds := []int64{} // update existing org roles - for _, org := range orgsQuery.Result { - handledOrgIds[org.OrgId] = true + for _, orga := range orgsQuery.Result { + handledOrgIds[orga.OrgId] = true - extRole := extUser.OrgRoles[org.OrgId] + extRole := extUser.OrgRoles[orga.OrgId] if extRole == "" { - deleteOrgIds = append(deleteOrgIds, org.OrgId) - } else if extRole != org.Role { + deleteOrgIds = append(deleteOrgIds, orga.OrgId) + } else if extRole != orga.Role { // update role - cmd := &models.UpdateOrgUserCommand{OrgId: org.OrgId, UserId: usr.ID, Role: extRole} - if err := ls.SQLStore.UpdateOrgUser(ctx, cmd); err != nil { + cmd := &org.UpdateOrgUserCommand{OrgID: orga.OrgId, UserID: usr.ID, Role: extRole} + if err := ls.orgService.UpdateOrgUser(ctx, cmd); err != nil { return err } }