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 }