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