From e3501dfa4de7c7bce54ad8f9a6ea90282b7e9a62 Mon Sep 17 00:00:00 2001 From: idafurjes <36131195+idafurjes@users.noreply.github.com> Date: Tue, 16 Aug 2022 17:50:45 +0200 Subject: [PATCH] Chore: Add Get User Profile to user and Get User Org List to org service (#53788) * Remove delete suer from store interface * Remove get signed in user with cache ctx from store interface * Support options when setting up access control tests * Fix broken tests * Fix lint * Add user fake to middleware * Fix middleware tests, remove usertest being initialised twice * Chore: Add Get User Profile to user and Get User Org List to org service Co-authored-by: Karl Persson --- pkg/services/org/model.go | 10 ++++++++++ pkg/services/org/org.go | 1 + pkg/services/org/orgimpl/org.go | 24 ++++++++++++++++++++++++ pkg/services/org/orgtest/fake.go | 9 +++++++-- pkg/services/user/model.go | 21 +++++++++++++++++++++ pkg/services/user/user.go | 1 + pkg/services/user/userimpl/user.go | 28 ++++++++++++++++++++++++++++ pkg/services/user/usertest/fake.go | 5 +++++ 8 files changed, 97 insertions(+), 2 deletions(-) diff --git a/pkg/services/org/model.go b/pkg/services/org/model.go index d6f10ae0b87..5d939b15c45 100644 --- a/pkg/services/org/model.go +++ b/pkg/services/org/model.go @@ -61,6 +61,16 @@ type GetOrgIDForNewUserCommand struct { SkipOrgSetup bool } +type GetUserOrgListQuery struct { + UserID int64 +} + +type UserOrgDTO struct { + OrgID int64 `json:"orgId"` + Name string `json:"name"` + Role RoleType `json:"role"` +} + func (r RoleType) IsValid() bool { return r == RoleViewer || r == RoleAdmin || r == RoleEditor } diff --git a/pkg/services/org/org.go b/pkg/services/org/org.go index 40ee532f7c6..40320cf602b 100644 --- a/pkg/services/org/org.go +++ b/pkg/services/org/org.go @@ -8,4 +8,5 @@ type Service interface { GetIDForNewUser(context.Context, GetOrgIDForNewUserCommand) (int64, error) InsertOrgUser(context.Context, *OrgUser) (int64, error) DeleteUserFromAll(context.Context, int64) error + GetUserOrgList(context.Context, *GetUserOrgListQuery) ([]*UserOrgDTO, error) } diff --git a/pkg/services/org/orgimpl/org.go b/pkg/services/org/orgimpl/org.go index e56260ed403..0effebf8073 100644 --- a/pkg/services/org/orgimpl/org.go +++ b/pkg/services/org/orgimpl/org.go @@ -6,7 +6,9 @@ import ( "time" "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/services/org" + "github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore/db" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" @@ -16,6 +18,8 @@ type Service struct { store store cfg *setting.Cfg log log.Logger + // TODO remove sqlstore + sqlStore *sqlstore.SQLStore } func ProvideService(db db.DB, cfg *setting.Cfg) org.Service { @@ -80,3 +84,23 @@ func (s *Service) InsertOrgUser(ctx context.Context, orguser *org.OrgUser) (int6 func (s *Service) DeleteUserFromAll(ctx context.Context, userID int64) error { return s.store.DeleteUserFromAll(ctx, userID) } + +// TODO: remove wrapper around sqlstore +func (s *Service) GetUserOrgList(ctx context.Context, query *org.GetUserOrgListQuery) ([]*org.UserOrgDTO, error) { + q := &models.GetUserOrgListQuery{ + UserId: query.UserID, + } + err := s.sqlStore.GetUserOrgList(ctx, q) + if err != nil { + return nil, err + } + var result []*org.UserOrgDTO + for _, orga := range q.Result { + result = append(result, &org.UserOrgDTO{ + OrgID: orga.OrgId, + Name: orga.Name, + Role: orga.Role, + }) + } + return result, nil +} diff --git a/pkg/services/org/orgtest/fake.go b/pkg/services/org/orgtest/fake.go index dc51909ff82..3b2bb79a9d0 100644 --- a/pkg/services/org/orgtest/fake.go +++ b/pkg/services/org/orgtest/fake.go @@ -7,8 +7,9 @@ import ( ) type FakeOrgService struct { - ExpectedOrgUserID int64 - ExpectedError error + ExpectedOrgUserID int64 + ExpectedError error + ExpectedUserOrgDTO []*org.UserOrgDTO } func NewOrgServiceFake() *FakeOrgService { @@ -30,3 +31,7 @@ func (f *FakeOrgService) InsertOrgUser(ctx context.Context, cmd *org.OrgUser) (i func (f *FakeOrgService) DeleteUserFromAll(ctx context.Context, userID int64) error { return f.ExpectedError } + +func (f *FakeOrgService) GetUserOrgList(ctx context.Context, query *org.GetUserOrgListQuery) ([]*org.UserOrgDTO, error) { + return f.ExpectedUserOrgDTO, f.ExpectedError +} diff --git a/pkg/services/user/model.go b/pkg/services/user/model.go index 44fa5ae4018..a9aeb4b31f1 100644 --- a/pkg/services/user/model.go +++ b/pkg/services/user/model.go @@ -135,6 +135,27 @@ type UserSearchHitDTO struct { AuthModule AuthModuleConversion `json:"-"` } +type GetUserProfileQuery struct { + UserID int64 +} + +type UserProfileDTO struct { + ID int64 `json:"id"` + Email string `json:"email"` + Name string `json:"name"` + Login string `json:"login"` + Theme string `json:"theme"` + OrgID int64 `json:"orgId,omitempty"` + IsGrafanaAdmin bool `json:"isGrafanaAdmin"` + IsDisabled bool `json:"isDisabled"` + IsExternal bool `json:"isExternal"` + AuthLabels []string `json:"authLabels"` + UpdatedAt time.Time `json:"updatedAt"` + CreatedAt time.Time `json:"createdAt"` + AvatarUrl string `json:"avatarUrl"` + AccessControl map[string]bool `json:"accessControl,omitempty"` +} + // implement Conversion interface to define custom field mapping (xorm feature) type AuthModuleConversion []string diff --git a/pkg/services/user/user.go b/pkg/services/user/user.go index b801caee4dd..7df9b493e67 100644 --- a/pkg/services/user/user.go +++ b/pkg/services/user/user.go @@ -21,4 +21,5 @@ type Service interface { BatchDisableUsers(context.Context, *BatchDisableUsersCommand) error UpdatePermissions(int64, bool) error SetUserHelpFlag(context.Context, *SetUserHelpFlagCommand) error + GetUserProfile(context.Context, *GetUserProfileQuery) (UserProfileDTO, error) } diff --git a/pkg/services/user/userimpl/user.go b/pkg/services/user/userimpl/user.go index 97720a5e950..2c788253a3e 100644 --- a/pkg/services/user/userimpl/user.go +++ b/pkg/services/user/userimpl/user.go @@ -410,3 +410,31 @@ func (s *Service) SetUserHelpFlag(ctx context.Context, cmd *user.SetUserHelpFlag } return s.sqlStore.SetUserHelpFlag(ctx, c) } + +// TODO: remove wrapper around sqlstore +func (s *Service) GetUserProfile(ctx context.Context, query *user.GetUserProfileQuery) (user.UserProfileDTO, error) { + q := &models.GetUserProfileQuery{ + UserId: query.UserID, + } + err := s.sqlStore.GetUserProfile(ctx, q) + if err != nil { + return user.UserProfileDTO{}, err + } + result := user.UserProfileDTO{ + ID: q.Result.Id, + Email: q.Result.Email, + Name: q.Result.Name, + Login: q.Result.Login, + Theme: q.Result.Theme, + OrgID: q.Result.OrgId, + IsGrafanaAdmin: q.Result.IsGrafanaAdmin, + IsDisabled: q.Result.IsDisabled, + IsExternal: q.Result.IsExternal, + AuthLabels: q.Result.AuthLabels, + UpdatedAt: q.Result.UpdatedAt, + CreatedAt: q.Result.CreatedAt, + AvatarUrl: q.Result.AvatarUrl, + AccessControl: q.Result.AccessControl, + } + return result, nil +} diff --git a/pkg/services/user/usertest/fake.go b/pkg/services/user/usertest/fake.go index 744308269a1..0705854a59f 100644 --- a/pkg/services/user/usertest/fake.go +++ b/pkg/services/user/usertest/fake.go @@ -12,6 +12,7 @@ type FakeUserService struct { ExpectedError error ExpectedSetUsingOrgError error ExpectedSearchUsers user.SearchUserQueryResult + ExpectedUSerProfileDTO user.UserProfileDTO } func NewUserServiceFake() *FakeUserService { @@ -84,3 +85,7 @@ func (f *FakeUserService) UpdatePermissions(userID int64, isAdmin bool) error { func (f *FakeUserService) SetUserHelpFlag(ctx context.Context, cmd *user.SetUserHelpFlagCommand) error { return f.ExpectedError } + +func (f *FakeUserService) GetUserProfile(ctx context.Context, query *user.GetUserProfileQuery) (user.UserProfileDTO, error) { + return f.ExpectedUSerProfileDTO, f.ExpectedError +}