github.com/coincircle/mattermost-server@v4.8.1-0.20180321182714-9d701c704416+incompatible/store/sqlstore/team_store.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package sqlstore
     5  
     6  import (
     7  	"database/sql"
     8  	"net/http"
     9  	"strconv"
    10  
    11  	"github.com/mattermost/mattermost-server/model"
    12  	"github.com/mattermost/mattermost-server/store"
    13  )
    14  
    15  const (
    16  	TEAM_MEMBER_EXISTS_ERROR = "store.sql_team.save_member.exists.app_error"
    17  )
    18  
    19  type SqlTeamStore struct {
    20  	SqlStore
    21  }
    22  
    23  func NewSqlTeamStore(sqlStore SqlStore) store.TeamStore {
    24  	s := &SqlTeamStore{sqlStore}
    25  
    26  	for _, db := range sqlStore.GetAllConns() {
    27  		table := db.AddTableWithName(model.Team{}, "Teams").SetKeys(false, "Id")
    28  		table.ColMap("Id").SetMaxSize(26)
    29  		table.ColMap("DisplayName").SetMaxSize(64)
    30  		table.ColMap("Name").SetMaxSize(64).SetUnique(true)
    31  		table.ColMap("Description").SetMaxSize(255)
    32  		table.ColMap("Email").SetMaxSize(128)
    33  		table.ColMap("CompanyName").SetMaxSize(64)
    34  		table.ColMap("AllowedDomains").SetMaxSize(500)
    35  		table.ColMap("InviteId").SetMaxSize(32)
    36  
    37  		tablem := db.AddTableWithName(model.TeamMember{}, "TeamMembers").SetKeys(false, "TeamId", "UserId")
    38  		tablem.ColMap("TeamId").SetMaxSize(26)
    39  		tablem.ColMap("UserId").SetMaxSize(26)
    40  		tablem.ColMap("Roles").SetMaxSize(64)
    41  	}
    42  
    43  	return s
    44  }
    45  
    46  func (s SqlTeamStore) CreateIndexesIfNotExists() {
    47  	s.CreateIndexIfNotExists("idx_teams_name", "Teams", "Name")
    48  	s.RemoveIndexIfExists("idx_teams_description", "Teams")
    49  	s.CreateIndexIfNotExists("idx_teams_invite_id", "Teams", "InviteId")
    50  	s.CreateIndexIfNotExists("idx_teams_update_at", "Teams", "UpdateAt")
    51  	s.CreateIndexIfNotExists("idx_teams_create_at", "Teams", "CreateAt")
    52  	s.CreateIndexIfNotExists("idx_teams_delete_at", "Teams", "DeleteAt")
    53  
    54  	s.CreateIndexIfNotExists("idx_teammembers_team_id", "TeamMembers", "TeamId")
    55  	s.CreateIndexIfNotExists("idx_teammembers_user_id", "TeamMembers", "UserId")
    56  	s.CreateIndexIfNotExists("idx_teammembers_delete_at", "TeamMembers", "DeleteAt")
    57  }
    58  
    59  func (s SqlTeamStore) Save(team *model.Team) store.StoreChannel {
    60  	return store.Do(func(result *store.StoreResult) {
    61  		if len(team.Id) > 0 {
    62  			result.Err = model.NewAppError("SqlTeamStore.Save",
    63  				"store.sql_team.save.existing.app_error", nil, "id="+team.Id, http.StatusBadRequest)
    64  			return
    65  		}
    66  
    67  		team.PreSave()
    68  
    69  		if result.Err = team.IsValid(); result.Err != nil {
    70  			return
    71  		}
    72  
    73  		if err := s.GetMaster().Insert(team); err != nil {
    74  			if IsUniqueConstraintError(err, []string{"Name", "teams_name_key"}) {
    75  				result.Err = model.NewAppError("SqlTeamStore.Save", "store.sql_team.save.domain_exists.app_error", nil, "id="+team.Id+", "+err.Error(), http.StatusBadRequest)
    76  			} else {
    77  				result.Err = model.NewAppError("SqlTeamStore.Save", "store.sql_team.save.app_error", nil, "id="+team.Id+", "+err.Error(), http.StatusInternalServerError)
    78  			}
    79  		} else {
    80  			result.Data = team
    81  		}
    82  	})
    83  }
    84  
    85  func (s SqlTeamStore) Update(team *model.Team) store.StoreChannel {
    86  	return store.Do(func(result *store.StoreResult) {
    87  		team.PreUpdate()
    88  
    89  		if result.Err = team.IsValid(); result.Err != nil {
    90  			return
    91  		}
    92  
    93  		if oldResult, err := s.GetMaster().Get(model.Team{}, team.Id); err != nil {
    94  			result.Err = model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.finding.app_error", nil, "id="+team.Id+", "+err.Error(), http.StatusInternalServerError)
    95  		} else if oldResult == nil {
    96  			result.Err = model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.find.app_error", nil, "id="+team.Id, http.StatusBadRequest)
    97  		} else {
    98  			oldTeam := oldResult.(*model.Team)
    99  			team.CreateAt = oldTeam.CreateAt
   100  			team.UpdateAt = model.GetMillis()
   101  			team.Name = oldTeam.Name
   102  			team.LastTeamIconUpdate = oldTeam.LastTeamIconUpdate
   103  
   104  			if count, err := s.GetMaster().Update(team); err != nil {
   105  				result.Err = model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.updating.app_error", nil, "id="+team.Id+", "+err.Error(), http.StatusInternalServerError)
   106  			} else if count != 1 {
   107  				result.Err = model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.app_error", nil, "id="+team.Id, http.StatusInternalServerError)
   108  			} else {
   109  				result.Data = team
   110  			}
   111  		}
   112  	})
   113  }
   114  
   115  func (s SqlTeamStore) UpdateDisplayName(name string, teamId string) store.StoreChannel {
   116  	return store.Do(func(result *store.StoreResult) {
   117  		if _, err := s.GetMaster().Exec("UPDATE Teams SET DisplayName = :Name WHERE Id = :Id", map[string]interface{}{"Name": name, "Id": teamId}); err != nil {
   118  			result.Err = model.NewAppError("SqlTeamStore.UpdateName", "store.sql_team.update_display_name.app_error", nil, "team_id="+teamId, http.StatusInternalServerError)
   119  		} else {
   120  			result.Data = teamId
   121  		}
   122  	})
   123  }
   124  
   125  func (s SqlTeamStore) Get(id string) store.StoreChannel {
   126  	return store.Do(func(result *store.StoreResult) {
   127  		if obj, err := s.GetReplica().Get(model.Team{}, id); err != nil {
   128  			result.Err = model.NewAppError("SqlTeamStore.Get", "store.sql_team.get.finding.app_error", nil, "id="+id+", "+err.Error(), http.StatusInternalServerError)
   129  		} else if obj == nil {
   130  			result.Err = model.NewAppError("SqlTeamStore.Get", "store.sql_team.get.find.app_error", nil, "id="+id, http.StatusNotFound)
   131  		} else {
   132  			team := obj.(*model.Team)
   133  			if len(team.InviteId) == 0 {
   134  				team.InviteId = team.Id
   135  			}
   136  
   137  			result.Data = team
   138  		}
   139  	})
   140  }
   141  
   142  func (s SqlTeamStore) GetByInviteId(inviteId string) store.StoreChannel {
   143  	return store.Do(func(result *store.StoreResult) {
   144  		team := model.Team{}
   145  
   146  		if err := s.GetReplica().SelectOne(&team, "SELECT * FROM Teams WHERE Id = :InviteId OR InviteId = :InviteId", map[string]interface{}{"InviteId": inviteId}); err != nil {
   147  			result.Err = model.NewAppError("SqlTeamStore.GetByInviteId", "store.sql_team.get_by_invite_id.finding.app_error", nil, "inviteId="+inviteId+", "+err.Error(), http.StatusNotFound)
   148  		}
   149  
   150  		if len(team.InviteId) == 0 {
   151  			team.InviteId = team.Id
   152  		}
   153  
   154  		if len(inviteId) == 0 || team.InviteId != inviteId {
   155  			result.Err = model.NewAppError("SqlTeamStore.GetByInviteId", "store.sql_team.get_by_invite_id.find.app_error", nil, "inviteId="+inviteId, http.StatusNotFound)
   156  		}
   157  
   158  		result.Data = &team
   159  	})
   160  }
   161  
   162  func (s SqlTeamStore) GetByName(name string) store.StoreChannel {
   163  	return store.Do(func(result *store.StoreResult) {
   164  		team := model.Team{}
   165  
   166  		if err := s.GetReplica().SelectOne(&team, "SELECT * FROM Teams WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
   167  			result.Err = model.NewAppError("SqlTeamStore.GetByName", "store.sql_team.get_by_name.app_error", nil, "name="+name+", "+err.Error(), http.StatusInternalServerError)
   168  		}
   169  
   170  		if len(team.InviteId) == 0 {
   171  			team.InviteId = team.Id
   172  		}
   173  
   174  		result.Data = &team
   175  	})
   176  }
   177  
   178  func (s SqlTeamStore) SearchByName(name string) store.StoreChannel {
   179  	return store.Do(func(result *store.StoreResult) {
   180  		var teams []*model.Team
   181  
   182  		if _, err := s.GetReplica().Select(&teams, "SELECT * FROM Teams WHERE Name LIKE :Name", map[string]interface{}{"Name": name + "%"}); err != nil {
   183  			result.Err = model.NewAppError("SqlTeamStore.SearchByName", "store.sql_team.get_by_name.app_error", nil, "name="+name+", "+err.Error(), http.StatusInternalServerError)
   184  		}
   185  
   186  		result.Data = teams
   187  	})
   188  }
   189  
   190  func (s SqlTeamStore) SearchAll(term string) store.StoreChannel {
   191  	return store.Do(func(result *store.StoreResult) {
   192  		var teams []*model.Team
   193  
   194  		if _, err := s.GetReplica().Select(&teams, "SELECT * FROM Teams WHERE Name LIKE :Term OR DisplayName LIKE :Term", map[string]interface{}{"Term": term + "%"}); err != nil {
   195  			result.Err = model.NewAppError("SqlTeamStore.SearchAll", "store.sql_team.search_all_team.app_error", nil, "term="+term+", "+err.Error(), http.StatusInternalServerError)
   196  		}
   197  
   198  		result.Data = teams
   199  	})
   200  }
   201  
   202  func (s SqlTeamStore) SearchOpen(term string) store.StoreChannel {
   203  	return store.Do(func(result *store.StoreResult) {
   204  		var teams []*model.Team
   205  
   206  		if _, err := s.GetReplica().Select(&teams, "SELECT * FROM Teams WHERE Type = 'O' AND AllowOpenInvite = true AND (Name LIKE :Term OR DisplayName LIKE :Term)", map[string]interface{}{"Term": term + "%"}); err != nil {
   207  			result.Err = model.NewAppError("SqlTeamStore.SearchOpen", "store.sql_team.search_open_team.app_error", nil, "term="+term+", "+err.Error(), http.StatusInternalServerError)
   208  		}
   209  
   210  		result.Data = teams
   211  	})
   212  }
   213  
   214  func (s SqlTeamStore) GetAll() store.StoreChannel {
   215  	return store.Do(func(result *store.StoreResult) {
   216  		var data []*model.Team
   217  		if _, err := s.GetReplica().Select(&data, "SELECT * FROM Teams"); err != nil {
   218  			result.Err = model.NewAppError("SqlTeamStore.GetAllTeams", "store.sql_team.get_all.app_error", nil, err.Error(), http.StatusInternalServerError)
   219  		}
   220  
   221  		for _, team := range data {
   222  			if len(team.InviteId) == 0 {
   223  				team.InviteId = team.Id
   224  			}
   225  		}
   226  
   227  		result.Data = data
   228  	})
   229  }
   230  
   231  func (s SqlTeamStore) GetAllPage(offset int, limit int) store.StoreChannel {
   232  	return store.Do(func(result *store.StoreResult) {
   233  		var data []*model.Team
   234  		if _, err := s.GetReplica().Select(&data, "SELECT * FROM Teams LIMIT :Limit OFFSET :Offset", map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil {
   235  			result.Err = model.NewAppError("SqlTeamStore.GetAllTeams", "store.sql_team.get_all.app_error", nil, err.Error(), http.StatusInternalServerError)
   236  		}
   237  
   238  		for _, team := range data {
   239  			if len(team.InviteId) == 0 {
   240  				team.InviteId = team.Id
   241  			}
   242  		}
   243  
   244  		result.Data = data
   245  	})
   246  }
   247  
   248  func (s SqlTeamStore) GetTeamsByUserId(userId string) store.StoreChannel {
   249  	return store.Do(func(result *store.StoreResult) {
   250  		var data []*model.Team
   251  		if _, err := s.GetReplica().Select(&data, "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 {
   252  			result.Err = model.NewAppError("SqlTeamStore.GetTeamsByUserId", "store.sql_team.get_all.app_error", nil, err.Error(), http.StatusInternalServerError)
   253  		}
   254  
   255  		for _, team := range data {
   256  			if len(team.InviteId) == 0 {
   257  				team.InviteId = team.Id
   258  			}
   259  		}
   260  
   261  		result.Data = data
   262  	})
   263  }
   264  
   265  func (s SqlTeamStore) GetAllTeamListing() store.StoreChannel {
   266  	return store.Do(func(result *store.StoreResult) {
   267  		query := "SELECT * FROM Teams WHERE AllowOpenInvite = 1"
   268  
   269  		if s.DriverName() == model.DATABASE_DRIVER_POSTGRES {
   270  			query = "SELECT * FROM Teams WHERE AllowOpenInvite = true"
   271  		}
   272  
   273  		var data []*model.Team
   274  		if _, err := s.GetReplica().Select(&data, query); err != nil {
   275  			result.Err = model.NewAppError("SqlTeamStore.GetAllTeamListing", "store.sql_team.get_all_team_listing.app_error", nil, err.Error(), http.StatusInternalServerError)
   276  		}
   277  
   278  		for _, team := range data {
   279  			if len(team.InviteId) == 0 {
   280  				team.InviteId = team.Id
   281  			}
   282  		}
   283  
   284  		result.Data = data
   285  	})
   286  }
   287  
   288  func (s SqlTeamStore) GetAllTeamPageListing(offset int, limit int) store.StoreChannel {
   289  	return store.Do(func(result *store.StoreResult) {
   290  		query := "SELECT * FROM Teams WHERE AllowOpenInvite = 1 LIMIT :Limit OFFSET :Offset"
   291  
   292  		if s.DriverName() == model.DATABASE_DRIVER_POSTGRES {
   293  			query = "SELECT * FROM Teams WHERE AllowOpenInvite = true LIMIT :Limit OFFSET :Offset"
   294  		}
   295  
   296  		var data []*model.Team
   297  		if _, err := s.GetReplica().Select(&data, query, map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil {
   298  			result.Err = model.NewAppError("SqlTeamStore.GetAllTeamListing", "store.sql_team.get_all_team_listing.app_error", nil, err.Error(), http.StatusInternalServerError)
   299  		}
   300  
   301  		for _, team := range data {
   302  			if len(team.InviteId) == 0 {
   303  				team.InviteId = team.Id
   304  			}
   305  		}
   306  
   307  		result.Data = data
   308  	})
   309  }
   310  
   311  func (s SqlTeamStore) PermanentDelete(teamId string) store.StoreChannel {
   312  	return store.Do(func(result *store.StoreResult) {
   313  		if _, err := s.GetMaster().Exec("DELETE FROM Teams WHERE Id = :TeamId", map[string]interface{}{"TeamId": teamId}); err != nil {
   314  			result.Err = model.NewAppError("SqlTeamStore.Delete", "store.sql_team.permanent_delete.app_error", nil, "teamId="+teamId+", "+err.Error(), http.StatusInternalServerError)
   315  		}
   316  	})
   317  }
   318  
   319  func (s SqlTeamStore) AnalyticsTeamCount() store.StoreChannel {
   320  	return store.Do(func(result *store.StoreResult) {
   321  		if c, err := s.GetReplica().SelectInt("SELECT COUNT(*) FROM Teams WHERE DeleteAt = 0", map[string]interface{}{}); err != nil {
   322  			result.Err = model.NewAppError("SqlTeamStore.AnalyticsTeamCount", "store.sql_team.analytics_team_count.app_error", nil, err.Error(), http.StatusInternalServerError)
   323  		} else {
   324  			result.Data = c
   325  		}
   326  	})
   327  }
   328  
   329  func (s SqlTeamStore) SaveMember(member *model.TeamMember, maxUsersPerTeam int) store.StoreChannel {
   330  	return store.Do(func(result *store.StoreResult) {
   331  		if result.Err = member.IsValid(); result.Err != nil {
   332  			return
   333  		}
   334  
   335  		if maxUsersPerTeam >= 0 {
   336  			if count, err := s.GetMaster().SelectInt(
   337  				`SELECT
   338  					COUNT(0)
   339  				FROM
   340  					TeamMembers
   341  				INNER JOIN
   342  					Users
   343  				ON
   344  					TeamMembers.UserId = Users.Id
   345  				WHERE
   346  					TeamId = :TeamId
   347  					AND TeamMembers.DeleteAt = 0
   348  					AND Users.DeleteAt = 0`, map[string]interface{}{"TeamId": member.TeamId}); err != nil {
   349  				result.Err = model.NewAppError("SqlUserStore.Save", "store.sql_user.save.member_count.app_error", nil, "teamId="+member.TeamId+", "+err.Error(), http.StatusInternalServerError)
   350  				return
   351  			} else if count >= int64(maxUsersPerTeam) {
   352  				result.Err = model.NewAppError("SqlUserStore.Save", "store.sql_user.save.max_accounts.app_error", nil, "teamId="+member.TeamId, http.StatusBadRequest)
   353  				return
   354  			}
   355  		}
   356  
   357  		if err := s.GetMaster().Insert(member); err != nil {
   358  			if IsUniqueConstraintError(err, []string{"TeamId", "teammembers_pkey", "PRIMARY"}) {
   359  				result.Err = model.NewAppError("SqlTeamStore.SaveMember", TEAM_MEMBER_EXISTS_ERROR, nil, "team_id="+member.TeamId+", user_id="+member.UserId+", "+err.Error(), http.StatusBadRequest)
   360  			} else {
   361  				result.Err = model.NewAppError("SqlTeamStore.SaveMember", "store.sql_team.save_member.save.app_error", nil, "team_id="+member.TeamId+", user_id="+member.UserId+", "+err.Error(), http.StatusInternalServerError)
   362  			}
   363  		} else {
   364  			result.Data = member
   365  		}
   366  	})
   367  }
   368  
   369  func (s SqlTeamStore) UpdateMember(member *model.TeamMember) store.StoreChannel {
   370  	return store.Do(func(result *store.StoreResult) {
   371  		member.PreUpdate()
   372  
   373  		if result.Err = member.IsValid(); result.Err != nil {
   374  			return
   375  		}
   376  
   377  		if _, err := s.GetMaster().Update(member); err != nil {
   378  			result.Err = model.NewAppError("SqlTeamStore.UpdateMember", "store.sql_team.save_member.save.app_error", nil, err.Error(), http.StatusInternalServerError)
   379  		} else {
   380  			result.Data = member
   381  		}
   382  	})
   383  }
   384  
   385  func (s SqlTeamStore) GetMember(teamId string, userId string) store.StoreChannel {
   386  	return store.Do(func(result *store.StoreResult) {
   387  		var member model.TeamMember
   388  		err := s.GetReplica().SelectOne(&member, "SELECT * FROM TeamMembers WHERE TeamId = :TeamId AND UserId = :UserId", map[string]interface{}{"TeamId": teamId, "UserId": userId})
   389  		if err != nil {
   390  			if err == sql.ErrNoRows {
   391  				result.Err = model.NewAppError("SqlTeamStore.GetMember", "store.sql_team.get_member.missing.app_error", nil, "teamId="+teamId+" userId="+userId+" "+err.Error(), http.StatusNotFound)
   392  			} else {
   393  				result.Err = model.NewAppError("SqlTeamStore.GetMember", "store.sql_team.get_member.app_error", nil, "teamId="+teamId+" userId="+userId+" "+err.Error(), http.StatusInternalServerError)
   394  			}
   395  		} else {
   396  			result.Data = &member
   397  		}
   398  	})
   399  }
   400  
   401  func (s SqlTeamStore) GetMembers(teamId string, offset int, limit int) store.StoreChannel {
   402  	return store.Do(func(result *store.StoreResult) {
   403  		var members []*model.TeamMember
   404  		_, err := s.GetReplica().Select(&members, "SELECT * FROM TeamMembers WHERE TeamId = :TeamId AND DeleteAt = 0 LIMIT :Limit OFFSET :Offset", map[string]interface{}{"TeamId": teamId, "Offset": offset, "Limit": limit})
   405  		if err != nil {
   406  			result.Err = model.NewAppError("SqlTeamStore.GetMembers", "store.sql_team.get_members.app_error", nil, "teamId="+teamId+" "+err.Error(), http.StatusInternalServerError)
   407  		} else {
   408  			result.Data = members
   409  		}
   410  	})
   411  }
   412  
   413  func (s SqlTeamStore) GetTotalMemberCount(teamId string) store.StoreChannel {
   414  	return store.Do(func(result *store.StoreResult) {
   415  		count, err := s.GetReplica().SelectInt(`
   416  			SELECT
   417  				count(*)
   418  			FROM
   419  				TeamMembers,
   420  				Users
   421  			WHERE
   422  				TeamMembers.UserId = Users.Id
   423  				AND TeamMembers.TeamId = :TeamId
   424  				AND TeamMembers.DeleteAt = 0`, map[string]interface{}{"TeamId": teamId})
   425  		if err != nil {
   426  			result.Err = model.NewAppError("SqlTeamStore.GetTotalMemberCount", "store.sql_team.get_member_count.app_error", nil, "teamId="+teamId+" "+err.Error(), http.StatusInternalServerError)
   427  		} else {
   428  			result.Data = count
   429  		}
   430  	})
   431  }
   432  
   433  func (s SqlTeamStore) GetActiveMemberCount(teamId string) store.StoreChannel {
   434  	return store.Do(func(result *store.StoreResult) {
   435  		count, err := s.GetReplica().SelectInt(`
   436  			SELECT
   437  				count(*)
   438  			FROM
   439  				TeamMembers,
   440  				Users
   441  			WHERE
   442  				TeamMembers.UserId = Users.Id
   443  				AND TeamMembers.TeamId = :TeamId
   444  				AND TeamMembers.DeleteAt = 0
   445  				AND Users.DeleteAt = 0`, map[string]interface{}{"TeamId": teamId})
   446  		if err != nil {
   447  			result.Err = model.NewAppError("SqlTeamStore.GetActiveMemberCount", "store.sql_team.get_member_count.app_error", nil, "teamId="+teamId+" "+err.Error(), http.StatusInternalServerError)
   448  		} else {
   449  			result.Data = count
   450  		}
   451  	})
   452  }
   453  
   454  func (s SqlTeamStore) GetMembersByIds(teamId string, userIds []string) store.StoreChannel {
   455  	return store.Do(func(result *store.StoreResult) {
   456  		var members []*model.TeamMember
   457  		props := make(map[string]interface{})
   458  		idQuery := ""
   459  
   460  		for index, userId := range userIds {
   461  			if len(idQuery) > 0 {
   462  				idQuery += ", "
   463  			}
   464  
   465  			props["userId"+strconv.Itoa(index)] = userId
   466  			idQuery += ":userId" + strconv.Itoa(index)
   467  		}
   468  
   469  		props["TeamId"] = teamId
   470  
   471  		if _, err := s.GetReplica().Select(&members, "SELECT * FROM TeamMembers WHERE TeamId = :TeamId AND UserId IN ("+idQuery+") AND DeleteAt = 0", props); err != nil {
   472  			result.Err = model.NewAppError("SqlTeamStore.GetMembersByIds", "store.sql_team.get_members_by_ids.app_error", nil, "teamId="+teamId+" "+err.Error(), http.StatusInternalServerError)
   473  		} else {
   474  			result.Data = members
   475  		}
   476  	})
   477  }
   478  
   479  func (s SqlTeamStore) GetTeamsForUser(userId string) store.StoreChannel {
   480  	return store.Do(func(result *store.StoreResult) {
   481  		var members []*model.TeamMember
   482  		_, err := s.GetReplica().Select(&members, "SELECT * FROM TeamMembers WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
   483  		if err != nil {
   484  			result.Err = model.NewAppError("SqlTeamStore.GetMembers", "store.sql_team.get_members.app_error", nil, "userId="+userId+" "+err.Error(), http.StatusInternalServerError)
   485  		} else {
   486  			result.Data = members
   487  		}
   488  	})
   489  }
   490  
   491  func (s SqlTeamStore) GetChannelUnreadsForAllTeams(excludeTeamId, userId string) store.StoreChannel {
   492  	return store.Do(func(result *store.StoreResult) {
   493  		var data []*model.ChannelUnread
   494  		_, err := s.GetReplica().Select(&data,
   495  			`SELECT
   496  				Channels.TeamId TeamId, Channels.Id ChannelId, (Channels.TotalMsgCount - ChannelMembers.MsgCount) MsgCount, ChannelMembers.MentionCount MentionCount, ChannelMembers.NotifyProps NotifyProps
   497  			FROM
   498  				Channels, ChannelMembers
   499  			WHERE
   500  				Id = ChannelId
   501                  AND UserId = :UserId
   502                  AND DeleteAt = 0
   503                  AND TeamId != :TeamId`,
   504  			map[string]interface{}{"UserId": userId, "TeamId": excludeTeamId})
   505  
   506  		if err != nil {
   507  			result.Err = model.NewAppError("SqlTeamStore.GetChannelUnreadsForAllTeams", "store.sql_team.get_unread.app_error", nil, "userId="+userId+" "+err.Error(), http.StatusInternalServerError)
   508  		} else {
   509  			result.Data = data
   510  		}
   511  	})
   512  }
   513  
   514  func (s SqlTeamStore) GetChannelUnreadsForTeam(teamId, userId string) store.StoreChannel {
   515  	return store.Do(func(result *store.StoreResult) {
   516  		var data []*model.ChannelUnread
   517  		_, err := s.GetReplica().Select(&data,
   518  			`SELECT
   519  				Channels.TeamId TeamId, Channels.Id ChannelId, (Channels.TotalMsgCount - ChannelMembers.MsgCount) MsgCount, ChannelMembers.MentionCount MentionCount, ChannelMembers.NotifyProps NotifyProps
   520  			FROM
   521  				Channels, ChannelMembers
   522  			WHERE
   523  				Id = ChannelId
   524                  AND UserId = :UserId
   525                  AND TeamId = :TeamId
   526                  AND DeleteAt = 0`,
   527  			map[string]interface{}{"TeamId": teamId, "UserId": userId})
   528  
   529  		if err != nil {
   530  			result.Err = model.NewAppError("SqlTeamStore.GetChannelUnreadsForTeam", "store.sql_team.get_unread.app_error", nil, "teamId="+teamId+" "+err.Error(), http.StatusInternalServerError)
   531  		} else {
   532  			result.Data = data
   533  		}
   534  	})
   535  }
   536  
   537  func (s SqlTeamStore) RemoveMember(teamId string, userId string) store.StoreChannel {
   538  	return store.Do(func(result *store.StoreResult) {
   539  		_, err := s.GetMaster().Exec("DELETE FROM TeamMembers WHERE TeamId = :TeamId AND UserId = :UserId", map[string]interface{}{"TeamId": teamId, "UserId": userId})
   540  		if err != nil {
   541  			result.Err = model.NewAppError("SqlChannelStore.RemoveMember", "store.sql_team.remove_member.app_error", nil, "team_id="+teamId+", user_id="+userId+", "+err.Error(), http.StatusInternalServerError)
   542  		}
   543  	})
   544  }
   545  
   546  func (s SqlTeamStore) RemoveAllMembersByTeam(teamId string) store.StoreChannel {
   547  	return store.Do(func(result *store.StoreResult) {
   548  		_, err := s.GetMaster().Exec("DELETE FROM TeamMembers WHERE TeamId = :TeamId", map[string]interface{}{"TeamId": teamId})
   549  		if err != nil {
   550  			result.Err = model.NewAppError("SqlChannelStore.RemoveMember", "store.sql_team.remove_member.app_error", nil, "team_id="+teamId+", "+err.Error(), http.StatusInternalServerError)
   551  		}
   552  	})
   553  }
   554  
   555  func (s SqlTeamStore) RemoveAllMembersByUser(userId string) store.StoreChannel {
   556  	return store.Do(func(result *store.StoreResult) {
   557  		_, err := s.GetMaster().Exec("DELETE FROM TeamMembers WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
   558  		if err != nil {
   559  			result.Err = model.NewAppError("SqlChannelStore.RemoveMember", "store.sql_team.remove_member.app_error", nil, "user_id="+userId+", "+err.Error(), http.StatusInternalServerError)
   560  		}
   561  	})
   562  }
   563  
   564  func (us SqlTeamStore) UpdateLastTeamIconUpdate(teamId string, curTime int64) store.StoreChannel {
   565  	return store.Do(func(result *store.StoreResult) {
   566  		if _, err := us.GetMaster().Exec("UPDATE Teams SET LastTeamIconUpdate = :Time, UpdateAt = :Time WHERE Id = :teamId", map[string]interface{}{"Time": curTime, "teamId": teamId}); err != nil {
   567  			result.Err = model.NewAppError("SqlTeamStore.UpdateLastTeamIconUpdate", "store.sql_team.update_last_team_icon_update.app_error", nil, "team_id="+teamId, http.StatusInternalServerError)
   568  		} else {
   569  			result.Data = teamId
   570  		}
   571  	})
   572  }