mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Split Create User (#50502)
* Split Create User * Use new create user and User from package user * Add service to wire * Making create user work * Replace user from user pkg * One more * Move Insert to orguser Service/Store * Remove unnecessary conversion * Cleaunp * Fix Get User and add fakes * Fixing get org id for user logic, adding fakes and other adjustments * Add some tests for ourguser service and store * Fix insert org logic * Add comment about deprecation * Fix after merge with main * Move orguser service/store to org service/store * Remove orguser from wire * Unimplement new Create user and use User from pkg user * Fix wire generation * Fix lint * Fix lint - use only User and CrateUserCommand from user pkg * Remove User and CreateUserCommand from models * Fix lint 2
This commit is contained in:
@@ -15,7 +15,9 @@ import (
|
||||
acmig "github.com/grafana/grafana/pkg/services/sqlstore/migrations/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/sqlutil"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -38,49 +40,49 @@ func (rp *rawPermission) toPermission(roleID int64, ts time.Time) accesscontrol.
|
||||
var (
|
||||
now = time.Now()
|
||||
|
||||
users = []models.User{
|
||||
users = []user.User{
|
||||
{
|
||||
Id: 1,
|
||||
ID: 1,
|
||||
Email: "viewer1@example.org",
|
||||
Name: "viewer1",
|
||||
Login: "viewer1",
|
||||
OrgId: 1,
|
||||
OrgID: 1,
|
||||
Created: now,
|
||||
Updated: now,
|
||||
},
|
||||
{
|
||||
Id: 2,
|
||||
ID: 2,
|
||||
Email: "viewer2@example.org",
|
||||
Name: "viewer2",
|
||||
Login: "viewer2",
|
||||
OrgId: 1,
|
||||
OrgID: 1,
|
||||
Created: now,
|
||||
Updated: now,
|
||||
},
|
||||
{
|
||||
Id: 3,
|
||||
ID: 3,
|
||||
Email: "editor1@example.org",
|
||||
Name: "editor1",
|
||||
Login: "editor1",
|
||||
OrgId: 1,
|
||||
OrgID: 1,
|
||||
Created: now,
|
||||
Updated: now,
|
||||
},
|
||||
{
|
||||
Id: 4,
|
||||
ID: 4,
|
||||
Email: "admin1@example.org",
|
||||
Name: "admin1",
|
||||
Login: "admin1",
|
||||
OrgId: 1,
|
||||
OrgID: 1,
|
||||
Created: now,
|
||||
Updated: now,
|
||||
},
|
||||
{
|
||||
Id: 5,
|
||||
ID: 5,
|
||||
Email: "editor2@example.org",
|
||||
Name: "editor2",
|
||||
Login: "editor2",
|
||||
OrgId: 2,
|
||||
OrgID: 2,
|
||||
Created: now,
|
||||
Updated: now,
|
||||
},
|
||||
@@ -213,9 +215,9 @@ func TestMigrations(t *testing.T) {
|
||||
|
||||
for _, user := range users {
|
||||
// Check managed roles exist
|
||||
roleName := fmt.Sprintf("managed:users:%d:permissions", user.Id)
|
||||
roleName := fmt.Sprintf("managed:users:%d:permissions", user.ID)
|
||||
role := accesscontrol.Role{}
|
||||
hasRole, errManagedRoleSearch := x.Table("role").Where("org_id = ? AND name = ?", user.OrgId, roleName).Get(&role)
|
||||
hasRole, errManagedRoleSearch := x.Table("role").Where("org_id = ? AND name = ?", user.OrgID, roleName).Get(&role)
|
||||
|
||||
require.NoError(t, errManagedRoleSearch)
|
||||
assert.True(t, hasRole, "expected role to be granted to user", user, roleName)
|
||||
@@ -234,7 +236,7 @@ func TestMigrations(t *testing.T) {
|
||||
|
||||
// Check assignment of the roles
|
||||
assign := accesscontrol.UserRole{}
|
||||
has, errAssignmentSearch := x.Table("user_role").Where("role_id = ? AND user_id = ?", role.ID, user.Id).Get(&assign)
|
||||
has, errAssignmentSearch := x.Table("user_role").Where("role_id = ? AND user_id = ?", role.ID, user.ID).Get(&assign)
|
||||
require.NoError(t, errAssignmentSearch)
|
||||
assert.True(t, has, "expected assignment of role to user", role, user)
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/services/datasources"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
)
|
||||
|
||||
type OrgListResponse []struct {
|
||||
@@ -18,7 +19,7 @@ type SQLStoreMock struct {
|
||||
LastLoginAttemptCommand *models.CreateLoginAttemptCommand
|
||||
LatestUserId int64
|
||||
|
||||
ExpectedUser *models.User
|
||||
ExpectedUser *user.User
|
||||
ExpectedDatasource *datasources.DataSource
|
||||
ExpectedAlert *models.Alert
|
||||
ExpectedPluginSetting *models.PluginSetting
|
||||
@@ -132,7 +133,7 @@ func (m *SQLStoreMock) DeleteOldLoginAttempts(ctx context.Context, cmd *models.D
|
||||
return m.ExpectedError
|
||||
}
|
||||
|
||||
func (m *SQLStoreMock) CreateUser(ctx context.Context, cmd models.CreateUserCommand) (*models.User, error) {
|
||||
func (m *SQLStoreMock) CreateUser(ctx context.Context, cmd user.CreateUserCommand) (*user.User, error) {
|
||||
return nil, m.ExpectedError
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
dashver "github.com/grafana/grafana/pkg/services/dashboardversion"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
"github.com/grafana/grafana/pkg/util"
|
||||
)
|
||||
|
||||
@@ -86,16 +87,16 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
sqlStore.Cfg.AutoAssignOrgRole = "Viewer"
|
||||
|
||||
t.Run("Users should be added to default organization", func(t *testing.T) {
|
||||
ac1cmd := models.CreateUserCommand{Login: "ac1", Email: "ac1@test.com", Name: "ac1 name"}
|
||||
ac2cmd := models.CreateUserCommand{Login: "ac2", Email: "ac2@test.com", Name: "ac2 name"}
|
||||
ac1cmd := user.CreateUserCommand{Login: "ac1", Email: "ac1@test.com", Name: "ac1 name"}
|
||||
ac2cmd := user.CreateUserCommand{Login: "ac2", Email: "ac2@test.com", Name: "ac2 name"}
|
||||
|
||||
ac1, err := sqlStore.CreateUser(context.Background(), ac1cmd)
|
||||
require.NoError(t, err)
|
||||
ac2, err := sqlStore.CreateUser(context.Background(), ac2cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
q1 := models.GetUserOrgListQuery{UserId: ac1.Id}
|
||||
q2 := models.GetUserOrgListQuery{UserId: ac2.Id}
|
||||
q1 := models.GetUserOrgListQuery{UserId: ac1.ID}
|
||||
q2 := models.GetUserOrgListQuery{UserId: ac2.ID}
|
||||
err = sqlStore.GetUserOrgList(context.Background(), &q1)
|
||||
require.NoError(t, err)
|
||||
err = sqlStore.GetUserOrgList(context.Background(), &q2)
|
||||
@@ -112,18 +113,18 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
sqlStore.Cfg.AutoAssignOrgId = 1
|
||||
sqlStore.Cfg.AutoAssignOrgRole = "Viewer"
|
||||
|
||||
ac1cmd := models.CreateUserCommand{Login: "ac1", Email: "ac1@test.com", Name: "ac1 name"}
|
||||
ac2cmd := models.CreateUserCommand{Login: "ac2", Email: "ac2@test.com", Name: "ac2 name"}
|
||||
ac1cmd := user.CreateUserCommand{Login: "ac1", Email: "ac1@test.com", Name: "ac1 name"}
|
||||
ac2cmd := user.CreateUserCommand{Login: "ac2", Email: "ac2@test.com", Name: "ac2 name"}
|
||||
|
||||
ac1, err := sqlStore.CreateUser(context.Background(), ac1cmd)
|
||||
testUser.OrgId = ac1.OrgId
|
||||
testUser.OrgId = ac1.OrgID
|
||||
require.NoError(t, err)
|
||||
_, err = sqlStore.CreateUser(context.Background(), ac2cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("Can get organization users paginated with query", func(t *testing.T) {
|
||||
query := models.SearchOrgUsersQuery{
|
||||
OrgID: ac1.OrgId,
|
||||
OrgID: ac1.OrgID,
|
||||
Page: 1,
|
||||
User: testUser,
|
||||
}
|
||||
@@ -135,7 +136,7 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("Can get organization users paginated and limited", func(t *testing.T) {
|
||||
query := models.SearchOrgUsersQuery{
|
||||
OrgID: ac1.OrgId,
|
||||
OrgID: ac1.OrgID,
|
||||
Limit: 1,
|
||||
Page: 1,
|
||||
User: testUser,
|
||||
@@ -151,9 +152,9 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
sqlStore = InitTestDB(t)
|
||||
sqlStore.Cfg.AutoAssignOrg = false
|
||||
|
||||
ac1cmd := models.CreateUserCommand{Login: "ac1", Email: "ac1@test.com", Name: "ac1 name"}
|
||||
ac2cmd := models.CreateUserCommand{Login: "ac2", Email: "ac2@test.com", Name: "ac2 name", IsAdmin: true}
|
||||
serviceaccountcmd := models.CreateUserCommand{Login: "serviceaccount", Email: "service@test.com", Name: "serviceaccount name", IsAdmin: true, IsServiceAccount: true}
|
||||
ac1cmd := user.CreateUserCommand{Login: "ac1", Email: "ac1@test.com", Name: "ac1 name"}
|
||||
ac2cmd := user.CreateUserCommand{Login: "ac2", Email: "ac2@test.com", Name: "ac2 name", IsAdmin: true}
|
||||
serviceaccountcmd := user.CreateUserCommand{Login: "serviceaccount", Email: "service@test.com", Name: "serviceaccount name", IsAdmin: true, IsServiceAccount: true}
|
||||
|
||||
ac1, err := sqlStore.CreateUser(context.Background(), ac1cmd)
|
||||
require.NoError(t, err)
|
||||
@@ -164,7 +165,7 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("Should be able to read user info projection", func(t *testing.T) {
|
||||
query := models.GetUserProfileQuery{UserId: ac1.Id}
|
||||
query := models.GetUserProfileQuery{UserId: ac1.ID}
|
||||
err = sqlStore.GetUserProfile(context.Background(), &query)
|
||||
|
||||
require.NoError(t, err)
|
||||
@@ -189,8 +190,8 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("Given an added org user", func(t *testing.T) {
|
||||
cmd := models.AddOrgUserCommand{
|
||||
OrgId: ac1.OrgId,
|
||||
UserId: ac2.Id,
|
||||
OrgId: ac1.OrgID,
|
||||
UserId: ac2.ID,
|
||||
Role: models.ROLE_VIEWER,
|
||||
}
|
||||
|
||||
@@ -200,15 +201,15 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Can update org user role", func(t *testing.T) {
|
||||
updateCmd := models.UpdateOrgUserCommand{OrgId: ac1.OrgId, UserId: ac2.Id, Role: models.ROLE_ADMIN}
|
||||
updateCmd := models.UpdateOrgUserCommand{OrgId: ac1.OrgID, UserId: ac2.ID, Role: models.ROLE_ADMIN}
|
||||
err = sqlStore.UpdateOrgUser(context.Background(), &updateCmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
orgUsersQuery := models.GetOrgUsersQuery{
|
||||
OrgId: ac1.OrgId,
|
||||
OrgId: ac1.OrgID,
|
||||
User: &models.SignedInUser{
|
||||
OrgId: ac1.OrgId,
|
||||
Permissions: map[int64]map[string][]string{ac1.OrgId: {accesscontrol.ActionOrgUsersRead: {accesscontrol.ScopeUsersAll}}},
|
||||
OrgId: ac1.OrgID,
|
||||
Permissions: map[int64]map[string][]string{ac1.OrgID: {accesscontrol.ActionOrgUsersRead: {accesscontrol.ScopeUsersAll}}},
|
||||
},
|
||||
}
|
||||
err = sqlStore.GetOrgUsers(context.Background(), &orgUsersQuery)
|
||||
@@ -218,12 +219,12 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Can get logged in user projection", func(t *testing.T) {
|
||||
query := models.GetSignedInUserQuery{UserId: ac2.Id}
|
||||
query := models.GetSignedInUserQuery{UserId: ac2.ID}
|
||||
err := sqlStore.GetSignedInUser(context.Background(), &query)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, query.Result.Email, "ac2@test.com")
|
||||
require.Equal(t, query.Result.OrgId, ac2.OrgId)
|
||||
require.Equal(t, query.Result.OrgId, ac2.OrgID)
|
||||
require.Equal(t, query.Result.Name, "ac2 name")
|
||||
require.Equal(t, query.Result.Login, "ac2")
|
||||
require.EqualValues(t, query.Result.OrgRole, "Admin")
|
||||
@@ -232,7 +233,7 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Can get user organizations", func(t *testing.T) {
|
||||
query := models.GetUserOrgListQuery{UserId: ac2.Id}
|
||||
query := models.GetUserOrgListQuery{UserId: ac2.ID}
|
||||
err := sqlStore.GetUserOrgList(context.Background(), &query)
|
||||
|
||||
require.NoError(t, err)
|
||||
@@ -241,10 +242,10 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("Can get organization users", func(t *testing.T) {
|
||||
query := models.GetOrgUsersQuery{
|
||||
OrgId: ac1.OrgId,
|
||||
OrgId: ac1.OrgID,
|
||||
User: &models.SignedInUser{
|
||||
OrgId: ac1.OrgId,
|
||||
Permissions: map[int64]map[string][]string{ac1.OrgId: {accesscontrol.ActionOrgUsersRead: {accesscontrol.ScopeUsersAll}}},
|
||||
OrgId: ac1.OrgID,
|
||||
Permissions: map[int64]map[string][]string{ac1.OrgID: {accesscontrol.ActionOrgUsersRead: {accesscontrol.ScopeUsersAll}}},
|
||||
},
|
||||
}
|
||||
err := sqlStore.GetOrgUsers(context.Background(), &query)
|
||||
@@ -256,11 +257,11 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("Can get organization users with query", func(t *testing.T) {
|
||||
query := models.GetOrgUsersQuery{
|
||||
OrgId: ac1.OrgId,
|
||||
OrgId: ac1.OrgID,
|
||||
Query: "ac1",
|
||||
User: &models.SignedInUser{
|
||||
OrgId: ac1.OrgId,
|
||||
Permissions: map[int64]map[string][]string{ac1.OrgId: {accesscontrol.ActionOrgUsersRead: {accesscontrol.ScopeUsersAll}}},
|
||||
OrgId: ac1.OrgID,
|
||||
Permissions: map[int64]map[string][]string{ac1.OrgID: {accesscontrol.ActionOrgUsersRead: {accesscontrol.ScopeUsersAll}}},
|
||||
},
|
||||
}
|
||||
err := sqlStore.GetOrgUsers(context.Background(), &query)
|
||||
@@ -272,12 +273,12 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("Can get organization users with query and limit", func(t *testing.T) {
|
||||
query := models.GetOrgUsersQuery{
|
||||
OrgId: ac1.OrgId,
|
||||
OrgId: ac1.OrgID,
|
||||
Query: "ac",
|
||||
Limit: 1,
|
||||
User: &models.SignedInUser{
|
||||
OrgId: ac1.OrgId,
|
||||
Permissions: map[int64]map[string][]string{ac1.OrgId: {accesscontrol.ActionOrgUsersRead: {accesscontrol.ScopeUsersAll}}},
|
||||
OrgId: ac1.OrgID,
|
||||
Permissions: map[int64]map[string][]string{ac1.OrgID: {accesscontrol.ActionOrgUsersRead: {accesscontrol.ScopeUsersAll}}},
|
||||
},
|
||||
}
|
||||
err := sqlStore.GetOrgUsers(context.Background(), &query)
|
||||
@@ -288,16 +289,16 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Can set using org", func(t *testing.T) {
|
||||
cmd := models.SetUsingOrgCommand{UserId: ac2.Id, OrgId: ac1.OrgId}
|
||||
cmd := models.SetUsingOrgCommand{UserId: ac2.ID, OrgId: ac1.OrgID}
|
||||
err := sqlStore.SetUsingOrg(context.Background(), &cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("SignedInUserQuery with a different org", func(t *testing.T) {
|
||||
query := models.GetSignedInUserQuery{UserId: ac2.Id}
|
||||
query := models.GetSignedInUserQuery{UserId: ac2.ID}
|
||||
err := sqlStore.GetSignedInUser(context.Background(), &query)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, query.Result.OrgId, ac1.OrgId)
|
||||
require.Equal(t, query.Result.OrgId, ac1.OrgID)
|
||||
require.Equal(t, query.Result.Email, "ac2@test.com")
|
||||
require.Equal(t, query.Result.Name, "ac2 name")
|
||||
require.Equal(t, query.Result.Login, "ac2")
|
||||
@@ -305,53 +306,53 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Should set last org as current when removing user from current", func(t *testing.T) {
|
||||
remCmd := models.RemoveOrgUserCommand{OrgId: ac1.OrgId, UserId: ac2.Id}
|
||||
remCmd := models.RemoveOrgUserCommand{OrgId: ac1.OrgID, UserId: ac2.ID}
|
||||
err := sqlStore.RemoveOrgUser(context.Background(), &remCmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
query := models.GetSignedInUserQuery{UserId: ac2.Id}
|
||||
query := models.GetSignedInUserQuery{UserId: ac2.ID}
|
||||
err = sqlStore.GetSignedInUser(context.Background(), &query)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, query.Result.OrgId, ac2.OrgId)
|
||||
require.Equal(t, query.Result.OrgId, ac2.OrgID)
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("Removing user from org should delete user completely if in no other org", func(t *testing.T) {
|
||||
// make sure ac2 has no org
|
||||
err := sqlStore.DeleteOrg(context.Background(), &models.DeleteOrgCommand{Id: ac2.OrgId})
|
||||
err := sqlStore.DeleteOrg(context.Background(), &models.DeleteOrgCommand{Id: ac2.OrgID})
|
||||
require.NoError(t, err)
|
||||
|
||||
// remove ac2 user from ac1 org
|
||||
remCmd := models.RemoveOrgUserCommand{OrgId: ac1.OrgId, UserId: ac2.Id, ShouldDeleteOrphanedUser: true}
|
||||
remCmd := models.RemoveOrgUserCommand{OrgId: ac1.OrgID, UserId: ac2.ID, ShouldDeleteOrphanedUser: true}
|
||||
err = sqlStore.RemoveOrgUser(context.Background(), &remCmd)
|
||||
require.NoError(t, err)
|
||||
require.True(t, remCmd.UserWasDeleted)
|
||||
|
||||
err = sqlStore.GetSignedInUser(context.Background(), &models.GetSignedInUserQuery{UserId: ac2.Id})
|
||||
err = sqlStore.GetSignedInUser(context.Background(), &models.GetSignedInUserQuery{UserId: ac2.ID})
|
||||
require.Equal(t, err, models.ErrUserNotFound)
|
||||
})
|
||||
|
||||
t.Run("Cannot delete last admin org user", func(t *testing.T) {
|
||||
cmd := models.RemoveOrgUserCommand{OrgId: ac1.OrgId, UserId: ac1.Id}
|
||||
cmd := models.RemoveOrgUserCommand{OrgId: ac1.OrgID, UserId: ac1.ID}
|
||||
err := sqlStore.RemoveOrgUser(context.Background(), &cmd)
|
||||
require.Equal(t, err, models.ErrLastOrgAdmin)
|
||||
})
|
||||
|
||||
t.Run("Cannot update role so no one is admin user", func(t *testing.T) {
|
||||
cmd := models.UpdateOrgUserCommand{OrgId: ac1.OrgId, UserId: ac1.Id, Role: models.ROLE_VIEWER}
|
||||
cmd := models.UpdateOrgUserCommand{OrgId: ac1.OrgID, UserId: ac1.ID, Role: models.ROLE_VIEWER}
|
||||
err := sqlStore.UpdateOrgUser(context.Background(), &cmd)
|
||||
require.Equal(t, err, models.ErrLastOrgAdmin)
|
||||
})
|
||||
|
||||
t.Run("Given an org user with dashboard permissions", func(t *testing.T) {
|
||||
ac3cmd := models.CreateUserCommand{Login: "ac3", Email: "ac3@test.com", Name: "ac3 name", IsAdmin: false}
|
||||
ac3cmd := user.CreateUserCommand{Login: "ac3", Email: "ac3@test.com", Name: "ac3 name", IsAdmin: false}
|
||||
ac3, err := sqlStore.CreateUser(context.Background(), ac3cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
orgUserCmd := models.AddOrgUserCommand{
|
||||
OrgId: ac1.OrgId,
|
||||
UserId: ac3.Id,
|
||||
OrgId: ac1.OrgID,
|
||||
UserId: ac3.ID,
|
||||
Role: models.ROLE_VIEWER,
|
||||
}
|
||||
|
||||
@@ -359,36 +360,36 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
query := models.GetOrgUsersQuery{
|
||||
OrgId: ac1.OrgId,
|
||||
OrgId: ac1.OrgID,
|
||||
User: &models.SignedInUser{
|
||||
OrgId: ac1.OrgId,
|
||||
Permissions: map[int64]map[string][]string{ac1.OrgId: {accesscontrol.ActionOrgUsersRead: {accesscontrol.ScopeUsersAll}}},
|
||||
OrgId: ac1.OrgID,
|
||||
Permissions: map[int64]map[string][]string{ac1.OrgID: {accesscontrol.ActionOrgUsersRead: {accesscontrol.ScopeUsersAll}}},
|
||||
},
|
||||
}
|
||||
err = sqlStore.GetOrgUsers(context.Background(), &query)
|
||||
require.NoError(t, err)
|
||||
// require.Equal(t, len(query.Result), 3)
|
||||
|
||||
dash1 := insertTestDashboard(t, sqlStore, "1 test dash", ac1.OrgId, 0, false, "prod", "webapp")
|
||||
dash2 := insertTestDashboard(t, sqlStore, "2 test dash", ac3.OrgId, 0, false, "prod", "webapp")
|
||||
dash1 := insertTestDashboard(t, sqlStore, "1 test dash", ac1.OrgID, 0, false, "prod", "webapp")
|
||||
dash2 := insertTestDashboard(t, sqlStore, "2 test dash", ac3.OrgID, 0, false, "prod", "webapp")
|
||||
|
||||
err = updateDashboardAcl(t, sqlStore, dash1.Id, &models.DashboardAcl{
|
||||
DashboardID: dash1.Id, OrgID: ac1.OrgId, UserID: ac3.Id, Permission: models.PERMISSION_EDIT,
|
||||
DashboardID: dash1.Id, OrgID: ac1.OrgID, UserID: ac3.ID, Permission: models.PERMISSION_EDIT,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = updateDashboardAcl(t, sqlStore, dash2.Id, &models.DashboardAcl{
|
||||
DashboardID: dash2.Id, OrgID: ac3.OrgId, UserID: ac3.Id, Permission: models.PERMISSION_EDIT,
|
||||
DashboardID: dash2.Id, OrgID: ac3.OrgID, UserID: ac3.ID, Permission: models.PERMISSION_EDIT,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("When org user is deleted", func(t *testing.T) {
|
||||
cmdRemove := models.RemoveOrgUserCommand{OrgId: ac1.OrgId, UserId: ac3.Id}
|
||||
cmdRemove := models.RemoveOrgUserCommand{OrgId: ac1.OrgID, UserId: ac3.ID}
|
||||
err := sqlStore.RemoveOrgUser(context.Background(), &cmdRemove)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("Should remove dependent permissions for deleted org user", func(t *testing.T) {
|
||||
permQuery := &models.GetDashboardAclInfoListQuery{DashboardID: dash1.Id, OrgID: ac1.OrgId}
|
||||
permQuery := &models.GetDashboardAclInfoListQuery{DashboardID: dash1.Id, OrgID: ac1.OrgID}
|
||||
|
||||
err = getDashboardAclInfoList(sqlStore, permQuery)
|
||||
require.NoError(t, err)
|
||||
@@ -397,14 +398,14 @@ func TestIntegrationAccountDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Should not remove dashboard permissions for same user in another org", func(t *testing.T) {
|
||||
permQuery := &models.GetDashboardAclInfoListQuery{DashboardID: dash2.Id, OrgID: ac3.OrgId}
|
||||
permQuery := &models.GetDashboardAclInfoListQuery{DashboardID: dash2.Id, OrgID: ac3.OrgID}
|
||||
|
||||
err = getDashboardAclInfoList(sqlStore, permQuery)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, len(permQuery.Result), 1)
|
||||
require.Equal(t, permQuery.Result[0].OrgId, ac3.OrgId)
|
||||
require.Equal(t, permQuery.Result[0].UserId, ac3.Id)
|
||||
require.Equal(t, permQuery.Result[0].OrgId, ac3.OrgID)
|
||||
require.Equal(t, permQuery.Result[0].UserId, ac3.ID)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -8,20 +8,21 @@ import (
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
"github.com/grafana/grafana/pkg/util"
|
||||
)
|
||||
|
||||
func (ss *SQLStore) AddOrgUser(ctx context.Context, cmd *models.AddOrgUserCommand) error {
|
||||
return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error {
|
||||
// check if user exists
|
||||
var user models.User
|
||||
var user user.User
|
||||
if exists, err := sess.ID(cmd.UserId).Where(notServiceAccountFilter(ss)).Get(&user); err != nil {
|
||||
return err
|
||||
} else if !exists {
|
||||
return models.ErrUserNotFound
|
||||
}
|
||||
|
||||
if res, err := sess.Query("SELECT 1 from org_user WHERE org_id=? and user_id=?", cmd.OrgId, user.Id); err != nil {
|
||||
if res, err := sess.Query("SELECT 1 from org_user WHERE org_id=? and user_id=?", cmd.OrgId, user.ID); err != nil {
|
||||
return err
|
||||
} else if len(res) == 1 {
|
||||
return models.ErrOrgUserAlreadyAdded
|
||||
@@ -49,7 +50,7 @@ func (ss *SQLStore) AddOrgUser(ctx context.Context, cmd *models.AddOrgUserComman
|
||||
var userOrgs []*models.UserOrgDTO
|
||||
sess.Table("org_user")
|
||||
sess.Join("INNER", "org", "org_user.org_id=org.id")
|
||||
sess.Where("org_user.user_id=? AND org_user.org_id=?", user.Id, user.OrgId)
|
||||
sess.Where("org_user.user_id=? AND org_user.org_id=?", user.ID, user.OrgID)
|
||||
sess.Cols("org.name", "org_user.role", "org_user.org_id")
|
||||
err = sess.Find(&userOrgs)
|
||||
|
||||
@@ -58,7 +59,7 @@ func (ss *SQLStore) AddOrgUser(ctx context.Context, cmd *models.AddOrgUserComman
|
||||
}
|
||||
|
||||
if len(userOrgs) == 0 {
|
||||
return setUsingOrgInTransaction(sess, user.Id, cmd.OrgId)
|
||||
return setUsingOrgInTransaction(sess, user.ID, cmd.OrgId)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -243,7 +244,7 @@ func (ss *SQLStore) SearchOrgUsers(ctx context.Context, query *models.SearchOrgU
|
||||
func (ss *SQLStore) RemoveOrgUser(ctx context.Context, cmd *models.RemoveOrgUserCommand) error {
|
||||
return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error {
|
||||
// check if user exists
|
||||
var user models.User
|
||||
var user user.User
|
||||
if exists, err := sess.ID(cmd.UserId).Where(notServiceAccountFilter(ss)).Get(&user); err != nil {
|
||||
return err
|
||||
} else if !exists {
|
||||
@@ -273,7 +274,7 @@ func (ss *SQLStore) RemoveOrgUser(ctx context.Context, cmd *models.RemoveOrgUser
|
||||
var userOrgs []*models.UserOrgDTO
|
||||
sess.Table("org_user")
|
||||
sess.Join("INNER", "org", "org_user.org_id=org.id")
|
||||
sess.Where("org_user.user_id=?", user.Id)
|
||||
sess.Where("org_user.user_id=?", user.ID)
|
||||
sess.Cols("org.name", "org_user.role", "org_user.org_id")
|
||||
err := sess.Find(&userOrgs)
|
||||
|
||||
@@ -284,28 +285,28 @@ func (ss *SQLStore) RemoveOrgUser(ctx context.Context, cmd *models.RemoveOrgUser
|
||||
if len(userOrgs) > 0 {
|
||||
hasCurrentOrgSet := false
|
||||
for _, userOrg := range userOrgs {
|
||||
if user.OrgId == userOrg.OrgId {
|
||||
if user.OrgID == userOrg.OrgId {
|
||||
hasCurrentOrgSet = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !hasCurrentOrgSet {
|
||||
err = setUsingOrgInTransaction(sess, user.Id, userOrgs[0].OrgId)
|
||||
err = setUsingOrgInTransaction(sess, user.ID, userOrgs[0].OrgId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else if cmd.ShouldDeleteOrphanedUser {
|
||||
// no other orgs, delete the full user
|
||||
if err := deleteUserInTransaction(ss, sess, &models.DeleteUserCommand{UserId: user.Id}); err != nil {
|
||||
if err := deleteUserInTransaction(ss, sess, &models.DeleteUserCommand{UserId: user.ID}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cmd.UserWasDeleted = true
|
||||
} else {
|
||||
// no orgs, but keep the user -> clean up orgId
|
||||
err = removeUserOrg(sess, user.Id)
|
||||
err = removeUserOrg(sess, user.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
)
|
||||
|
||||
type getOrgUsersTestCase struct {
|
||||
@@ -151,16 +152,16 @@ func TestSQLStore_RemoveOrgUser(t *testing.T) {
|
||||
store := InitTestDB(t)
|
||||
|
||||
// create org and admin
|
||||
_, err := store.CreateUser(context.Background(), models.CreateUserCommand{
|
||||
_, err := store.CreateUser(context.Background(), user.CreateUserCommand{
|
||||
Login: "admin",
|
||||
OrgId: 1,
|
||||
OrgID: 1,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
// create a user with no org
|
||||
_, err = store.CreateUser(context.Background(), models.CreateUserCommand{
|
||||
_, err = store.CreateUser(context.Background(), user.CreateUserCommand{
|
||||
Login: "user",
|
||||
OrgId: 1,
|
||||
OrgID: 1,
|
||||
SkipOrgSetup: true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -177,7 +178,7 @@ func TestSQLStore_RemoveOrgUser(t *testing.T) {
|
||||
user := &models.GetUserByIdQuery{Id: 2}
|
||||
err = store.GetUserById(context.Background(), user)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, user.Result.OrgId, int64(1))
|
||||
require.Equal(t, user.Result.OrgID, int64(1))
|
||||
|
||||
// remove the user org
|
||||
err = store.RemoveOrgUser(context.Background(), &models.RemoveOrgUserCommand{
|
||||
@@ -191,16 +192,16 @@ func TestSQLStore_RemoveOrgUser(t *testing.T) {
|
||||
user = &models.GetUserByIdQuery{Id: 2}
|
||||
err = store.GetUserById(context.Background(), user)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, user.Result.OrgId, int64(0))
|
||||
require.Equal(t, user.Result.OrgID, int64(0))
|
||||
}
|
||||
|
||||
func seedOrgUsers(t *testing.T, store *SQLStore, numUsers int) {
|
||||
t.Helper()
|
||||
// Seed users
|
||||
for i := 1; i <= numUsers; i++ {
|
||||
user, err := store.CreateUser(context.Background(), models.CreateUserCommand{
|
||||
user, err := store.CreateUser(context.Background(), user.CreateUserCommand{
|
||||
Login: fmt.Sprintf("user-%d", i),
|
||||
OrgId: 1,
|
||||
OrgID: 1,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -208,7 +209,7 @@ func seedOrgUsers(t *testing.T, store *SQLStore, numUsers int) {
|
||||
err = store.AddOrgUser(context.Background(), &models.AddOrgUserCommand{
|
||||
Role: "Viewer",
|
||||
OrgId: 1,
|
||||
UserId: user.Id,
|
||||
UserId: user.ID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
@@ -23,6 +23,10 @@ func (sess *DBSession) publishAfterCommit(msg interface{}) {
|
||||
sess.events = append(sess.events, msg)
|
||||
}
|
||||
|
||||
func (sess *DBSession) PublishAfterCommit(msg interface{}) {
|
||||
sess.events = append(sess.events, msg)
|
||||
}
|
||||
|
||||
// NewSession returns a new DBSession
|
||||
func (ss *SQLStore) NewSession(ctx context.Context) *DBSession {
|
||||
sess := &DBSession{Session: ss.engine.NewSession()}
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
|
||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -190,11 +191,11 @@ func test(t *testing.T, dashboardProps DashboardProps, dashboardPermission *Dash
|
||||
})
|
||||
}
|
||||
|
||||
func createDummyUser(t *testing.T, sqlStore *SQLStore) *models.User {
|
||||
func createDummyUser(t *testing.T, sqlStore *SQLStore) *user.User {
|
||||
t.Helper()
|
||||
|
||||
uid := strconv.Itoa(rand.Intn(9999999))
|
||||
createUserCmd := models.CreateUserCommand{
|
||||
createUserCmd := user.CreateUserCommand{
|
||||
Email: uid + "@example.com",
|
||||
Login: uid,
|
||||
Name: uid,
|
||||
@@ -262,12 +263,12 @@ func createDummyACL(t *testing.T, sqlStore *SQLStore, dashboardPermission *Dashb
|
||||
DashboardID: dashboardID,
|
||||
}
|
||||
|
||||
var user *models.User
|
||||
var user *user.User
|
||||
if dashboardPermission.User {
|
||||
t.Logf("Creating user")
|
||||
user = createDummyUser(t, sqlStore)
|
||||
|
||||
acl.UserID = user.Id
|
||||
acl.UserID = user.ID
|
||||
}
|
||||
|
||||
if dashboardPermission.Team {
|
||||
@@ -275,9 +276,9 @@ func createDummyACL(t *testing.T, sqlStore *SQLStore, dashboardPermission *Dashb
|
||||
team := createDummyTeam(t, sqlStore)
|
||||
if search.UserFromACL {
|
||||
user = createDummyUser(t, sqlStore)
|
||||
err := sqlStore.AddTeamMember(user.Id, 1, team.Id, false, 0)
|
||||
err := sqlStore.AddTeamMember(user.ID, 1, team.Id, false, 0)
|
||||
require.NoError(t, err)
|
||||
t.Logf("Created team member with ID %d", user.Id)
|
||||
t.Logf("Created team member with ID %d", user.ID)
|
||||
}
|
||||
|
||||
acl.TeamID = team.Id
|
||||
@@ -290,7 +291,7 @@ func createDummyACL(t *testing.T, sqlStore *SQLStore, dashboardPermission *Dashb
|
||||
err := updateDashboardAcl(t, sqlStore, dashboardID, acl)
|
||||
require.NoError(t, err)
|
||||
if user != nil {
|
||||
return user.Id
|
||||
return user.ID
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/migrations"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/sqlutil"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
"github.com/grafana/grafana/pkg/util"
|
||||
)
|
||||
@@ -180,7 +181,7 @@ func (ss *SQLStore) ensureMainOrgAndAdminUser() error {
|
||||
// ensure admin user
|
||||
if !ss.Cfg.DisableInitAdminCreation {
|
||||
ss.log.Debug("Creating default admin user")
|
||||
if _, err := ss.createUser(ctx, sess, models.CreateUserCommand{
|
||||
if _, err := ss.createUser(ctx, sess, user.CreateUserCommand{
|
||||
Login: ss.Cfg.AdminUser,
|
||||
Email: ss.Cfg.AdminUser + "@localhost",
|
||||
Password: ss.Cfg.AdminPassword,
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -64,9 +65,9 @@ func TestIntegrationStatsDataAccess(t *testing.T) {
|
||||
func populateDB(t *testing.T, sqlStore *SQLStore) {
|
||||
t.Helper()
|
||||
|
||||
users := make([]models.User, 3)
|
||||
users := make([]user.User, 3)
|
||||
for i := range users {
|
||||
cmd := models.CreateUserCommand{
|
||||
cmd := user.CreateUserCommand{
|
||||
Email: fmt.Sprintf("usertest%v@test.com", i),
|
||||
Name: fmt.Sprintf("user name %v", i),
|
||||
Login: fmt.Sprintf("user_test_%v_login", i),
|
||||
@@ -78,7 +79,7 @@ func populateDB(t *testing.T, sqlStore *SQLStore) {
|
||||
}
|
||||
|
||||
// get 1st user's organisation
|
||||
getOrgByIdQuery := &models.GetOrgByIdQuery{Id: users[0].OrgId}
|
||||
getOrgByIdQuery := &models.GetOrgByIdQuery{Id: users[0].OrgID}
|
||||
err := sqlStore.GetOrgById(context.Background(), getOrgByIdQuery)
|
||||
require.NoError(t, err)
|
||||
org := getOrgByIdQuery.Result
|
||||
@@ -86,7 +87,7 @@ func populateDB(t *testing.T, sqlStore *SQLStore) {
|
||||
// add 2nd user as editor
|
||||
cmd := &models.AddOrgUserCommand{
|
||||
OrgId: org.Id,
|
||||
UserId: users[1].Id,
|
||||
UserId: users[1].ID,
|
||||
Role: models.ROLE_EDITOR,
|
||||
}
|
||||
err = sqlStore.AddOrgUser(context.Background(), cmd)
|
||||
@@ -95,14 +96,14 @@ func populateDB(t *testing.T, sqlStore *SQLStore) {
|
||||
// add 3rd user as viewer
|
||||
cmd = &models.AddOrgUserCommand{
|
||||
OrgId: org.Id,
|
||||
UserId: users[2].Id,
|
||||
UserId: users[2].ID,
|
||||
Role: models.ROLE_VIEWER,
|
||||
}
|
||||
err = sqlStore.AddOrgUser(context.Background(), cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
// get 2nd user's organisation
|
||||
getOrgByIdQuery = &models.GetOrgByIdQuery{Id: users[1].OrgId}
|
||||
getOrgByIdQuery = &models.GetOrgByIdQuery{Id: users[1].OrgID}
|
||||
err = sqlStore.GetOrgById(context.Background(), getOrgByIdQuery)
|
||||
require.NoError(t, err)
|
||||
org = getOrgByIdQuery.Result
|
||||
@@ -110,7 +111,7 @@ func populateDB(t *testing.T, sqlStore *SQLStore) {
|
||||
// add 1st user as admin
|
||||
cmd = &models.AddOrgUserCommand{
|
||||
OrgId: org.Id,
|
||||
UserId: users[0].Id,
|
||||
UserId: users[0].ID,
|
||||
Role: models.ROLE_ADMIN,
|
||||
}
|
||||
err = sqlStore.AddOrgUser(context.Background(), cmd)
|
||||
@@ -118,7 +119,7 @@ func populateDB(t *testing.T, sqlStore *SQLStore) {
|
||||
|
||||
// update 1st user last seen at
|
||||
updateUserLastSeenAtCmd := &models.UpdateUserLastSeenAtCommand{
|
||||
UserId: users[0].Id,
|
||||
UserId: users[0].ID,
|
||||
}
|
||||
err = sqlStore.UpdateUserLastSeenAt(context.Background(), updateUserLastSeenAtCmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/datasources"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
)
|
||||
|
||||
type Store interface {
|
||||
@@ -26,7 +27,7 @@ type Store interface {
|
||||
CreateLoginAttempt(ctx context.Context, cmd *models.CreateLoginAttemptCommand) error
|
||||
GetUserLoginAttemptCount(ctx context.Context, query *models.GetUserLoginAttemptCountQuery) error
|
||||
DeleteOldLoginAttempts(ctx context.Context, cmd *models.DeleteOldLoginAttemptsCommand) error
|
||||
CreateUser(ctx context.Context, cmd models.CreateUserCommand) (*models.User, error)
|
||||
CreateUser(ctx context.Context, cmd user.CreateUserCommand) (*user.User, error)
|
||||
GetUserById(ctx context.Context, query *models.GetUserByIdQuery) error
|
||||
GetUserByLogin(ctx context.Context, query *models.GetUserByLoginQuery) error
|
||||
GetUserByEmail(ctx context.Context, query *models.GetUserByEmailQuery) error
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/serviceaccounts"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
)
|
||||
|
||||
func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
@@ -34,20 +35,20 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
var userIds []int64
|
||||
const testOrgID int64 = 1
|
||||
var team1, team2 models.Team
|
||||
var user *models.User
|
||||
var userCmd models.CreateUserCommand
|
||||
var usr *user.User
|
||||
var userCmd user.CreateUserCommand
|
||||
var err error
|
||||
|
||||
setup := func() {
|
||||
for i := 0; i < 5; i++ {
|
||||
userCmd = models.CreateUserCommand{
|
||||
userCmd = user.CreateUserCommand{
|
||||
Email: fmt.Sprint("user", i, "@test.com"),
|
||||
Name: fmt.Sprint("user", i),
|
||||
Login: fmt.Sprint("loginuser", i),
|
||||
}
|
||||
user, err = sqlStore.CreateUser(context.Background(), userCmd)
|
||||
usr, err = sqlStore.CreateUser(context.Background(), userCmd)
|
||||
require.NoError(t, err)
|
||||
userIds = append(userIds, user.Id)
|
||||
userIds = append(userIds, usr.ID)
|
||||
}
|
||||
team1, err = sqlStore.CreateTeam("group1 name", "test1@test.com", testOrgID)
|
||||
require.NoError(t, err)
|
||||
@@ -375,7 +376,7 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
t.Run("Should be able to exclude service accounts from teamembers", func(t *testing.T) {
|
||||
sqlStore = InitTestDB(t)
|
||||
setup()
|
||||
userCmd = models.CreateUserCommand{
|
||||
userCmd = user.CreateUserCommand{
|
||||
Email: fmt.Sprint("sa", 1, "@test.com"),
|
||||
Name: fmt.Sprint("sa", 1),
|
||||
Login: fmt.Sprint("login-sa", 1),
|
||||
@@ -386,7 +387,7 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
|
||||
groupId := team2.Id
|
||||
// add service account to team
|
||||
err = sqlStore.AddTeamMember(serviceAccount.Id, testOrgID, groupId, false, 0)
|
||||
err = sqlStore.AddTeamMember(serviceAccount.ID, testOrgID, groupId, false, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
// add user to team
|
||||
@@ -498,14 +499,14 @@ func TestIntegrationSQLStore_GetTeamMembers_ACFilter(t *testing.T) {
|
||||
require.NoError(t, errCreateTeam)
|
||||
|
||||
for i := 0; i < 4; i++ {
|
||||
userCmd := models.CreateUserCommand{
|
||||
userCmd := user.CreateUserCommand{
|
||||
Email: fmt.Sprint("user", i, "@example.org"),
|
||||
Name: fmt.Sprint("user", i),
|
||||
Login: fmt.Sprint("loginuser", i),
|
||||
}
|
||||
user, errCreateUser := store.CreateUser(context.Background(), userCmd)
|
||||
require.NoError(t, errCreateUser)
|
||||
userIds[i] = user.Id
|
||||
userIds[i] = user.ID
|
||||
}
|
||||
|
||||
errAddMember := store.AddTeamMember(userIds[0], testOrgID, team1.Id, false, 0)
|
||||
|
||||
@@ -11,11 +11,12 @@ import (
|
||||
"github.com/grafana/grafana/pkg/events"
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
"github.com/grafana/grafana/pkg/util"
|
||||
)
|
||||
|
||||
type ErrCaseInsensitiveLoginConflict struct {
|
||||
users []models.User
|
||||
users []user.User
|
||||
}
|
||||
|
||||
func (e *ErrCaseInsensitiveLoginConflict) Unwrap() error {
|
||||
@@ -27,7 +28,7 @@ func (e *ErrCaseInsensitiveLoginConflict) Error() string {
|
||||
|
||||
userStrings := make([]string, 0, n)
|
||||
for _, v := range e.users {
|
||||
userStrings = append(userStrings, fmt.Sprintf("%s (email:%s, id:%d)", v.Login, v.Email, v.Id))
|
||||
userStrings = append(userStrings, fmt.Sprintf("%s (email:%s, id:%d)", v.Login, v.Email, v.ID))
|
||||
}
|
||||
|
||||
return fmt.Sprintf(
|
||||
@@ -35,12 +36,12 @@ func (e *ErrCaseInsensitiveLoginConflict) Error() string {
|
||||
n, strings.Join(userStrings, ", "))
|
||||
}
|
||||
|
||||
func (ss *SQLStore) getOrgIDForNewUser(sess *DBSession, args models.CreateUserCommand) (int64, error) {
|
||||
if ss.Cfg.AutoAssignOrg && args.OrgId != 0 {
|
||||
if err := verifyExistingOrg(sess, args.OrgId); err != nil {
|
||||
func (ss *SQLStore) getOrgIDForNewUser(sess *DBSession, args user.CreateUserCommand) (int64, error) {
|
||||
if ss.Cfg.AutoAssignOrg && args.OrgID != 0 {
|
||||
if err := verifyExistingOrg(sess, args.OrgID); err != nil {
|
||||
return -1, err
|
||||
}
|
||||
return args.OrgId, nil
|
||||
return args.OrgID, nil
|
||||
}
|
||||
|
||||
orgName := args.OrgName
|
||||
@@ -52,7 +53,7 @@ func (ss *SQLStore) getOrgIDForNewUser(sess *DBSession, args models.CreateUserCo
|
||||
}
|
||||
|
||||
func (ss *SQLStore) userCaseInsensitiveLoginConflict(ctx context.Context, sess *DBSession, login, email string) error {
|
||||
users := make([]models.User, 0)
|
||||
users := make([]user.User, 0)
|
||||
|
||||
if err := sess.Where("LOWER(email)=LOWER(?) OR LOWER(login)=LOWER(?)",
|
||||
email, login).Find(&users); err != nil {
|
||||
@@ -67,14 +68,14 @@ func (ss *SQLStore) userCaseInsensitiveLoginConflict(ctx context.Context, sess *
|
||||
}
|
||||
|
||||
// createUser creates a user in the database
|
||||
func (ss *SQLStore) createUser(ctx context.Context, sess *DBSession, args models.CreateUserCommand) (models.User, error) {
|
||||
var user models.User
|
||||
func (ss *SQLStore) createUser(ctx context.Context, sess *DBSession, args user.CreateUserCommand) (user.User, error) {
|
||||
var usr user.User
|
||||
var orgID int64 = -1
|
||||
if !args.SkipOrgSetup {
|
||||
var err error
|
||||
orgID, err = ss.getOrgIDForNewUser(sess, args)
|
||||
if err != nil {
|
||||
return user, err
|
||||
return usr, err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,23 +90,23 @@ func (ss *SQLStore) createUser(ctx context.Context, sess *DBSession, args models
|
||||
args.Email = strings.ToLower(args.Email)
|
||||
}
|
||||
|
||||
exists, err := sess.Where(where, args.Email, args.Login).Get(&models.User{})
|
||||
exists, err := sess.Where(where, args.Email, args.Login).Get(&user.User{})
|
||||
if err != nil {
|
||||
return user, err
|
||||
return usr, err
|
||||
}
|
||||
if exists {
|
||||
return user, models.ErrUserAlreadyExists
|
||||
return usr, models.ErrUserAlreadyExists
|
||||
}
|
||||
|
||||
// create user
|
||||
user = models.User{
|
||||
usr = user.User{
|
||||
Email: args.Email,
|
||||
Name: args.Name,
|
||||
Login: args.Login,
|
||||
Company: args.Company,
|
||||
IsAdmin: args.IsAdmin,
|
||||
IsDisabled: args.IsDisabled,
|
||||
OrgId: orgID,
|
||||
OrgID: orgID,
|
||||
EmailVerified: args.EmailVerified,
|
||||
Created: time.Now(),
|
||||
Updated: time.Now(),
|
||||
@@ -115,48 +116,48 @@ func (ss *SQLStore) createUser(ctx context.Context, sess *DBSession, args models
|
||||
|
||||
salt, err := util.GetRandomString(10)
|
||||
if err != nil {
|
||||
return user, err
|
||||
return usr, err
|
||||
}
|
||||
user.Salt = salt
|
||||
usr.Salt = salt
|
||||
rands, err := util.GetRandomString(10)
|
||||
if err != nil {
|
||||
return user, err
|
||||
return usr, err
|
||||
}
|
||||
user.Rands = rands
|
||||
usr.Rands = rands
|
||||
|
||||
if len(args.Password) > 0 {
|
||||
encodedPassword, err := util.EncodePassword(args.Password, user.Salt)
|
||||
encodedPassword, err := util.EncodePassword(args.Password, usr.Salt)
|
||||
if err != nil {
|
||||
return user, err
|
||||
return usr, err
|
||||
}
|
||||
user.Password = encodedPassword
|
||||
usr.Password = encodedPassword
|
||||
}
|
||||
|
||||
sess.UseBool("is_admin")
|
||||
|
||||
if _, err := sess.Insert(&user); err != nil {
|
||||
return user, err
|
||||
if _, err := sess.Insert(&usr); err != nil {
|
||||
return usr, err
|
||||
}
|
||||
|
||||
sess.publishAfterCommit(&events.UserCreated{
|
||||
Timestamp: user.Created,
|
||||
Id: user.Id,
|
||||
Name: user.Name,
|
||||
Login: user.Login,
|
||||
Email: user.Email,
|
||||
Timestamp: usr.Created,
|
||||
Id: usr.ID,
|
||||
Name: usr.Name,
|
||||
Login: usr.Login,
|
||||
Email: usr.Email,
|
||||
})
|
||||
|
||||
// create org user link
|
||||
if !args.SkipOrgSetup {
|
||||
orgUser := models.OrgUser{
|
||||
OrgId: orgID,
|
||||
UserId: user.Id,
|
||||
UserId: usr.ID,
|
||||
Role: models.ROLE_ADMIN,
|
||||
Created: time.Now(),
|
||||
Updated: time.Now(),
|
||||
}
|
||||
|
||||
if ss.Cfg.AutoAssignOrg && !user.IsAdmin {
|
||||
if ss.Cfg.AutoAssignOrg && !usr.IsAdmin {
|
||||
if len(args.DefaultOrgRole) > 0 {
|
||||
orgUser.Role = models.RoleType(args.DefaultOrgRole)
|
||||
} else {
|
||||
@@ -165,15 +166,16 @@ func (ss *SQLStore) createUser(ctx context.Context, sess *DBSession, args models
|
||||
}
|
||||
|
||||
if _, err = sess.Insert(&orgUser); err != nil {
|
||||
return user, err
|
||||
return usr, err
|
||||
}
|
||||
}
|
||||
|
||||
return user, nil
|
||||
return usr, nil
|
||||
}
|
||||
|
||||
func (ss *SQLStore) CreateUser(ctx context.Context, cmd models.CreateUserCommand) (*models.User, error) {
|
||||
var user models.User
|
||||
// deprecated method, use only for tests
|
||||
func (ss *SQLStore) CreateUser(ctx context.Context, cmd user.CreateUserCommand) (*user.User, error) {
|
||||
var user user.User
|
||||
createErr := ss.WithTransactionalDbSession(ctx, func(sess *DBSession) (err error) {
|
||||
user, err = ss.createUser(ctx, sess, cmd)
|
||||
return
|
||||
@@ -189,7 +191,7 @@ func notServiceAccountFilter(ss *SQLStore) string {
|
||||
|
||||
func (ss *SQLStore) GetUserById(ctx context.Context, query *models.GetUserByIdQuery) error {
|
||||
return ss.WithDbSession(ctx, func(sess *DBSession) error {
|
||||
user := new(models.User)
|
||||
user := new(user.User)
|
||||
|
||||
has, err := sess.ID(query.Id).
|
||||
Where(notServiceAccountFilter(ss)).
|
||||
@@ -221,13 +223,13 @@ func (ss *SQLStore) GetUserByLogin(ctx context.Context, query *models.GetUserByL
|
||||
|
||||
// Try and find the user by login first.
|
||||
// It's not sufficient to assume that a LoginOrEmail with an "@" is an email.
|
||||
user := &models.User{}
|
||||
usr := &user.User{}
|
||||
where := "login=?"
|
||||
if ss.Cfg.CaseInsensitiveLogin {
|
||||
where = "LOWER(login)=LOWER(?)"
|
||||
}
|
||||
|
||||
has, err := sess.Where(notServiceAccountFilter(ss)).Where(where, query.LoginOrEmail).Get(user)
|
||||
has, err := sess.Where(notServiceAccountFilter(ss)).Where(where, query.LoginOrEmail).Get(usr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -235,12 +237,13 @@ func (ss *SQLStore) GetUserByLogin(ctx context.Context, query *models.GetUserByL
|
||||
if !has && strings.Contains(query.LoginOrEmail, "@") {
|
||||
// If the user wasn't found, and it contains an "@" fallback to finding the
|
||||
// user by email.
|
||||
|
||||
where = "email=?"
|
||||
if ss.Cfg.CaseInsensitiveLogin {
|
||||
where = "LOWER(email)=LOWER(?)"
|
||||
}
|
||||
user = &models.User{}
|
||||
has, err = sess.Where(notServiceAccountFilter(ss)).Where(where, query.LoginOrEmail).Get(user)
|
||||
usr = &user.User{}
|
||||
has, err = sess.Where(notServiceAccountFilter(ss)).Where(where, query.LoginOrEmail).Get(usr)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
@@ -250,12 +253,12 @@ func (ss *SQLStore) GetUserByLogin(ctx context.Context, query *models.GetUserByL
|
||||
}
|
||||
|
||||
if ss.Cfg.CaseInsensitiveLogin {
|
||||
if err := ss.userCaseInsensitiveLoginConflict(ctx, sess, user.Login, user.Email); err != nil {
|
||||
if err := ss.userCaseInsensitiveLoginConflict(ctx, sess, usr.Login, usr.Email); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
query.Result = user
|
||||
query.Result = usr
|
||||
|
||||
return nil
|
||||
})
|
||||
@@ -267,7 +270,7 @@ func (ss *SQLStore) GetUserByEmail(ctx context.Context, query *models.GetUserByE
|
||||
return models.ErrUserNotFound
|
||||
}
|
||||
|
||||
user := &models.User{}
|
||||
user := &user.User{}
|
||||
where := "email=?"
|
||||
if ss.Cfg.CaseInsensitiveLogin {
|
||||
where = "LOWER(email)=LOWER(?)"
|
||||
@@ -300,7 +303,7 @@ func (ss *SQLStore) UpdateUser(ctx context.Context, cmd *models.UpdateUserComman
|
||||
}
|
||||
|
||||
return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error {
|
||||
user := models.User{
|
||||
user := user.User{
|
||||
Name: cmd.Name,
|
||||
Email: cmd.Email,
|
||||
Login: cmd.Login,
|
||||
@@ -320,7 +323,7 @@ func (ss *SQLStore) UpdateUser(ctx context.Context, cmd *models.UpdateUserComman
|
||||
|
||||
sess.publishAfterCommit(&events.UserUpdated{
|
||||
Timestamp: user.Created,
|
||||
Id: user.Id,
|
||||
Id: user.ID,
|
||||
Name: user.Name,
|
||||
Login: user.Login,
|
||||
Email: user.Email,
|
||||
@@ -332,7 +335,7 @@ func (ss *SQLStore) UpdateUser(ctx context.Context, cmd *models.UpdateUserComman
|
||||
|
||||
func (ss *SQLStore) ChangeUserPassword(ctx context.Context, cmd *models.ChangeUserPasswordCommand) error {
|
||||
return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error {
|
||||
user := models.User{
|
||||
user := user.User{
|
||||
Password: cmd.NewPassword,
|
||||
Updated: time.Now(),
|
||||
}
|
||||
@@ -344,8 +347,8 @@ func (ss *SQLStore) ChangeUserPassword(ctx context.Context, cmd *models.ChangeUs
|
||||
|
||||
func (ss *SQLStore) UpdateUserLastSeenAt(ctx context.Context, cmd *models.UpdateUserLastSeenAtCommand) error {
|
||||
return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error {
|
||||
user := models.User{
|
||||
Id: cmd.UserId,
|
||||
user := user.User{
|
||||
ID: cmd.UserId,
|
||||
LastSeenAt: time.Now(),
|
||||
}
|
||||
|
||||
@@ -376,9 +379,9 @@ func (ss *SQLStore) SetUsingOrg(ctx context.Context, cmd *models.SetUsingOrgComm
|
||||
}
|
||||
|
||||
func setUsingOrgInTransaction(sess *DBSession, userID int64, orgID int64) error {
|
||||
user := models.User{
|
||||
Id: userID,
|
||||
OrgId: orgID,
|
||||
user := user.User{
|
||||
ID: userID,
|
||||
OrgID: orgID,
|
||||
}
|
||||
|
||||
_, err := sess.ID(userID).Update(&user)
|
||||
@@ -386,9 +389,9 @@ func setUsingOrgInTransaction(sess *DBSession, userID int64, orgID int64) error
|
||||
}
|
||||
|
||||
func removeUserOrg(sess *DBSession, userID int64) error {
|
||||
user := models.User{
|
||||
Id: userID,
|
||||
OrgId: 0,
|
||||
user := user.User{
|
||||
ID: userID,
|
||||
OrgID: 0,
|
||||
}
|
||||
|
||||
_, err := sess.ID(userID).MustCols("org_id").Update(&user)
|
||||
@@ -397,7 +400,7 @@ func removeUserOrg(sess *DBSession, userID int64) error {
|
||||
|
||||
func (ss *SQLStore) GetUserProfile(ctx context.Context, query *models.GetUserProfileQuery) error {
|
||||
return ss.WithDbSession(ctx, func(sess *DBSession) error {
|
||||
var user models.User
|
||||
var user user.User
|
||||
has, err := sess.ID(query.UserId).Where(notServiceAccountFilter(ss)).Get(&user)
|
||||
|
||||
if err != nil {
|
||||
@@ -407,14 +410,14 @@ func (ss *SQLStore) GetUserProfile(ctx context.Context, query *models.GetUserPro
|
||||
}
|
||||
|
||||
query.Result = models.UserProfileDTO{
|
||||
Id: user.Id,
|
||||
Id: user.ID,
|
||||
Name: user.Name,
|
||||
Email: user.Email,
|
||||
Login: user.Login,
|
||||
Theme: user.Theme,
|
||||
IsGrafanaAdmin: user.IsAdmin,
|
||||
IsDisabled: user.IsDisabled,
|
||||
OrgId: user.OrgId,
|
||||
OrgId: user.OrgID,
|
||||
UpdatedAt: user.Updated,
|
||||
CreatedAt: user.Created,
|
||||
}
|
||||
@@ -654,7 +657,7 @@ func (ss *SQLStore) SearchUsers(ctx context.Context, query *models.SearchUsersQu
|
||||
}
|
||||
|
||||
// get total
|
||||
user := models.User{}
|
||||
user := user.User{}
|
||||
countSess := dbSess.Table("user").Alias("u")
|
||||
|
||||
// Join with user_auth table if users filtered by auth_module
|
||||
@@ -691,7 +694,7 @@ func (ss *SQLStore) SearchUsers(ctx context.Context, query *models.SearchUsersQu
|
||||
|
||||
func (ss *SQLStore) DisableUser(ctx context.Context, cmd *models.DisableUserCommand) error {
|
||||
return ss.WithDbSession(ctx, func(dbSess *DBSession) error {
|
||||
user := models.User{}
|
||||
user := user.User{}
|
||||
sess := dbSess.Table("user")
|
||||
|
||||
if has, err := sess.ID(cmd.UserId).Where(notServiceAccountFilter(ss)).Get(&user); err != nil {
|
||||
@@ -737,7 +740,7 @@ func (ss *SQLStore) DeleteUser(ctx context.Context, cmd *models.DeleteUserComman
|
||||
|
||||
func deleteUserInTransaction(ss *SQLStore, sess *DBSession, cmd *models.DeleteUserCommand) error {
|
||||
// Check if user exists
|
||||
user := models.User{Id: cmd.UserId}
|
||||
user := user.User{ID: cmd.UserId}
|
||||
has, err := sess.Where(notServiceAccountFilter(ss)).Get(&user)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -813,7 +816,7 @@ func UserDeletions() []string {
|
||||
// UpdateUserPermissions sets the user Server Admin flag
|
||||
func (ss *SQLStore) UpdateUserPermissions(userID int64, isAdmin bool) error {
|
||||
return ss.WithTransactionalDbSession(context.Background(), func(sess *DBSession) error {
|
||||
var user models.User
|
||||
var user user.User
|
||||
if _, err := sess.ID(userID).Where(notServiceAccountFilter(ss)).Get(&user); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -821,7 +824,7 @@ func (ss *SQLStore) UpdateUserPermissions(userID int64, isAdmin bool) error {
|
||||
user.IsAdmin = isAdmin
|
||||
sess.UseBool("is_admin")
|
||||
|
||||
_, err := sess.ID(user.Id).Update(&user)
|
||||
_, err := sess.ID(user.ID).Update(&user)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -837,9 +840,9 @@ func (ss *SQLStore) UpdateUserPermissions(userID int64, isAdmin bool) error {
|
||||
|
||||
func (ss *SQLStore) SetUserHelpFlag(ctx context.Context, cmd *models.SetUserHelpFlagCommand) error {
|
||||
return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error {
|
||||
user := models.User{
|
||||
Id: cmd.UserId,
|
||||
HelpFlags1: cmd.HelpFlags1,
|
||||
user := user.User{
|
||||
ID: cmd.UserId,
|
||||
HelpFlags1: user.HelpFlags1(cmd.HelpFlags1),
|
||||
Updated: time.Now(),
|
||||
}
|
||||
|
||||
@@ -850,7 +853,7 @@ func (ss *SQLStore) SetUserHelpFlag(ctx context.Context, cmd *models.SetUserHelp
|
||||
|
||||
// validateOneAdminLeft validate that there is an admin user left
|
||||
func validateOneAdminLeft(sess *DBSession) error {
|
||||
count, err := sess.Where("is_admin=?", true).Count(&models.User{})
|
||||
count, err := sess.Where("is_admin=?", true).Count(&user.User{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -18,8 +19,8 @@ func TestIntegrationUserUpdate(t *testing.T) {
|
||||
|
||||
ss := InitTestDB(t)
|
||||
|
||||
users := createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand {
|
||||
return &models.CreateUserCommand{
|
||||
users := createFiveTestUsers(t, ss, func(i int) *user.CreateUserCommand {
|
||||
return &user.CreateUserCommand{
|
||||
Email: fmt.Sprint("USER", i, "@test.com"),
|
||||
Name: fmt.Sprint("USER", i),
|
||||
Login: fmt.Sprint("loginUSER", i),
|
||||
@@ -32,7 +33,7 @@ func TestIntegrationUserUpdate(t *testing.T) {
|
||||
t.Run("Testing DB - update generates duplicate user", func(t *testing.T) {
|
||||
err := ss.UpdateUser(context.Background(), &models.UpdateUserCommand{
|
||||
Login: "loginuser2",
|
||||
UserId: users[0].Id,
|
||||
UserId: users[0].ID,
|
||||
})
|
||||
|
||||
require.Error(t, err)
|
||||
@@ -42,11 +43,11 @@ func TestIntegrationUserUpdate(t *testing.T) {
|
||||
err := ss.UpdateUser(context.Background(), &models.UpdateUserCommand{
|
||||
Login: "loginUSER0",
|
||||
Email: "USER0@test.com",
|
||||
UserId: users[0].Id,
|
||||
UserId: users[0].ID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
query := models.GetUserByIdQuery{Id: users[0].Id}
|
||||
query := models.GetUserByIdQuery{Id: users[0].ID}
|
||||
err = ss.GetUserById(context.Background(), &query)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -59,11 +60,11 @@ func TestIntegrationUserUpdate(t *testing.T) {
|
||||
Login: "",
|
||||
Email: "",
|
||||
Name: "Change Name",
|
||||
UserId: users[3].Id,
|
||||
UserId: users[3].ID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
query := models.GetUserByIdQuery{Id: users[3].Id}
|
||||
query := models.GetUserByIdQuery{Id: users[3].ID}
|
||||
err = ss.GetUserById(context.Background(), &query)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -83,13 +84,13 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
t.Skip("skipping integration test")
|
||||
}
|
||||
ss := InitTestDB(t)
|
||||
user := &models.SignedInUser{
|
||||
usr := &models.SignedInUser{
|
||||
OrgId: 1,
|
||||
Permissions: map[int64]map[string][]string{1: {"users:read": {"global.users:*"}}},
|
||||
}
|
||||
|
||||
t.Run("Testing DB - creates and loads user", func(t *testing.T) {
|
||||
cmd := models.CreateUserCommand{
|
||||
cmd := user.CreateUserCommand{
|
||||
Email: "usertest@test.com",
|
||||
Name: "user name",
|
||||
Login: "user_test_login",
|
||||
@@ -97,7 +98,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
user, err := ss.CreateUser(context.Background(), cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
query := models.GetUserByIdQuery{Id: user.Id}
|
||||
query := models.GetUserByIdQuery{Id: user.ID}
|
||||
err = ss.GetUserById(context.Background(), &query)
|
||||
require.Nil(t, err)
|
||||
|
||||
@@ -107,7 +108,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
require.Len(t, query.Result.Salt, 10)
|
||||
require.False(t, query.Result.IsDisabled)
|
||||
|
||||
query = models.GetUserByIdQuery{Id: user.Id}
|
||||
query = models.GetUserByIdQuery{Id: user.ID}
|
||||
err = ss.GetUserById(context.Background(), &query)
|
||||
require.Nil(t, err)
|
||||
|
||||
@@ -166,7 +167,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("Testing DB - creates and loads disabled user", func(t *testing.T) {
|
||||
ss = InitTestDB(t)
|
||||
cmd := models.CreateUserCommand{
|
||||
cmd := user.CreateUserCommand{
|
||||
Email: "usertest@test.com",
|
||||
Name: "user name",
|
||||
Login: "user_test_login",
|
||||
@@ -176,7 +177,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
user, err := ss.CreateUser(context.Background(), cmd)
|
||||
require.Nil(t, err)
|
||||
|
||||
query := models.GetUserByIdQuery{Id: user.Id}
|
||||
query := models.GetUserByIdQuery{Id: user.ID}
|
||||
err = ss.GetUserById(context.Background(), &query)
|
||||
require.Nil(t, err)
|
||||
|
||||
@@ -200,17 +201,17 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
err := ss.CreateOrg(context.Background(), orgCmd)
|
||||
require.Nil(t, err)
|
||||
|
||||
cmd := models.CreateUserCommand{
|
||||
cmd := user.CreateUserCommand{
|
||||
Email: "usertest@test.com",
|
||||
Name: "user name",
|
||||
Login: "user_test_login",
|
||||
OrgId: orgCmd.Result.Id,
|
||||
OrgID: orgCmd.Result.Id,
|
||||
}
|
||||
|
||||
user, err := ss.CreateUser(context.Background(), cmd)
|
||||
usr, err := ss.CreateUser(context.Background(), cmd)
|
||||
require.Nil(t, err)
|
||||
|
||||
query := models.GetUserByIdQuery{Id: user.Id}
|
||||
query := models.GetUserByIdQuery{Id: usr.ID}
|
||||
err = ss.GetUserById(context.Background(), &query)
|
||||
require.Nil(t, err)
|
||||
|
||||
@@ -219,14 +220,14 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
require.Len(t, query.Result.Rands, 10)
|
||||
require.Len(t, query.Result.Salt, 10)
|
||||
require.False(t, query.Result.IsDisabled)
|
||||
require.Equal(t, query.Result.OrgId, orgCmd.Result.Id)
|
||||
require.Equal(t, query.Result.OrgID, orgCmd.Result.Id)
|
||||
|
||||
const nonExistingOrgID = 10000
|
||||
cmd = models.CreateUserCommand{
|
||||
cmd = user.CreateUserCommand{
|
||||
Email: "usertest@test.com",
|
||||
Name: "user name",
|
||||
Login: "user_test_login",
|
||||
OrgId: nonExistingOrgID,
|
||||
OrgID: nonExistingOrgID,
|
||||
}
|
||||
|
||||
_, err = ss.CreateUser(context.Background(), cmd)
|
||||
@@ -236,8 +237,8 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
t.Run("Testing DB - multiple users", func(t *testing.T) {
|
||||
ss = InitTestDB(t)
|
||||
|
||||
createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand {
|
||||
return &models.CreateUserCommand{
|
||||
createFiveTestUsers(t, ss, func(i int) *user.CreateUserCommand {
|
||||
return &user.CreateUserCommand{
|
||||
Email: fmt.Sprint("user", i, "@test.com"),
|
||||
Name: fmt.Sprint("user", i),
|
||||
Login: fmt.Sprint("loginuser", i),
|
||||
@@ -246,7 +247,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
// Return the first page of users and a total count
|
||||
query := models.SearchUsersQuery{Query: "", Page: 1, Limit: 3, SignedInUser: user}
|
||||
query := models.SearchUsersQuery{Query: "", Page: 1, Limit: 3, SignedInUser: usr}
|
||||
err := ss.SearchUsers(context.Background(), &query)
|
||||
|
||||
require.Nil(t, err)
|
||||
@@ -254,7 +255,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
require.EqualValues(t, query.Result.TotalCount, 5)
|
||||
|
||||
// Return the second page of users and a total count
|
||||
query = models.SearchUsersQuery{Query: "", Page: 2, Limit: 3, SignedInUser: user}
|
||||
query = models.SearchUsersQuery{Query: "", Page: 2, Limit: 3, SignedInUser: usr}
|
||||
err = ss.SearchUsers(context.Background(), &query)
|
||||
|
||||
require.Nil(t, err)
|
||||
@@ -262,28 +263,28 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
require.EqualValues(t, query.Result.TotalCount, 5)
|
||||
|
||||
// Return list of users matching query on user name
|
||||
query = models.SearchUsersQuery{Query: "use", Page: 1, Limit: 3, SignedInUser: user}
|
||||
query = models.SearchUsersQuery{Query: "use", Page: 1, Limit: 3, SignedInUser: usr}
|
||||
err = ss.SearchUsers(context.Background(), &query)
|
||||
|
||||
require.Nil(t, err)
|
||||
require.Len(t, query.Result.Users, 3)
|
||||
require.EqualValues(t, query.Result.TotalCount, 5)
|
||||
|
||||
query = models.SearchUsersQuery{Query: "ser1", Page: 1, Limit: 3, SignedInUser: user}
|
||||
query = models.SearchUsersQuery{Query: "ser1", Page: 1, Limit: 3, SignedInUser: usr}
|
||||
err = ss.SearchUsers(context.Background(), &query)
|
||||
|
||||
require.Nil(t, err)
|
||||
require.Len(t, query.Result.Users, 1)
|
||||
require.EqualValues(t, query.Result.TotalCount, 1)
|
||||
|
||||
query = models.SearchUsersQuery{Query: "USER1", Page: 1, Limit: 3, SignedInUser: user}
|
||||
query = models.SearchUsersQuery{Query: "USER1", Page: 1, Limit: 3, SignedInUser: usr}
|
||||
err = ss.SearchUsers(context.Background(), &query)
|
||||
|
||||
require.Nil(t, err)
|
||||
require.Len(t, query.Result.Users, 1)
|
||||
require.EqualValues(t, query.Result.TotalCount, 1)
|
||||
|
||||
query = models.SearchUsersQuery{Query: "idontexist", Page: 1, Limit: 3, SignedInUser: user}
|
||||
query = models.SearchUsersQuery{Query: "idontexist", Page: 1, Limit: 3, SignedInUser: usr}
|
||||
err = ss.SearchUsers(context.Background(), &query)
|
||||
|
||||
require.Nil(t, err)
|
||||
@@ -291,7 +292,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
require.EqualValues(t, query.Result.TotalCount, 0)
|
||||
|
||||
// Return list of users matching query on email
|
||||
query = models.SearchUsersQuery{Query: "ser1@test.com", Page: 1, Limit: 3, SignedInUser: user}
|
||||
query = models.SearchUsersQuery{Query: "ser1@test.com", Page: 1, Limit: 3, SignedInUser: usr}
|
||||
err = ss.SearchUsers(context.Background(), &query)
|
||||
|
||||
require.Nil(t, err)
|
||||
@@ -299,7 +300,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
require.EqualValues(t, query.Result.TotalCount, 1)
|
||||
|
||||
// Return list of users matching query on login name
|
||||
query = models.SearchUsersQuery{Query: "loginuser1", Page: 1, Limit: 3, SignedInUser: user}
|
||||
query = models.SearchUsersQuery{Query: "loginuser1", Page: 1, Limit: 3, SignedInUser: usr}
|
||||
err = ss.SearchUsers(context.Background(), &query)
|
||||
|
||||
require.Nil(t, err)
|
||||
@@ -309,8 +310,8 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("Testing DB - return list users based on their is_disabled flag", func(t *testing.T) {
|
||||
ss = InitTestDB(t)
|
||||
createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand {
|
||||
return &models.CreateUserCommand{
|
||||
createFiveTestUsers(t, ss, func(i int) *user.CreateUserCommand {
|
||||
return &user.CreateUserCommand{
|
||||
Email: fmt.Sprint("user", i, "@test.com"),
|
||||
Name: fmt.Sprint("user", i),
|
||||
Login: fmt.Sprint("loginuser", i),
|
||||
@@ -319,7 +320,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
isDisabled := false
|
||||
query := models.SearchUsersQuery{IsDisabled: &isDisabled, SignedInUser: user}
|
||||
query := models.SearchUsersQuery{IsDisabled: &isDisabled, SignedInUser: usr}
|
||||
err := ss.SearchUsers(context.Background(), &query)
|
||||
require.Nil(t, err)
|
||||
|
||||
@@ -341,8 +342,8 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
|
||||
// Re-init DB
|
||||
ss = InitTestDB(t)
|
||||
users := createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand {
|
||||
return &models.CreateUserCommand{
|
||||
users := createFiveTestUsers(t, ss, func(i int) *user.CreateUserCommand {
|
||||
return &user.CreateUserCommand{
|
||||
Email: fmt.Sprint("user", i, "@test.com"),
|
||||
Name: fmt.Sprint("user", i),
|
||||
Login: fmt.Sprint("loginuser", i),
|
||||
@@ -352,27 +353,27 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
|
||||
err = ss.AddOrgUser(context.Background(), &models.AddOrgUserCommand{
|
||||
LoginOrEmail: users[1].Login, Role: models.ROLE_VIEWER,
|
||||
OrgId: users[0].OrgId, UserId: users[1].Id,
|
||||
OrgId: users[0].OrgID, UserId: users[1].ID,
|
||||
})
|
||||
require.Nil(t, err)
|
||||
|
||||
err = updateDashboardAcl(t, ss, 1, &models.DashboardAcl{
|
||||
DashboardID: 1, OrgID: users[0].OrgId, UserID: users[1].Id,
|
||||
DashboardID: 1, OrgID: users[0].OrgID, UserID: users[1].ID,
|
||||
Permission: models.PERMISSION_EDIT,
|
||||
})
|
||||
require.Nil(t, err)
|
||||
|
||||
// When the user is deleted
|
||||
err = ss.DeleteUser(context.Background(), &models.DeleteUserCommand{UserId: users[1].Id})
|
||||
err = ss.DeleteUser(context.Background(), &models.DeleteUserCommand{UserId: users[1].ID})
|
||||
require.Nil(t, err)
|
||||
|
||||
query1 := &models.GetOrgUsersQuery{OrgId: users[0].OrgId, User: user}
|
||||
query1 := &models.GetOrgUsersQuery{OrgId: users[0].OrgID, User: usr}
|
||||
err = ss.GetOrgUsersForTest(context.Background(), query1)
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Len(t, query1.Result, 1)
|
||||
|
||||
permQuery := &models.GetDashboardAclInfoListQuery{DashboardID: 1, OrgID: users[0].OrgId}
|
||||
permQuery := &models.GetDashboardAclInfoListQuery{DashboardID: 1, OrgID: users[0].OrgID}
|
||||
err = getDashboardAclInfoList(ss, permQuery)
|
||||
require.Nil(t, err)
|
||||
|
||||
@@ -381,8 +382,8 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
// A user is an org member and has been assigned permissions
|
||||
// Re-init DB
|
||||
ss = InitTestDB(t)
|
||||
users = createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand {
|
||||
return &models.CreateUserCommand{
|
||||
users = createFiveTestUsers(t, ss, func(i int) *user.CreateUserCommand {
|
||||
return &user.CreateUserCommand{
|
||||
Email: fmt.Sprint("user", i, "@test.com"),
|
||||
Name: fmt.Sprint("user", i),
|
||||
Login: fmt.Sprint("loginuser", i),
|
||||
@@ -391,37 +392,37 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
})
|
||||
err = ss.AddOrgUser(context.Background(), &models.AddOrgUserCommand{
|
||||
LoginOrEmail: users[1].Login, Role: models.ROLE_VIEWER,
|
||||
OrgId: users[0].OrgId, UserId: users[1].Id,
|
||||
OrgId: users[0].OrgID, UserId: users[1].ID,
|
||||
})
|
||||
require.Nil(t, err)
|
||||
|
||||
err = updateDashboardAcl(t, ss, 1, &models.DashboardAcl{
|
||||
DashboardID: 1, OrgID: users[0].OrgId, UserID: users[1].Id,
|
||||
DashboardID: 1, OrgID: users[0].OrgID, UserID: users[1].ID,
|
||||
Permission: models.PERMISSION_EDIT,
|
||||
})
|
||||
require.Nil(t, err)
|
||||
|
||||
ss.CacheService.Flush()
|
||||
|
||||
query3 := &models.GetSignedInUserQuery{OrgId: users[1].OrgId, UserId: users[1].Id}
|
||||
query3 := &models.GetSignedInUserQuery{OrgId: users[1].OrgID, UserId: users[1].ID}
|
||||
err = ss.GetSignedInUserWithCacheCtx(context.Background(), query3)
|
||||
require.Nil(t, err)
|
||||
require.NotNil(t, query3.Result)
|
||||
require.Equal(t, query3.OrgId, users[1].OrgId)
|
||||
err = ss.SetUsingOrg(context.Background(), &models.SetUsingOrgCommand{UserId: users[1].Id, OrgId: users[0].OrgId})
|
||||
require.Equal(t, query3.OrgId, users[1].OrgID)
|
||||
err = ss.SetUsingOrg(context.Background(), &models.SetUsingOrgCommand{UserId: users[1].ID, OrgId: users[0].OrgID})
|
||||
require.Nil(t, err)
|
||||
query4 := &models.GetSignedInUserQuery{OrgId: 0, UserId: users[1].Id}
|
||||
query4 := &models.GetSignedInUserQuery{OrgId: 0, UserId: users[1].ID}
|
||||
err = ss.GetSignedInUserWithCacheCtx(context.Background(), query4)
|
||||
require.Nil(t, err)
|
||||
require.NotNil(t, query4.Result)
|
||||
require.Equal(t, query4.Result.OrgId, users[0].OrgId)
|
||||
require.Equal(t, query4.Result.OrgId, users[0].OrgID)
|
||||
|
||||
cacheKey := newSignedInUserCacheKey(query4.Result.OrgId, query4.UserId)
|
||||
_, found := ss.CacheService.Get(cacheKey)
|
||||
require.True(t, found)
|
||||
|
||||
disableCmd := models.BatchDisableUsersCommand{
|
||||
UserIds: []int64{users[0].Id, users[1].Id, users[2].Id, users[3].Id, users[4].Id},
|
||||
UserIds: []int64{users[0].ID, users[1].ID, users[2].ID, users[3].ID, users[4].ID},
|
||||
IsDisabled: true,
|
||||
}
|
||||
|
||||
@@ -429,24 +430,24 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
|
||||
isDisabled = true
|
||||
query5 := &models.SearchUsersQuery{IsDisabled: &isDisabled, SignedInUser: user}
|
||||
query5 := &models.SearchUsersQuery{IsDisabled: &isDisabled, SignedInUser: usr}
|
||||
err = ss.SearchUsers(context.Background(), query5)
|
||||
|
||||
require.Nil(t, err)
|
||||
require.EqualValues(t, query5.Result.TotalCount, 5)
|
||||
|
||||
// the user is deleted
|
||||
err = ss.DeleteUser(context.Background(), &models.DeleteUserCommand{UserId: users[1].Id})
|
||||
err = ss.DeleteUser(context.Background(), &models.DeleteUserCommand{UserId: users[1].ID})
|
||||
require.Nil(t, err)
|
||||
|
||||
// delete connected org users and permissions
|
||||
query2 := &models.GetOrgUsersQuery{OrgId: users[0].OrgId}
|
||||
query2 := &models.GetOrgUsersQuery{OrgId: users[0].OrgID}
|
||||
err = ss.GetOrgUsersForTest(context.Background(), query2)
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Len(t, query2.Result, 1)
|
||||
|
||||
permQuery = &models.GetDashboardAclInfoListQuery{DashboardID: 1, OrgID: users[0].OrgId}
|
||||
permQuery = &models.GetDashboardAclInfoListQuery{DashboardID: 1, OrgID: users[0].OrgID}
|
||||
err = getDashboardAclInfoList(ss, permQuery)
|
||||
require.Nil(t, err)
|
||||
|
||||
@@ -455,8 +456,8 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("Testing DB - return list of users that the SignedInUser has permission to read", func(t *testing.T) {
|
||||
ss := InitTestDB(t)
|
||||
createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand {
|
||||
return &models.CreateUserCommand{
|
||||
createFiveTestUsers(t, ss, func(i int) *user.CreateUserCommand {
|
||||
return &user.CreateUserCommand{
|
||||
Email: fmt.Sprint("user", i, "@test.com"),
|
||||
Name: fmt.Sprint("user", i),
|
||||
Login: fmt.Sprint("loginuser", i),
|
||||
@@ -478,7 +479,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
t.Skip("Skipping on MySQL due to case insensitive indexes")
|
||||
}
|
||||
|
||||
cmd := models.CreateUserCommand{
|
||||
cmd := user.CreateUserCommand{
|
||||
Email: "confusertest@test.com",
|
||||
Name: "user name",
|
||||
Login: "user_email_conflict",
|
||||
@@ -486,7 +487,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
userEmailConflict, err := ss.CreateUser(context.Background(), cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
cmd = models.CreateUserCommand{
|
||||
cmd = user.CreateUserCommand{
|
||||
Email: "confusertest@TEST.COM",
|
||||
Name: "user name",
|
||||
Login: "user_email_conflict_two",
|
||||
@@ -494,7 +495,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
_, err = ss.CreateUser(context.Background(), cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
cmd = models.CreateUserCommand{
|
||||
cmd = user.CreateUserCommand{
|
||||
Email: "user_test_login_conflict@test.com",
|
||||
Name: "user name",
|
||||
Login: "user_test_login_conflict",
|
||||
@@ -502,7 +503,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
userLoginConflict, err := ss.CreateUser(context.Background(), cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
cmd = models.CreateUserCommand{
|
||||
cmd = user.CreateUserCommand{
|
||||
Email: "user_test_login_conflict_two@test.com",
|
||||
Name: "user name",
|
||||
Login: "user_test_login_CONFLICT",
|
||||
@@ -525,13 +526,13 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("GetUserByID - email conflict", func(t *testing.T) {
|
||||
query := models.GetUserByIdQuery{Id: userEmailConflict.Id}
|
||||
query := models.GetUserByIdQuery{Id: userEmailConflict.ID}
|
||||
err = ss.GetUserById(context.Background(), &query)
|
||||
require.Error(t, err)
|
||||
})
|
||||
|
||||
t.Run("GetUserByID - login conflict", func(t *testing.T) {
|
||||
query := models.GetUserByIdQuery{Id: userLoginConflict.Id}
|
||||
query := models.GetUserByIdQuery{Id: userLoginConflict.ID}
|
||||
err = ss.GetUserById(context.Background(), &query)
|
||||
require.Error(t, err)
|
||||
})
|
||||
@@ -560,8 +561,8 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
ss = InitTestDB(t)
|
||||
|
||||
t.Run("Testing DB - enable all users", func(t *testing.T) {
|
||||
users := createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand {
|
||||
return &models.CreateUserCommand{
|
||||
users := createFiveTestUsers(t, ss, func(i int) *user.CreateUserCommand {
|
||||
return &user.CreateUserCommand{
|
||||
Email: fmt.Sprint("user", i, "@test.com"),
|
||||
Name: fmt.Sprint("user", i),
|
||||
Login: fmt.Sprint("loginuser", i),
|
||||
@@ -570,7 +571,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
disableCmd := models.BatchDisableUsersCommand{
|
||||
UserIds: []int64{users[0].Id, users[1].Id, users[2].Id, users[3].Id, users[4].Id},
|
||||
UserIds: []int64{users[0].ID, users[1].ID, users[2].ID, users[3].ID, users[4].ID},
|
||||
IsDisabled: false,
|
||||
}
|
||||
|
||||
@@ -578,7 +579,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
|
||||
isDisabled := false
|
||||
query := &models.SearchUsersQuery{IsDisabled: &isDisabled, SignedInUser: user}
|
||||
query := &models.SearchUsersQuery{IsDisabled: &isDisabled, SignedInUser: usr}
|
||||
err = ss.SearchUsers(context.Background(), query)
|
||||
|
||||
require.Nil(t, err)
|
||||
@@ -588,8 +589,8 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
ss = InitTestDB(t)
|
||||
|
||||
t.Run("Testing DB - disable only specific users", func(t *testing.T) {
|
||||
users := createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand {
|
||||
return &models.CreateUserCommand{
|
||||
users := createFiveTestUsers(t, ss, func(i int) *user.CreateUserCommand {
|
||||
return &user.CreateUserCommand{
|
||||
Email: fmt.Sprint("user", i, "@test.com"),
|
||||
Name: fmt.Sprint("user", i),
|
||||
Login: fmt.Sprint("loginuser", i),
|
||||
@@ -599,7 +600,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
|
||||
userIdsToDisable := []int64{}
|
||||
for i := 0; i < 3; i++ {
|
||||
userIdsToDisable = append(userIdsToDisable, users[i].Id)
|
||||
userIdsToDisable = append(userIdsToDisable, users[i].ID)
|
||||
}
|
||||
disableCmd := models.BatchDisableUsersCommand{
|
||||
UserIds: userIdsToDisable,
|
||||
@@ -609,7 +610,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
err := ss.BatchDisableUsers(context.Background(), &disableCmd)
|
||||
require.Nil(t, err)
|
||||
|
||||
query := models.SearchUsersQuery{SignedInUser: user}
|
||||
query := models.SearchUsersQuery{SignedInUser: usr}
|
||||
err = ss.SearchUsers(context.Background(), &query)
|
||||
|
||||
require.Nil(t, err)
|
||||
@@ -636,8 +637,8 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("Testing DB - search users", func(t *testing.T) {
|
||||
// Since previous tests were destructive
|
||||
createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand {
|
||||
return &models.CreateUserCommand{
|
||||
createFiveTestUsers(t, ss, func(i int) *user.CreateUserCommand {
|
||||
return &user.CreateUserCommand{
|
||||
Email: fmt.Sprint("user", i, "@test.com"),
|
||||
Name: fmt.Sprint("user", i),
|
||||
Login: fmt.Sprint("loginuser", i),
|
||||
@@ -649,21 +650,21 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
t.Run("Testing DB - grafana admin users", func(t *testing.T) {
|
||||
ss = InitTestDB(t)
|
||||
|
||||
createUserCmd := models.CreateUserCommand{
|
||||
createUserCmd := user.CreateUserCommand{
|
||||
Email: fmt.Sprint("admin", "@test.com"),
|
||||
Name: "admin",
|
||||
Login: "admin",
|
||||
IsAdmin: true,
|
||||
}
|
||||
user, err := ss.CreateUser(context.Background(), createUserCmd)
|
||||
usr, err := ss.CreateUser(context.Background(), createUserCmd)
|
||||
require.Nil(t, err)
|
||||
|
||||
// Cannot make themselves a non-admin
|
||||
updatePermsError := ss.UpdateUserPermissions(user.Id, false)
|
||||
updatePermsError := ss.UpdateUserPermissions(usr.ID, false)
|
||||
|
||||
require.Equal(t, updatePermsError, models.ErrLastGrafanaAdmin)
|
||||
|
||||
query := models.GetUserByIdQuery{Id: user.Id}
|
||||
query := models.GetUserByIdQuery{Id: usr.ID}
|
||||
getUserError := ss.GetUserById(context.Background(), &query)
|
||||
require.Nil(t, getUserError)
|
||||
|
||||
@@ -672,7 +673,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
// One user
|
||||
const email = "user@test.com"
|
||||
const username = "user"
|
||||
createUserCmd = models.CreateUserCommand{
|
||||
createUserCmd = user.CreateUserCommand{
|
||||
Email: email,
|
||||
Name: "user",
|
||||
Login: username,
|
||||
@@ -681,7 +682,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
|
||||
// When trying to create a new user with the same email, an error is returned
|
||||
createUserCmd = models.CreateUserCommand{
|
||||
createUserCmd = user.CreateUserCommand{
|
||||
Email: email,
|
||||
Name: "user2",
|
||||
Login: "user2",
|
||||
@@ -691,7 +692,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
require.Equal(t, err, models.ErrUserAlreadyExists)
|
||||
|
||||
// When trying to create a new user with the same login, an error is returned
|
||||
createUserCmd = models.CreateUserCommand{
|
||||
createUserCmd = user.CreateUserCommand{
|
||||
Email: "user2@test.com",
|
||||
Name: "user2",
|
||||
Login: username,
|
||||
@@ -715,10 +716,10 @@ func (ss *SQLStore) GetOrgUsersForTest(ctx context.Context, query *models.GetOrg
|
||||
})
|
||||
}
|
||||
|
||||
func createFiveTestUsers(t *testing.T, sqlStore *SQLStore, fn func(i int) *models.CreateUserCommand) []models.User {
|
||||
func createFiveTestUsers(t *testing.T, sqlStore *SQLStore, fn func(i int) *user.CreateUserCommand) []user.User {
|
||||
t.Helper()
|
||||
|
||||
users := []models.User{}
|
||||
users := []user.User{}
|
||||
for i := 0; i < 5; i++ {
|
||||
cmd := fn(i)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user