diff --git a/pkg/services/org/model.go b/pkg/services/org/model.go index 74a3fa4ae70..c0fe76defe3 100644 --- a/pkg/services/org/model.go +++ b/pkg/services/org/model.go @@ -6,6 +6,7 @@ import ( "time" "github.com/grafana/grafana/pkg/models/roletype" + "github.com/grafana/grafana/pkg/services/user" ) // Typed errors @@ -156,6 +157,33 @@ type RemoveOrgUserCommand struct { UserWasDeleted bool } +type GetOrgUsersQuery struct { + UserID int64 + OrgID int64 + Query string + Limit int + // Flag used to allow oss edition to query users without access control + DontEnforceAccessControl bool + + User *user.SignedInUser +} + +type SearchOrgUsersQuery struct { + OrgID int64 + Query string + Page int + Limit int + + User *user.SignedInUser +} + +type SearchOrgUsersQueryResult struct { + TotalCount int64 `json:"totalCount"` + OrgUsers []*OrgUserDTO `json:"OrgUsers"` + Page int `json:"page"` + PerPage int `json:"perPage"` +} + type ByOrgName []*UserOrgDTO // Len returns the length of an array of organisations. diff --git a/pkg/services/org/org.go b/pkg/services/org/org.go index 773fb5b8711..e2cdadb4dd3 100644 --- a/pkg/services/org/org.go +++ b/pkg/services/org/org.go @@ -21,4 +21,6 @@ type Service interface { AddOrgUser(context.Context, *AddOrgUserCommand) error UpdateOrgUser(context.Context, *UpdateOrgUserCommand) error RemoveOrgUser(context.Context, *RemoveOrgUserCommand) error + GetOrgUsers(context.Context, *GetOrgUsersQuery) ([]*OrgUserDTO, error) + SearchOrgUsers(context.Context, *SearchOrgUsersQuery) (*SearchOrgUsersQueryResult, error) } diff --git a/pkg/services/org/orgimpl/org.go b/pkg/services/org/orgimpl/org.go index d92af889f83..d8fd8bacc72 100644 --- a/pkg/services/org/orgimpl/org.go +++ b/pkg/services/org/orgimpl/org.go @@ -244,3 +244,80 @@ func (s *Service) RemoveOrgUser(ctx context.Context, cmd *org.RemoveOrgUserComma } return s.sqlStore.RemoveOrgUser(ctx, c) } + +// TODO: remove wrapper around sqlstore +func (s *Service) GetOrgUsers(ctx context.Context, query *org.GetOrgUsersQuery) ([]*org.OrgUserDTO, error) { + q := &models.GetOrgUsersQuery{ + UserID: query.UserID, + OrgId: query.OrgID, + Query: query.Query, + Limit: query.Limit, + DontEnforceAccessControl: query.DontEnforceAccessControl, + User: query.User, + } + err := s.sqlStore.GetOrgUsers(ctx, q) + if err != nil { + return nil, err + } + + result := make([]*org.OrgUserDTO, 0) + for _, user := range q.Result { + result = append(result, &org.OrgUserDTO{ + OrgID: user.OrgId, + UserID: user.UserId, + Login: user.Login, + Email: user.Email, + Name: user.Name, + AvatarURL: user.AvatarUrl, + Role: user.Role, + LastSeenAt: user.LastSeenAt, + LastSeenAtAge: user.LastSeenAtAge, + Updated: user.Updated, + Created: user.Created, + AccessControl: user.AccessControl, + IsDisabled: user.IsDisabled, + }) + } + return result, nil +} + +// TODO: remove wrapper around sqlstore +func (s *Service) SearchOrgUsers(ctx context.Context, query *org.SearchOrgUsersQuery) (*org.SearchOrgUsersQueryResult, error) { + q := &models.SearchOrgUsersQuery{ + OrgID: query.OrgID, + Query: query.Query, + Page: query.Page, + Limit: query.Limit, + User: query.User, + } + err := s.sqlStore.SearchOrgUsers(ctx, q) + if err != nil { + return nil, err + } + + result := &org.SearchOrgUsersQueryResult{ + TotalCount: q.Result.TotalCount, + OrgUsers: make([]*org.OrgUserDTO, 0), + Page: q.Result.Page, + PerPage: q.Result.PerPage, + } + + for _, user := range q.Result.OrgUsers { + result.OrgUsers = append(result.OrgUsers, &org.OrgUserDTO{ + OrgID: user.OrgId, + UserID: user.UserId, + Login: user.Login, + Email: user.Email, + Name: user.Name, + AvatarURL: user.AvatarUrl, + Role: user.Role, + LastSeenAt: user.LastSeenAt, + LastSeenAtAge: user.LastSeenAtAge, + Updated: user.Updated, + Created: user.Created, + AccessControl: user.AccessControl, + IsDisabled: user.IsDisabled, + }) + } + return result, nil +} diff --git a/pkg/services/org/orgtest/fake.go b/pkg/services/org/orgtest/fake.go index e4c86b8b3df..fc35f2fb220 100644 --- a/pkg/services/org/orgtest/fake.go +++ b/pkg/services/org/orgtest/fake.go @@ -3,17 +3,17 @@ package orgtest import ( "context" - "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/services/org" ) type FakeOrgService struct { - ExpectedOrgUserID int64 - ExpectedError error - ExpectedUserOrgDTO []*org.UserOrgDTO - ExpectedOrgs []*org.OrgDTO - ExpectedOrg *org.Org - ExpectedOrgUsers []*org.OrgUserDTO + ExpectedOrgUserID int64 + ExpectedError error + ExpectedUserOrgDTO []*org.UserOrgDTO + ExpectedOrgs []*org.OrgDTO + ExpectedOrg *org.Org + ExpectedOrgUsers []*org.OrgUserDTO + ExpectedSearchOrgUsersResult *org.SearchOrgUsersQueryResult } func NewOrgServiceFake() *FakeOrgService { @@ -84,10 +84,14 @@ func (f *FakeOrgService) UpdateOrgUser(ctx context.Context, cmd *org.UpdateOrgUs return f.ExpectedError } -func (f *FakeOrgService) GetOrgUsers(ctx context.Context, query *models.GetOrgUsersQuery) ([]*org.OrgUserDTO, error) { +func (f *FakeOrgService) GetOrgUsers(ctx context.Context, query *org.GetOrgUsersQuery) ([]*org.OrgUserDTO, error) { return f.ExpectedOrgUsers, f.ExpectedError } func (f *FakeOrgService) RemoveOrgUser(ctx context.Context, cmd *org.RemoveOrgUserCommand) error { return f.ExpectedError } + +func (f *FakeOrgService) SearchOrgUsers(ctx context.Context, query *org.SearchOrgUsersQuery) (*org.SearchOrgUsersQueryResult, error) { + return f.ExpectedSearchOrgUsersResult, f.ExpectedError +}