From 76f4fccf8ac57444d4deefaee6a05c2910c5b662 Mon Sep 17 00:00:00 2001 From: Rajiv Kushwaha <47850803+rajiv-k@users.noreply.github.com> Date: Thu, 11 Jul 2019 19:24:56 +0530 Subject: [PATCH] Migrate "Team.ClearAllCustomRoleAssignments" to Sync by default (#11587) --- app/permissions.go | 4 +- store/sqlstore/team_store.go | 80 ++++++++++++++---------------- store/store.go | 2 +- store/storetest/mocks/TeamStore.go | 8 +-- store/storetest/team_store.go | 2 +- 5 files changed, 46 insertions(+), 50 deletions(-) diff --git a/app/permissions.go b/app/permissions.go index 01ab3e7849..6b13af67de 100644 --- a/app/permissions.go +++ b/app/permissions.go @@ -33,8 +33,8 @@ func (a *App) ResetPermissionsSystem() *model.AppError { } // Reset all Custom Role assignments to TeamMembers. - if result := <-a.Srv.Store.Team().ClearAllCustomRoleAssignments(); result.Err != nil { - return result.Err + if err := a.Srv.Store.Team().ClearAllCustomRoleAssignments(); err != nil { + return err } // Reset all Custom Role assignments to ChannelMembers. diff --git a/store/sqlstore/team_store.go b/store/sqlstore/team_store.go index 9dee1b5ed9..21d526375b 100644 --- a/store/sqlstore/team_store.go +++ b/store/sqlstore/team_store.go @@ -886,62 +886,58 @@ func (s SqlTeamStore) InvalidateAllTeamIdsForUser(userId string) { } } -func (s SqlTeamStore) ClearAllCustomRoleAssignments() store.StoreChannel { - return store.Do(func(result *store.StoreResult) { - builtInRoles := model.MakeDefaultRoles() - lastUserId := strings.Repeat("0", 26) - lastTeamId := strings.Repeat("0", 26) +func (s SqlTeamStore) ClearAllCustomRoleAssignments() *model.AppError { - for { - var transaction *gorp.Transaction - var err error + builtInRoles := model.MakeDefaultRoles() + lastUserId := strings.Repeat("0", 26) + lastTeamId := strings.Repeat("0", 26) - if transaction, err = s.GetMaster().Begin(); err != nil { - result.Err = model.NewAppError("SqlTeamStore.ClearAllCustomRoleAssignments", "store.sql_team.clear_all_custom_role_assignments.open_transaction.app_error", nil, err.Error(), http.StatusInternalServerError) - return - } - defer finalizeTransaction(transaction) + for { + var transaction *gorp.Transaction + var err error - var teamMembers []*teamMember - if _, err := transaction.Select(&teamMembers, "SELECT * from TeamMembers WHERE (TeamId, UserId) > (:TeamId, :UserId) ORDER BY TeamId, UserId LIMIT 1000", map[string]interface{}{"TeamId": lastTeamId, "UserId": lastUserId}); err != nil { - result.Err = model.NewAppError("SqlTeamStore.ClearAllCustomRoleAssignments", "store.sql_team.clear_all_custom_role_assignments.select.app_error", nil, err.Error(), http.StatusInternalServerError) - return - } + if transaction, err = s.GetMaster().Begin(); err != nil { + return model.NewAppError("SqlTeamStore.ClearAllCustomRoleAssignments", "store.sql_team.clear_all_custom_role_assignments.open_transaction.app_error", nil, err.Error(), http.StatusInternalServerError) + } + defer finalizeTransaction(transaction) - if len(teamMembers) == 0 { - break - } + var teamMembers []*teamMember + if _, err := transaction.Select(&teamMembers, "SELECT * from TeamMembers WHERE (TeamId, UserId) > (:TeamId, :UserId) ORDER BY TeamId, UserId LIMIT 1000", map[string]interface{}{"TeamId": lastTeamId, "UserId": lastUserId}); err != nil { + return model.NewAppError("SqlTeamStore.ClearAllCustomRoleAssignments", "store.sql_team.clear_all_custom_role_assignments.select.app_error", nil, err.Error(), http.StatusInternalServerError) + } - for _, member := range teamMembers { - lastUserId = member.UserId - lastTeamId = member.TeamId + if len(teamMembers) == 0 { + break + } - var newRoles []string + for _, member := range teamMembers { + lastUserId = member.UserId + lastTeamId = member.TeamId - for _, role := range strings.Fields(member.Roles) { - for name := range builtInRoles { - if name == role { - newRoles = append(newRoles, role) - break - } - } - } + var newRoles []string - newRolesString := strings.Join(newRoles, " ") - if newRolesString != member.Roles { - if _, err := transaction.Exec("UPDATE TeamMembers SET Roles = :Roles WHERE UserId = :UserId AND TeamId = :TeamId", map[string]interface{}{"Roles": newRolesString, "TeamId": member.TeamId, "UserId": member.UserId}); err != nil { - result.Err = model.NewAppError("SqlTeamStore.ClearAllCustomRoleAssignments", "store.sql_team.clear_all_custom_role_assignments.update.app_error", nil, err.Error(), http.StatusInternalServerError) - return + for _, role := range strings.Fields(member.Roles) { + for name := range builtInRoles { + if name == role { + newRoles = append(newRoles, role) + break } } } - if err := transaction.Commit(); err != nil { - result.Err = model.NewAppError("SqlTeamStore.ClearAllCustomRoleAssignments", "store.sql_team.clear_all_custom_role_assignments.commit_transaction.app_error", nil, err.Error(), http.StatusInternalServerError) - return + newRolesString := strings.Join(newRoles, " ") + if newRolesString != member.Roles { + if _, err := transaction.Exec("UPDATE TeamMembers SET Roles = :Roles WHERE UserId = :UserId AND TeamId = :TeamId", map[string]interface{}{"Roles": newRolesString, "TeamId": member.TeamId, "UserId": member.UserId}); err != nil { + return model.NewAppError("SqlTeamStore.ClearAllCustomRoleAssignments", "store.sql_team.clear_all_custom_role_assignments.update.app_error", nil, err.Error(), http.StatusInternalServerError) + } } } - }) + + if err := transaction.Commit(); err != nil { + return model.NewAppError("SqlTeamStore.ClearAllCustomRoleAssignments", "store.sql_team.clear_all_custom_role_assignments.commit_transaction.app_error", nil, err.Error(), http.StatusInternalServerError) + } + } + return nil } func (s SqlTeamStore) AnalyticsGetTeamCountForScheme(schemeId string) store.StoreChannel { diff --git a/store/store.go b/store/store.go index 707eacc0a8..8a518a2c0f 100644 --- a/store/store.go +++ b/store/store.go @@ -118,7 +118,7 @@ type TeamStore interface { GetTeamsByScheme(schemeId string, offset int, limit int) ([]*model.Team, *model.AppError) MigrateTeamMembers(fromTeamId string, fromUserId string) (map[string]string, *model.AppError) ResetAllTeamSchemes() *model.AppError - ClearAllCustomRoleAssignments() StoreChannel + ClearAllCustomRoleAssignments() *model.AppError AnalyticsGetTeamCountForScheme(schemeId string) StoreChannel GetAllForExportAfter(limit int, afterId string) ([]*model.TeamForExport, *model.AppError) GetTeamMembersForExport(userId string) ([]*model.TeamMemberForExport, *model.AppError) diff --git a/store/storetest/mocks/TeamStore.go b/store/storetest/mocks/TeamStore.go index e8002bb7f0..badcc1e2a7 100644 --- a/store/storetest/mocks/TeamStore.go +++ b/store/storetest/mocks/TeamStore.go @@ -53,15 +53,15 @@ func (_m *TeamStore) AnalyticsTeamCount() (int64, *model.AppError) { } // ClearAllCustomRoleAssignments provides a mock function with given fields: -func (_m *TeamStore) ClearAllCustomRoleAssignments() store.StoreChannel { +func (_m *TeamStore) ClearAllCustomRoleAssignments() *model.AppError { ret := _m.Called() - var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func() store.StoreChannel); ok { + var r0 *model.AppError + if rf, ok := ret.Get(0).(func() *model.AppError); ok { r0 = rf() } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(store.StoreChannel) + r0 = ret.Get(0).(*model.AppError) } } diff --git a/store/storetest/team_store.go b/store/storetest/team_store.go index e5b66c8bb8..e8d9145662 100644 --- a/store/storetest/team_store.go +++ b/store/storetest/team_store.go @@ -1516,7 +1516,7 @@ func testTeamStoreClearAllCustomRoleAssignments(t *testing.T, ss store.Store) { store.Must(ss.Team().SaveMember(m3, -1)) store.Must(ss.Team().SaveMember(m4, -1)) - require.Nil(t, (<-ss.Team().ClearAllCustomRoleAssignments()).Err) + require.Nil(t, (ss.Team().ClearAllCustomRoleAssignments())) r1, err := ss.Team().GetMember(m1.TeamId, m1.UserId) require.Nil(t, err)