diff --git a/go.tools.mod b/go.tools.mod index 6894a3c585..94fd2edc36 100644 --- a/go.tools.mod +++ b/go.tools.mod @@ -4,7 +4,7 @@ go 1.14 require ( github.com/jstemmer/go-junit-report v0.9.1 // indirect - github.com/mattermost/mattermost-utilities/mmgotool v0.0.0-20200721093743-053c38dcd293 // indirect + github.com/mattermost/mattermost-utilities/mmgotool v0.0.0-20200730135456-e2334fe87160 // indirect github.com/reflog/struct2interface v0.6.1 // indirect github.com/vektra/mockery v1.1.2 // indirect ) diff --git a/go.tools.sum b/go.tools.sum index db84624e55..5319c67df1 100644 --- a/go.tools.sum +++ b/go.tools.sum @@ -56,6 +56,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattermost/mattermost-utilities/mmgotool v0.0.0-20200721093743-053c38dcd293 h1:N9FaqZD58xkAIJGFGY5qdKXGlY2aNMaYQ9KkVEXv8xE= github.com/mattermost/mattermost-utilities/mmgotool v0.0.0-20200721093743-053c38dcd293/go.mod h1:3gKozJI8n2Y/vW37GfnFWAdehGXe5yZlt+HykK6Y3DM= +github.com/mattermost/mattermost-utilities/mmgotool v0.0.0-20200730135456-e2334fe87160 h1:+JXFDXEkbMieBt54Rihj3ppnZ/Pm1kZxkLOD0hrWFzs= +github.com/mattermost/mattermost-utilities/mmgotool v0.0.0-20200730135456-e2334fe87160/go.mod h1:3gKozJI8n2Y/vW37GfnFWAdehGXe5yZlt+HykK6Y3DM= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= diff --git a/i18n/en.json b/i18n/en.json index 680bc5ee8c..90fa4f9d54 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -7402,6 +7402,10 @@ "id": "store.sql_team.get_all_private_team_listing.app_error", "translation": "We could not get all private teams." }, + { + "id": "store.sql_team.get_all_private_team_page_listing.app_error", + "translation": "We could not get all private teams in page." + }, { "id": "store.sql_team.get_all_team_listing.app_error", "translation": "We could not get all teams." diff --git a/store/sqlstore/team_store.go b/store/sqlstore/team_store.go index 68ceb2aa6b..41e8bbeb10 100644 --- a/store/sqlstore/team_store.go +++ b/store/sqlstore/team_store.go @@ -10,6 +10,7 @@ import ( "strings" sq "github.com/Masterminds/squirrel" + "github.com/mattermost/gorp" "github.com/mattermost/mattermost-server/v5/model" "github.com/mattermost/mattermost-server/v5/store" @@ -22,6 +23,8 @@ const ( type SqlTeamStore struct { SqlStore + + teamsQuery sq.SelectBuilder } type teamMember struct { @@ -200,9 +203,13 @@ func (db teamMemberWithSchemeRolesList) ToModel() []*model.TeamMember { func newSqlTeamStore(sqlStore SqlStore) store.TeamStore { s := &SqlTeamStore{ - sqlStore, + SqlStore: sqlStore, } + s.teamsQuery = s.getQueryBuilder(). + Select("Teams.*"). + From("Teams") + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Team{}, "Teams").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) @@ -317,7 +324,11 @@ func (s SqlTeamStore) Get(id string) (*model.Team, *model.AppError) { func (s SqlTeamStore) GetByInviteId(inviteId string) (*model.Team, *model.AppError) { team := model.Team{} - err := s.GetReplica().SelectOne(&team, "SELECT * FROM Teams WHERE InviteId = :InviteId", map[string]interface{}{"InviteId": inviteId}) + query, args, err := s.teamsQuery.Where(sq.Eq{"InviteId": inviteId}).ToSql() + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetByInviteId", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + err = s.GetReplica().SelectOne(&team, query, args...) if err != nil { return nil, model.NewAppError("SqlTeamStore.GetByInviteId", "store.sql_team.get_by_invite_id.finding.app_error", nil, "inviteId="+inviteId+", "+err.Error(), http.StatusNotFound) } @@ -334,8 +345,11 @@ func (s SqlTeamStore) GetByInviteId(inviteId string) (*model.Team, *model.AppErr func (s SqlTeamStore) GetByName(name string) (*model.Team, *model.AppError) { team := model.Team{} - - err := s.GetReplica().SelectOne(&team, "SELECT * FROM Teams WHERE Name = :Name", map[string]interface{}{"Name": name}) + query, args, err := s.teamsQuery.Where(sq.Eq{"Name": name}).ToSql() + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetByName", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + err = s.GetReplica().SelectOne(&team, query, args...) if err != nil { if err == sql.ErrNoRows { return nil, model.NewAppError("SqlTeamStore.GetByName", "store.sql_team.get_by_name.missing.app_error", nil, "name="+name+","+err.Error(), http.StatusNotFound) @@ -348,18 +362,14 @@ func (s SqlTeamStore) GetByName(name string) (*model.Team, *model.AppError) { func (s SqlTeamStore) GetByNames(names []string) ([]*model.Team, *model.AppError) { uniqueNames := utils.RemoveDuplicatesFromStringArray(names) - query := s.getQueryBuilder(). - Select("*"). - From("Teams"). - Where(sq.Eq{"Name": uniqueNames}) + query, args, err := s.teamsQuery.Where(sq.Eq{"Name": uniqueNames}).ToSql() - queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlTeamStore.GetByNames", "store.sql_team.get_by_names.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("SqlTeamStore.GetByNames", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } teams := []*model.Team{} - _, err = s.GetReplica().Select(&teams, queryString, args...) + _, err = s.GetReplica().Select(&teams, query, args...) if err != nil { if err == sql.ErrNoRows { return nil, model.NewAppError("SqlTeamStore.GetByNames", "store.sql_team.get_by_names.missing.app_error", nil, err.Error(), http.StatusNotFound) @@ -498,12 +508,19 @@ func (s SqlTeamStore) SearchOpen(term string) ([]*model.Team, *model.AppError) { term = sanitizeSearchTerm(term, "\\") term = wildcardSearchTerm(term) - operatorKeyword := "ILIKE" + query := s.teamsQuery.Where(sq.Eq{"Type": "O", "AllowOpenInvite": true}) if s.DriverName() == model.DATABASE_DRIVER_MYSQL { - operatorKeyword = "LIKE" + query = query.Where(sq.Or{sq.Like{"Name": term}, sq.Like{"DisplayName": term}}) + } else { + query = query.Where(sq.Or{sq.ILike{"Name": term}, sq.ILike{"DisplayName": term}}) } - queryString := fmt.Sprintf("SELECT * FROM Teams WHERE Type = 'O' AND AllowOpenInvite = true AND (Name %[1]s :Term OR DisplayName %[1]s :Term)", operatorKeyword) - if _, err := s.GetReplica().Select(&teams, queryString, map[string]interface{}{"Term": term}); err != nil { + + queryString, args, err := query.ToSql() + if err != nil { + return nil, model.NewAppError("SqlTeamStore.SearchOpen", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + if _, err = s.GetReplica().Select(&teams, queryString, args...); err != nil { return nil, model.NewAppError("SqlTeamStore.SearchOpen", "store.sql_team.search_open_team.app_error", nil, "term="+term+", "+err.Error(), http.StatusInternalServerError) } @@ -517,18 +534,19 @@ func (s SqlTeamStore) SearchPrivate(term string) ([]*model.Team, *model.AppError term = sanitizeSearchTerm(term, "\\") term = wildcardSearchTerm(term) - operatorKeyword := "ILIKE" + query := s.teamsQuery.Where(sq.Eq{"Type": "O", "AllowOpenInvite": false}) if s.DriverName() == model.DATABASE_DRIVER_MYSQL { - operatorKeyword = "LIKE" + query = query.Where(sq.Or{sq.Like{"Name": term}, sq.Like{"DisplayName": term}}) + } else { + query = query.Where(sq.Or{sq.ILike{"Name": term}, sq.ILike{"DisplayName": term}}) } - query := fmt.Sprintf(` - SELECT * - FROM - Teams - WHERE - (Type != 'O' OR AllowOpenInvite = false) AND - (Name %[1]s :Term OR DisplayName %[1]s :Term)`, operatorKeyword) - if _, err := s.GetReplica().Select(&teams, query, map[string]interface{}{"Term": term}); err != nil { + + queryString, args, err := query.ToSql() + if err != nil { + return nil, model.NewAppError("SqlTeamStore.SearchPrivate", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + if _, err = s.GetReplica().Select(&teams, queryString, args...); err != nil { return nil, model.NewAppError("SqlTeamStore.SearchPrivate", "store.sql_team.search_private_team.app_error", nil, "term="+term+", "+err.Error(), http.StatusInternalServerError) } return teams, nil @@ -538,7 +556,13 @@ func (s SqlTeamStore) SearchPrivate(term string) ([]*model.Team, *model.AppError func (s SqlTeamStore) GetAll() ([]*model.Team, *model.AppError) { var teams []*model.Team - _, err := s.GetReplica().Select(&teams, "SELECT * FROM Teams ORDER BY DisplayName") + query, args, err := s.teamsQuery.OrderBy("DisplayName").ToSql() + + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetAllTeams", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + _, err = s.GetReplica().Select(&teams, query, args...) if err != nil { return nil, model.NewAppError("SqlTeamStore.GetAllTeams", "store.sql_team.get_all.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -549,17 +573,15 @@ func (s SqlTeamStore) GetAll() ([]*model.Team, *model.AppError) { func (s SqlTeamStore) GetAllPage(offset int, limit int) ([]*model.Team, *model.AppError) { var teams []*model.Team - if _, err := s.GetReplica().Select(&teams, - `SELECT - * - FROM - Teams - ORDER BY - DisplayName - LIMIT - :Limit - OFFSET - :Offset`, map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil { + query, args, err := s.teamsQuery. + OrderBy("DisplayName"). + Limit(uint64(limit)). + Offset(uint64(offset)).ToSql() + + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetAllTeams", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + if _, err = s.GetReplica().Select(&teams, query, args...); err != nil { return nil, model.NewAppError("SqlTeamStore.GetAllTeams", "store.sql_team.get_all.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -570,7 +592,15 @@ func (s SqlTeamStore) GetAllPage(offset int, limit int) ([]*model.Team, *model.A // GetTeamsByUserId returns from the database all teams that userId belongs to. func (s SqlTeamStore) GetTeamsByUserId(userId string) ([]*model.Team, *model.AppError) { var teams []*model.Team - if _, err := s.GetReplica().Select(&teams, "SELECT Teams.* FROM Teams, TeamMembers WHERE TeamMembers.TeamId = Teams.Id AND TeamMembers.UserId = :UserId AND TeamMembers.DeleteAt = 0 AND Teams.DeleteAt = 0", map[string]interface{}{"UserId": userId}); err != nil { + query, args, err := s.teamsQuery. + Join("TeamMembers ON TeamMembers.TeamId = Teams.Id"). + Where(sq.Eq{"TeamMembers.UserId": userId, "TeamMembers.DeleteAt": 0, "Teams.DeleteAt": 0}).ToSql() + + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetTeamsByUserId", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + if _, err = s.GetReplica().Select(&teams, query, args...); err != nil { return nil, model.NewAppError("SqlTeamStore.GetTeamsByUserId", "store.sql_team.get_all.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -579,31 +609,31 @@ func (s SqlTeamStore) GetTeamsByUserId(userId string) ([]*model.Team, *model.App // GetAllPrivateTeamListing returns all private teams. func (s SqlTeamStore) GetAllPrivateTeamListing() ([]*model.Team, *model.AppError) { - query := "SELECT * FROM Teams WHERE AllowOpenInvite = 0 ORDER BY DisplayName" - - if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { - query = "SELECT * FROM Teams WHERE AllowOpenInvite = false ORDER BY DisplayName" + query, args, err := s.teamsQuery.Where(sq.Eq{"AllowOpenInvite": false}). + OrderBy("DisplayName").ToSql() + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetAllPrivateTeamListing", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } - var data []*model.Team - if _, err := s.GetReplica().Select(&data, query); err != nil { + if _, err = s.GetReplica().Select(&data, query, args...); err != nil { return nil, model.NewAppError("SqlTeamStore.GetAllPrivateTeamListing", "store.sql_team.get_all_private_team_listing.app_error", nil, err.Error(), http.StatusInternalServerError) } - return data, nil } // GetAllPublicTeamPageListing returns public teams, up to a total limit passed as parameter and paginated by offset number passed as parameter. func (s SqlTeamStore) GetAllPublicTeamPageListing(offset int, limit int) ([]*model.Team, *model.AppError) { - query := "SELECT * FROM Teams WHERE AllowOpenInvite = 1 ORDER BY DisplayName LIMIT :Limit OFFSET :Offset" - - if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { - query = "SELECT * FROM Teams WHERE AllowOpenInvite = true ORDER BY DisplayName LIMIT :Limit OFFSET :Offset" + query, args, err := s.teamsQuery.Where(sq.Eq{"AllowOpenInvite": true}). + OrderBy("DisplayName"). + Limit(uint64(limit)). + Offset(uint64(offset)).ToSql() + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetAllPublicTeamPageListing", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } var data []*model.Team - if _, err := s.GetReplica().Select(&data, query, map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil { - return nil, model.NewAppError("SqlTeamStore.GetAllPrivateTeamListing", "store.sql_team.get_all_private_team_listing.app_error", nil, err.Error(), http.StatusInternalServerError) + if _, err = s.GetReplica().Select(&data, query, args...); err != nil { + return nil, model.NewAppError("SqlTeamStore.GetAllPublicTeamPageListing", "store.sql_team.get_all_private_team_listing.app_error", nil, err.Error(), http.StatusInternalServerError) } return data, nil @@ -611,15 +641,18 @@ func (s SqlTeamStore) GetAllPublicTeamPageListing(offset int, limit int) ([]*mod // GetAllPrivateTeamPageListing returns private teams, up to a total limit passed as paramater and paginated by offset number passed as parameter. func (s SqlTeamStore) GetAllPrivateTeamPageListing(offset int, limit int) ([]*model.Team, *model.AppError) { - query := "SELECT * FROM Teams WHERE AllowOpenInvite = 0 ORDER BY DisplayName LIMIT :Limit OFFSET :Offset" + query, args, err := s.teamsQuery.Where(sq.Eq{"AllowOpenInvite": false}). + OrderBy("DisplayName"). + Limit(uint64(limit)). + Offset(uint64(offset)).ToSql() - if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { - query = "SELECT * FROM Teams WHERE AllowOpenInvite = false ORDER BY DisplayName LIMIT :Limit OFFSET :Offset" + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetAllPrivateTeamPageListing", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } var data []*model.Team - if _, err := s.GetReplica().Select(&data, query, map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil { - return nil, model.NewAppError("SqlTeamStore.GetAllPrivateTeamListing", "store.sql_team.get_all_private_team_listing.app_error", nil, err.Error(), http.StatusInternalServerError) + if _, err = s.GetReplica().Select(&data, query, args...); err != nil { + return nil, model.NewAppError("SqlTeamStore.GetAllPrivateTeamPageListing", "store.sql_team.get_all_private_team_page_listing.app_error", nil, err.Error(), http.StatusInternalServerError) } return data, nil @@ -627,14 +660,15 @@ func (s SqlTeamStore) GetAllPrivateTeamPageListing(offset int, limit int) ([]*mo // GetAllTeamListing returns all public teams. func (s SqlTeamStore) GetAllTeamListing() ([]*model.Team, *model.AppError) { - query := "SELECT * FROM Teams WHERE AllowOpenInvite = 1 ORDER BY DisplayName" + query, args, err := s.teamsQuery.Where(sq.Eq{"AllowOpenInvite": true}). + OrderBy("DisplayName").ToSql() - if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { - query = "SELECT * FROM Teams WHERE AllowOpenInvite = true ORDER BY DisplayName" + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetAllTeamListing", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } var data []*model.Team - if _, err := s.GetReplica().Select(&data, query); err != nil { + if _, err = s.GetReplica().Select(&data, query, args...); err != nil { return nil, model.NewAppError("SqlTeamStore.GetAllTeamListing", "store.sql_team.get_all_team_listing.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -643,15 +677,18 @@ func (s SqlTeamStore) GetAllTeamListing() ([]*model.Team, *model.AppError) { // GetAllTeamPageListing returns public teams, up to a total limit passed as parameter and paginated by offset number passed as parameter. func (s SqlTeamStore) GetAllTeamPageListing(offset int, limit int) ([]*model.Team, *model.AppError) { - query := "SELECT * FROM Teams WHERE AllowOpenInvite = 1 ORDER BY DisplayName LIMIT :Limit OFFSET :Offset" + query, args, err := s.teamsQuery.Where(sq.Eq{"AllowOpenInvite": true}). + OrderBy("DisplayName"). + Limit(uint64(limit)). + Offset(uint64(offset)).ToSql() - if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { - query = "SELECT * FROM Teams WHERE AllowOpenInvite = true ORDER BY DisplayName LIMIT :Limit OFFSET :Offset" + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetAllTeamPageListing", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } var teams []*model.Team - if _, err := s.GetReplica().Select(&teams, query, map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil { - return nil, model.NewAppError("SqlTeamStore.GetAllTeamListing", "store.sql_team.get_all_team_listing.app_error", nil, err.Error(), http.StatusInternalServerError) + if _, err = s.GetReplica().Select(&teams, query, args...); err != nil { + return nil, model.NewAppError("SqlTeamStore.GetAllTeamPageListing", "store.sql_team.get_all_team_listing.app_error", nil, err.Error(), http.StatusInternalServerError) } return teams, nil @@ -660,7 +697,13 @@ func (s SqlTeamStore) GetAllTeamPageListing(offset int, limit int) ([]*model.Tea // PermanentDelete permanently deletes from the database the team entry that matches the teamId passed as parameter. // To soft-delete the team you can Update it with the DeleteAt field set to the current millisecond using model.GetMillis() func (s SqlTeamStore) PermanentDelete(teamId string) *model.AppError { - if _, err := s.GetMaster().Exec("DELETE FROM Teams WHERE Id = :TeamId", map[string]interface{}{"TeamId": teamId}); err != nil { + sql, args, err := s.getQueryBuilder(). + Delete("Teams"). + Where(sq.Eq{"Id": teamId}).ToSql() + if err != nil { + return model.NewAppError("SqlTeamStore.Delete", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + if _, err = s.GetMaster().Exec(sql, args...); err != nil { return model.NewAppError("SqlTeamStore.Delete", "store.sql_team.permanent_delete.app_error", nil, "teamId="+teamId+", "+err.Error(), http.StatusInternalServerError) } return nil @@ -668,13 +711,16 @@ func (s SqlTeamStore) PermanentDelete(teamId string) *model.AppError { // AnalyticsPublicTeamCount returns the number of active public teams. func (s SqlTeamStore) AnalyticsPublicTeamCount() (int64, *model.AppError) { + query, args, err := s.getQueryBuilder(). + Select("COUNT(*) FROM Teams"). + Where(sq.Eq{"DeleteAt": 0, "AllowOpenInvite": true}).ToSql() - c, err := s.GetReplica().SelectInt("SELECT COUNT(*) FROM Teams WHERE DeleteAt = 0 AND AllowOpenInvite = 1", map[string]interface{}{}) - - if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { - c, err = s.GetReplica().SelectInt("SELECT COUNT(*) FROM Teams WHERE DeleteAt = 0 AND AllowOpenInvite = true", map[string]interface{}{}) + if err != nil { + return 0, model.NewAppError("SqlTeamStore.AnalyticsPublicTeamCount", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } + c, err := s.GetReplica().SelectInt(query, args...) + if err != nil { return int64(0), model.NewAppError("SqlTeamStore.AnalyticsPublicTeamCount", "store.sql_team.analytics_public_team_count.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -684,11 +730,14 @@ func (s SqlTeamStore) AnalyticsPublicTeamCount() (int64, *model.AppError) { // AnalyticsPrivateTeamCount returns the number of active private teams. func (s SqlTeamStore) AnalyticsPrivateTeamCount() (int64, *model.AppError) { - c, err := s.GetReplica().SelectInt("SELECT COUNT(*) FROM Teams WHERE DeleteAt = 0 AND AllowOpenInvite = 0", map[string]interface{}{}) + query, args, err := s.getQueryBuilder(). + Select("COUNT(*) FROM Teams"). + Where(sq.Eq{"DeleteAt": 0, "AllowOpenInvite": false}).ToSql() - if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { - c, err = s.GetReplica().SelectInt("SELECT COUNT(*) FROM Teams WHERE DeleteAt = 0 AND AllowOpenInvite = false", map[string]interface{}{}) + if err != nil { + return 0, model.NewAppError("SqlTeamStore.AnalyticsPrivateTeamCount", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } + c, err := s.GetReplica().SelectInt(query, args...) if err != nil { return int64(0), model.NewAppError("SqlTeamStore.AnalyticsPrivateTeamCount", "store.sql_team.analytics_private_team_count.app_error", nil, err.Error(), http.StatusInternalServerError) @@ -706,7 +755,7 @@ func (s SqlTeamStore) AnalyticsTeamCount(includeDeleted bool) (int64, *model.App queryString, args, err := query.ToSql() if err != nil { - return 0, model.NewAppError("SqlTeamStore.AnalyticsTeamCount", "store.sql_team.analytics_team_count.app_error", nil, err.Error(), http.StatusInternalServerError) + return 0, model.NewAppError("SqlTeamStore.AnalyticsTeamCount", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } c, err := s.GetReplica().SelectInt(queryString, args...) @@ -772,7 +821,7 @@ func (s SqlTeamStore) SaveMultipleMembers(members []*model.TeamMember, maxUsersP sqlRolesQuery, argsRoles, err := queryRoles.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.Save", "store.sql_user.save.member_count.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("SqlUserStore.Save", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } var defaultTeamsRoles []struct { Id string @@ -803,7 +852,7 @@ func (s SqlTeamStore) SaveMultipleMembers(members []*model.TeamMember, maxUsersP sqlCountQuery, argsCount, errCount := queryCount.ToSql() if errCount != nil { - return nil, model.NewAppError("SqlUserStore.Save", "store.sql_user.save.member_count.app_error", nil, errCount.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("SqlUserStore.Save", "store.sql.build_query.app_error", nil, errCount.Error(), http.StatusInternalServerError) } var counters []struct { @@ -836,10 +885,10 @@ func (s SqlTeamStore) SaveMultipleMembers(members []*model.TeamMember, maxUsersP sql, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlTeamStore.SaveMember", "store.sql_team.save_member.save.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("SqlTeamStore.SaveMember", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } - if _, err := s.GetMaster().Exec(sql, args...); err != nil { + if _, err = s.GetMaster().Exec(sql, args...); err != nil { if IsUniqueConstraintError(err, []string{"TeamId", "teammembers_pkey", "PRIMARY"}) { return nil, model.NewAppError("SqlTeamStore.SaveMember", TEAM_MEMBER_EXISTS_ERROR, nil, err.Error(), http.StatusBadRequest) } @@ -901,7 +950,7 @@ func (s SqlTeamStore) UpdateMultipleMembers(members []*model.TeamMember) ([]*mod sqlQuery, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.Save", "store.sql_user.save.member_count.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("SqlUserStore.Save", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } var defaultTeamsRoles []struct { Id string @@ -958,7 +1007,7 @@ func (s SqlTeamStore) GetMember(teamId string, userId string) (*model.TeamMember queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlTeamStore.GetMember", "store.sql_team.get_member.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("SqlTeamStore.GetMember", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } var dbMember teamMemberWithSchemeRoles @@ -1002,7 +1051,7 @@ func (s SqlTeamStore) GetMembers(teamId string, offset int, limit int, teamMembe queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlTeamStore.GetMembers", "store.sql_team.get_members.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("SqlTeamStore.GetMembers", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } var dbMembers teamMemberWithSchemeRolesList @@ -1025,7 +1074,7 @@ func (s SqlTeamStore) GetTotalMemberCount(teamId string, restrictions *model.Vie query = applyTeamMemberViewRestrictionsFilterForStats(query, teamId, restrictions) queryString, args, err := query.ToSql() if err != nil { - return int64(0), model.NewAppError("SqlTeamStore.GetTotalMemberCount", "store.sql_team.get_member_count.app_error", nil, err.Error(), http.StatusInternalServerError) + return int64(0), model.NewAppError("SqlTeamStore.GetTotalMemberCount", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } count, err := s.GetReplica().SelectInt(queryString, args...) @@ -1047,7 +1096,7 @@ func (s SqlTeamStore) GetActiveMemberCount(teamId string, restrictions *model.Vi query = applyTeamMemberViewRestrictionsFilterForStats(query, teamId, restrictions) queryString, args, err := query.ToSql() if err != nil { - return 0, model.NewAppError("SqlTeamStore.GetActiveMemberCount", "store.sql_team.get_active_member_count.app_error", nil, err.Error(), http.StatusInternalServerError) + return 0, model.NewAppError("SqlTeamStore.GetActiveMemberCount", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } count, err := s.GetReplica().SelectInt(queryString, args...) @@ -1072,11 +1121,11 @@ func (s SqlTeamStore) GetMembersByIds(teamId string, userIds []string, restricti queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlTeamStore.GetMembersByIds", "store.sql_team.get_members_by_ids.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("SqlTeamStore.GetMembersByIds", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } var dbMembers teamMemberWithSchemeRolesList - if _, err := s.GetReplica().Select(&dbMembers, queryString, args...); err != nil { + if _, err = s.GetReplica().Select(&dbMembers, queryString, args...); err != nil { return nil, model.NewAppError("SqlTeamStore.GetMembersByIds", "store.sql_team.get_members_by_ids.app_error", nil, "teamId="+teamId+" "+err.Error(), http.StatusInternalServerError) } return dbMembers.ToModel(), nil @@ -1088,7 +1137,7 @@ func (s SqlTeamStore) GetTeamsForUser(userId string) ([]*model.TeamMember, *mode queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlTeamStore.GetMembers", "store.sql_team.get_members.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("SqlTeamStore.GetMembers", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } var dbMembers teamMemberWithSchemeRolesList @@ -1108,7 +1157,7 @@ func (s SqlTeamStore) GetTeamsForUserWithPagination(userId string, page, perPage queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlTeamStore.GetTeamsForUserWithPagination", "store.sql_team.get_members.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("SqlTeamStore.GetTeamsForUserWithPagination", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } var dbMembers teamMemberWithSchemeRolesList @@ -1121,18 +1170,18 @@ func (s SqlTeamStore) GetTeamsForUserWithPagination(userId string, page, perPage } func (s SqlTeamStore) GetChannelUnreadsForAllTeams(excludeTeamId, userId string) ([]*model.ChannelUnread, *model.AppError) { + query, args, err := s.getQueryBuilder(). + Select("Channels.TeamId TeamId", "Channels.Id ChannelId", "(Channels.TotalMsgCount - ChannelMembers.MsgCount) MsgCount", "ChannelMembers.MentionCount MentionCount", "ChannelMembers.NotifyProps NotifyProps"). + From("Channels"). + Join("ChannelMembers ON Id = ChannelId"). + Where(sq.Eq{"UserId": userId, "DeleteAt": 0}). + Where(sq.NotEq{"TeamId": excludeTeamId}).ToSql() + + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetChannelUnreadsForAllTeams", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } var data []*model.ChannelUnread - _, err := s.GetReplica().Select(&data, - `SELECT - Channels.TeamId TeamId, Channels.Id ChannelId, (Channels.TotalMsgCount - ChannelMembers.MsgCount) MsgCount, ChannelMembers.MentionCount MentionCount, ChannelMembers.NotifyProps NotifyProps - FROM - Channels, ChannelMembers - WHERE - Id = ChannelId - AND UserId = :UserId - AND DeleteAt = 0 - AND TeamId != :TeamId`, - map[string]interface{}{"UserId": userId, "TeamId": excludeTeamId}) + _, err = s.GetReplica().Select(&data, query, args...) if err != nil { return nil, model.NewAppError("SqlTeamStore.GetChannelUnreadsForAllTeams", "store.sql_team.get_unread.app_error", nil, "userId="+userId+" "+err.Error(), http.StatusInternalServerError) @@ -1142,19 +1191,18 @@ func (s SqlTeamStore) GetChannelUnreadsForAllTeams(excludeTeamId, userId string) } func (s SqlTeamStore) GetChannelUnreadsForTeam(teamId, userId string) ([]*model.ChannelUnread, *model.AppError) { - query := ` - SELECT - Channels.TeamId TeamId, Channels.Id ChannelId, (Channels.TotalMsgCount - ChannelMembers.MsgCount) MsgCount, ChannelMembers.MentionCount MentionCount, ChannelMembers.NotifyProps NotifyProps - FROM - Channels, ChannelMembers - WHERE - Id = ChannelId - AND UserId = :UserId - AND TeamId = :TeamId - AND DeleteAt = 0` + query, args, err := s.getQueryBuilder(). + Select("Channels.TeamId TeamId", "Channels.Id ChannelId", "(Channels.TotalMsgCount - ChannelMembers.MsgCount) MsgCount", "ChannelMembers.MentionCount MentionCount", "ChannelMembers.NotifyProps NotifyProps"). + From("Channels"). + Join("ChannelMembers ON Id = ChannelId"). + Where(sq.Eq{"UserId": userId, "TeamId": teamId, "DeleteAt": 0}).ToSql() + + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetChannelUnreadsForTeam", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } var channels []*model.ChannelUnread - _, err := s.GetReplica().Select(&channels, query, map[string]interface{}{"TeamId": teamId, "UserId": userId}) + _, err = s.GetReplica().Select(&channels, query, args...) if err != nil { return nil, model.NewAppError("SqlTeamStore.GetChannelUnreadsForTeam", "store.sql_team.get_unread.app_error", nil, "teamId="+teamId+" "+err.Error(), http.StatusInternalServerError) @@ -1170,7 +1218,7 @@ func (s SqlTeamStore) RemoveMembers(teamId string, userIds []string) *model.AppE sql, args, err := query.ToSql() if err != nil { - return model.NewAppError("SqlTeamStore.RemoveMembers", "store.sql_team.remove_member.app_error", nil, "team_id="+teamId+", "+err.Error(), http.StatusInternalServerError) + return model.NewAppError("SqlTeamStore.RemoveMembers", "store.sql.build_query.app_error", nil, "team_id="+teamId+", "+err.Error(), http.StatusInternalServerError) } _, err = s.GetMaster().Exec(sql, args...) if err != nil { @@ -1186,7 +1234,14 @@ func (s SqlTeamStore) RemoveMember(teamId string, userId string) *model.AppError // RemoveAllMembersByTeam removes from the database the team members that belong to the teamId passed as parameter. func (s SqlTeamStore) RemoveAllMembersByTeam(teamId string) *model.AppError { - _, err := s.GetMaster().Exec("DELETE FROM TeamMembers WHERE TeamId = :TeamId", map[string]interface{}{"TeamId": teamId}) + sql, args, err := s.getQueryBuilder(). + Delete("TeamMembers"). + Where(sq.Eq{"TeamId": teamId}).ToSql() + if err != nil { + return model.NewAppError("SqlTeamStore.RemoveMembers", "store.sql.build_query.app_error", nil, "team_id="+teamId+", "+err.Error(), http.StatusInternalServerError) + } + + _, err = s.GetMaster().Exec(sql, args...) if err != nil { return model.NewAppError("SqlTeamStore.RemoveMember", "store.sql_team.remove_member.app_error", nil, "team_id="+teamId+", "+err.Error(), http.StatusInternalServerError) } @@ -1195,7 +1250,13 @@ func (s SqlTeamStore) RemoveAllMembersByTeam(teamId string) *model.AppError { // RemoveAllMembersByUser removes from the database the team members that match the userId passed as parameter. func (s SqlTeamStore) RemoveAllMembersByUser(userId string) *model.AppError { - _, err := s.GetMaster().Exec("DELETE FROM TeamMembers WHERE UserId = :UserId", map[string]interface{}{"UserId": userId}) + sql, args, err := s.getQueryBuilder(). + Delete("TeamMembers"). + Where(sq.Eq{"UserId": userId}).ToSql() + if err != nil { + return model.NewAppError("SqlTeamStore.RemoveMembers", "store.sql.build_query.app_error", nil, "team_id="+userId+", "+err.Error(), http.StatusInternalServerError) + } + _, err = s.GetMaster().Exec(sql, args...) if err != nil { return model.NewAppError("SqlTeamStore.RemoveMember", "store.sql_team.remove_member.app_error", nil, "user_id="+userId+", "+err.Error(), http.StatusInternalServerError) } @@ -1203,7 +1264,15 @@ func (s SqlTeamStore) RemoveAllMembersByUser(userId string) *model.AppError { } func (s SqlTeamStore) UpdateLastTeamIconUpdate(teamId string, curTime int64) *model.AppError { - if _, err := s.GetMaster().Exec("UPDATE Teams SET LastTeamIconUpdate = :Time, UpdateAt = :Time WHERE Id = :teamId", map[string]interface{}{"Time": curTime, "teamId": teamId}); err != nil { + sql, args, err := s.getQueryBuilder(). + Update("Teams"). + SetMap(sq.Eq{"LastTeamIconUpdate": curTime, "UpdateAt": curTime}). + Where(sq.Eq{"Id": teamId}).ToSql() + if err != nil { + return model.NewAppError("SqlTeamStore.UpdateLastTeamIconUpdate", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + if _, err = s.GetMaster().Exec(sql, args...); err != nil { return model.NewAppError("SqlTeamStore.UpdateLastTeamIconUpdate", "store.sql_team.update_last_team_icon_update.app_error", nil, "team_id="+teamId, http.StatusInternalServerError) } return nil @@ -1212,8 +1281,17 @@ func (s SqlTeamStore) UpdateLastTeamIconUpdate(teamId string, curTime int64) *mo // GetTeamsByScheme returns from the database all teams that match the schemeId provided as parameter, up to // a total limit passed as paramater and paginated by offset number passed as parameter. func (s SqlTeamStore) GetTeamsByScheme(schemeId string, offset int, limit int) ([]*model.Team, *model.AppError) { + query, args, err := s.teamsQuery.Where(sq.Eq{"SchemeId": schemeId}). + OrderBy("DisplayName"). + Limit(uint64(limit)). + Offset(uint64(offset)).ToSql() + + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetTeamsByScheme", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + var teams []*model.Team - _, err := s.GetReplica().Select(&teams, "SELECT * FROM Teams WHERE SchemeId = :SchemeId ORDER BY DisplayName LIMIT :Limit OFFSET :Offset", map[string]interface{}{"SchemeId": schemeId, "Offset": offset, "Limit": limit}) + _, err = s.GetReplica().Select(&teams, query, args...) if err != nil { return nil, model.NewAppError("SqlTeamStore.GetTeamsByScheme", "store.sql_team.get_by_scheme.app_error", nil, "schemeId="+schemeId+" "+err.Error(), http.StatusInternalServerError) } @@ -1353,7 +1431,15 @@ func (s SqlTeamStore) ClearAllCustomRoleAssignments() *model.AppError { // AnalyticsGetTeamCountForScheme returns the number of active teams that match the schemeId passed as parameter. func (s SqlTeamStore) AnalyticsGetTeamCountForScheme(schemeId string) (int64, *model.AppError) { - count, err := s.GetReplica().SelectInt("SELECT count(*) FROM Teams WHERE SchemeId = :SchemeId AND DeleteAt = 0", map[string]interface{}{"SchemeId": schemeId}) + query, args, err := s.getQueryBuilder(). + Select("count(*)"). + From("Teams"). + Where(sq.Eq{"SchemeId": schemeId, "DeleteAt": 0}).ToSql() + + if err != nil { + return 0, model.NewAppError("SqlTeamStore.AnalyticsGetTeamCountForScheme", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + count, err := s.GetReplica().SelectInt(query, args...) if err != nil { return 0, model.NewAppError("SqlTeamStore.AnalyticsGetTeamCountForScheme", "store.sql_team.analytics_get_team_count_for_scheme.app_error", nil, "schemeId="+schemeId+" "+err.Error(), http.StatusInternalServerError) } @@ -1364,21 +1450,18 @@ func (s SqlTeamStore) AnalyticsGetTeamCountForScheme(schemeId string) (int64, *m // GetAllForExportAfter returns teams for export, up to a total limit passed as paramater where Teams.Id is greater than the afterId passed as parameter. func (s SqlTeamStore) GetAllForExportAfter(limit int, afterId string) ([]*model.TeamForExport, *model.AppError) { var data []*model.TeamForExport - if _, err := s.GetReplica().Select(&data, ` - SELECT - Teams.*, - Schemes.Name as SchemeName - FROM - Teams - LEFT JOIN - Schemes ON Teams.SchemeId = Schemes.Id - WHERE - Teams.Id > :AfterId - ORDER BY - Id - LIMIT - :Limit`, - map[string]interface{}{"AfterId": afterId, "Limit": limit}); err != nil { + query, args, err := s.getQueryBuilder(). + Select("Teams.*", "Schemes.Name as SchemeName"). + From("Teams"). + LeftJoin("Schemes ON Teams.SchemeId = Schemes.Id"). + Where(sq.Gt{"Teams.Id": afterId}). + OrderBy("Id"). + Limit(uint64(limit)).ToSql() + + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetAllTeams", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + if _, err = s.GetReplica().Select(&data, query, args...); err != nil { return nil, model.NewAppError("SqlTeamStore.GetAllTeams", "store.sql_team.get_all.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -1388,18 +1471,16 @@ func (s SqlTeamStore) GetAllForExportAfter(limit int, afterId string) ([]*model. // GetUserTeamIds get the team ids to which the user belongs to. allowFromCache parameter does not have any effect in this Store func (s SqlTeamStore) GetUserTeamIds(userID string, allowFromCache bool) ([]string, *model.AppError) { var teamIds []string - _, err := s.GetReplica().Select(&teamIds, - `SELECT - TeamId - FROM - TeamMembers - INNER JOIN - Teams ON TeamMembers.TeamId = Teams.Id - WHERE - TeamMembers.UserId = :UserId - AND TeamMembers.DeleteAt = 0 - AND Teams.DeleteAt = 0`, - map[string]interface{}{"UserId": userID}) + query, args, err := s.getQueryBuilder(). + Select("TeamId"). + From("TeamMembers"). + Join("Teams ON TeamMembers.TeamId = Teams.Id"). + Where(sq.Eq{"TeamMembers.UserId": userID, "TeamMembers.DeleteAt": 0, "Teams.DeleteAt": 0}).ToSql() + + if err != nil { + return []string{}, model.NewAppError("SqlTeamStore.GetUserTeamIds", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + _, err = s.GetReplica().Select(&teamIds, query, args...) if err != nil { return []string{}, model.NewAppError("SqlTeamStore.GetUserTeamIds", "store.sql_team.get_user_team_ids.app_error", nil, "userID="+userID+" "+err.Error(), http.StatusInternalServerError) } @@ -1409,24 +1490,18 @@ func (s SqlTeamStore) GetUserTeamIds(userID string, allowFromCache bool) ([]stri func (s SqlTeamStore) GetTeamMembersForExport(userId string) ([]*model.TeamMemberForExport, *model.AppError) { var members []*model.TeamMemberForExport - _, err := s.GetReplica().Select(&members, ` - SELECT - TeamMembers.TeamId, - TeamMembers.UserId, - TeamMembers.Roles, - TeamMembers.DeleteAt, - (TeamMembers.SchemeGuest IS NOT NULL AND TeamMembers.SchemeGuest) as SchemeGuest, - TeamMembers.SchemeUser, - TeamMembers.SchemeAdmin, - Teams.Name as TeamName - FROM - TeamMembers - INNER JOIN - Teams ON TeamMembers.TeamId = Teams.Id - WHERE - TeamMembers.UserId = :UserId - AND Teams.DeleteAt = 0`, - map[string]interface{}{"UserId": userId}) + query, args, err := s.getQueryBuilder(). + Select("TeamMembers.TeamId", "TeamMembers.UserId", "TeamMembers.Roles", "TeamMembers.DeleteAt", + "(TeamMembers.SchemeGuest IS NOT NULL AND TeamMembers.SchemeGuest) as SchemeGuest", + "TeamMembers.SchemeUser", "TeamMembers.SchemeAdmin", "Teams.Name as TeamName"). + From("TeamMembers"). + Join("Teams ON TeamMembers.TeamId = Teams.Id"). + Where(sq.Eq{"TeamMembers.UserId": userId, "Teams.DeleteAt": 0}).ToSql() + + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetTeamMembersForExport", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + _, err = s.GetReplica().Select(&members, query, args...) if err != nil { return nil, model.NewAppError("SqlTeamStore.GetTeamMembersForExport", "store.sql_team.get_members.app_error", nil, "userId="+userId+" "+err.Error(), http.StatusInternalServerError) } @@ -1442,7 +1517,7 @@ func (s SqlTeamStore) UserBelongsToTeams(userId string, teamIds []string) (bool, query, params, err := s.getQueryBuilder().Select("Count(*)").From("TeamMembers").Where(idQuery).ToSql() if err != nil { - return false, model.NewAppError("SqlTeamStore.UserBelongsToTeams", "store.sql_team.user_belongs_to_teams.app_error", nil, err.Error(), http.StatusInternalServerError) + return false, model.NewAppError("SqlTeamStore.UserBelongsToTeams", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } c, err := s.GetReplica().SelectInt(query, params...) @@ -1454,21 +1529,15 @@ func (s SqlTeamStore) UserBelongsToTeams(userId string, teamIds []string) (bool, } func (s SqlTeamStore) UpdateMembersRole(teamID string, userIDs []string) *model.AppError { - sql := fmt.Sprintf(` - UPDATE - TeamMembers - SET - SchemeAdmin = CASE WHEN UserId IN ('%s') THEN - TRUE - ELSE - FALSE - END - WHERE - TeamId = :TeamId - AND (SchemeGuest = false OR SchemeGuest IS NULL) - AND DeleteAt = 0`, strings.Join(userIDs, "', '")) - - if _, err := s.GetMaster().Exec(sql, map[string]interface{}{"TeamId": teamID}); err != nil { + sql, args, err := s.getQueryBuilder(). + Update("TeamMembers"). + Set("SchemeAdmin", sq.Case().When(sq.Eq{"UserId": userIDs}, "true").Else("false")). + Where(sq.Eq{"TeamId": teamID, "DeleteAt": 0}). + Where(sq.Or{sq.Eq{"SchemeGuest": false}, sq.Expr("SchemeGuest IS NULL")}).ToSql() + if err != nil { + return model.NewAppError("SqlTeamStore.UpdateMembersRole", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) + } + if _, err = s.GetMaster().Exec(sql, args...); err != nil { return model.NewAppError("SqlTeamStore.UpdateMembersRole", "store.update_error", nil, err.Error(), http.StatusInternalServerError) } @@ -1540,7 +1609,7 @@ func (s SqlTeamStore) GroupSyncedTeamCount() (int64, *model.AppError) { sql, args, err := query.ToSql() if err != nil { - return 0, model.NewAppError("SqlTeamStore.GroupSyncedTeamCount", "store.sql_group.app_error", nil, err.Error(), http.StatusInternalServerError) + return 0, model.NewAppError("SqlTeamStore.GroupSyncedTeamCount", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError) } count, err := s.GetReplica().SelectInt(sql, args...)