2017-04-12 08:27:57 -04:00
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2015-06-14 23:53:32 -08:00
// See License.txt for license information.
2017-09-25 09:11:25 -05:00
package sqlstore
2015-06-14 23:53:32 -08:00
import (
2016-06-04 10:52:25 -04:00
"database/sql"
2017-01-31 07:59:36 -05:00
"net/http"
2016-10-19 14:49:25 -04:00
"strconv"
2016-06-04 10:52:25 -04:00
2017-09-06 23:05:10 -07:00
"github.com/mattermost/mattermost-server/model"
2017-09-25 09:11:25 -05:00
"github.com/mattermost/mattermost-server/store"
2017-09-06 23:05:10 -07:00
"github.com/mattermost/mattermost-server/utils"
2015-06-14 23:53:32 -08:00
)
2016-06-07 17:43:06 -04:00
const (
TEAM_MEMBER_EXISTS_ERROR = "store.sql_team.save_member.exists.app_error"
)
2015-06-14 23:53:32 -08:00
type SqlTeamStore struct {
2017-06-27 08:02:08 -07:00
SqlStore
2015-06-14 23:53:32 -08:00
}
2017-09-25 09:11:25 -05:00
func NewSqlTeamStore ( sqlStore SqlStore ) store . TeamStore {
2015-06-14 23:53:32 -08:00
s := & SqlTeamStore { sqlStore }
for _ , db := range sqlStore . GetAllConns ( ) {
table := db . AddTableWithName ( model . Team { } , "Teams" ) . SetKeys ( false , "Id" )
table . ColMap ( "Id" ) . SetMaxSize ( 26 )
2015-07-08 11:50:10 -04:00
table . ColMap ( "DisplayName" ) . SetMaxSize ( 64 )
table . ColMap ( "Name" ) . SetMaxSize ( 64 ) . SetUnique ( true )
2016-12-01 23:23:28 +01:00
table . ColMap ( "Description" ) . SetMaxSize ( 255 )
2015-06-14 23:53:32 -08:00
table . ColMap ( "Email" ) . SetMaxSize ( 128 )
table . ColMap ( "CompanyName" ) . SetMaxSize ( 64 )
table . ColMap ( "AllowedDomains" ) . SetMaxSize ( 500 )
2015-10-27 22:18:52 -07:00
table . ColMap ( "InviteId" ) . SetMaxSize ( 32 )
2016-04-21 22:37:01 -07:00
tablem := db . AddTableWithName ( model . TeamMember { } , "TeamMembers" ) . SetKeys ( false , "TeamId" , "UserId" )
tablem . ColMap ( "TeamId" ) . SetMaxSize ( 26 )
tablem . ColMap ( "UserId" ) . SetMaxSize ( 26 )
tablem . ColMap ( "Roles" ) . SetMaxSize ( 64 )
2015-06-14 23:53:32 -08:00
}
return s
}
func ( s SqlTeamStore ) CreateIndexesIfNotExists ( ) {
2015-07-21 12:52:38 -08:00
s . CreateIndexIfNotExists ( "idx_teams_name" , "Teams" , "Name" )
2017-01-18 08:50:01 -05:00
s . RemoveIndexIfExists ( "idx_teams_description" , "Teams" )
2015-10-27 22:18:52 -07:00
s . CreateIndexIfNotExists ( "idx_teams_invite_id" , "Teams" , "InviteId" )
2016-10-24 17:05:27 -03:00
s . CreateIndexIfNotExists ( "idx_teams_update_at" , "Teams" , "UpdateAt" )
s . CreateIndexIfNotExists ( "idx_teams_create_at" , "Teams" , "CreateAt" )
s . CreateIndexIfNotExists ( "idx_teams_delete_at" , "Teams" , "DeleteAt" )
2016-04-21 22:37:01 -07:00
s . CreateIndexIfNotExists ( "idx_teammembers_team_id" , "TeamMembers" , "TeamId" )
s . CreateIndexIfNotExists ( "idx_teammembers_user_id" , "TeamMembers" , "UserId" )
2016-10-24 17:05:27 -03:00
s . CreateIndexIfNotExists ( "idx_teammembers_delete_at" , "TeamMembers" , "DeleteAt" )
2015-06-14 23:53:32 -08:00
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) Save ( team * model . Team ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2015-06-14 23:53:32 -08:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2015-06-14 23:53:32 -08:00
if len ( team . Id ) > 0 {
2017-01-31 07:59:36 -05:00
result . Err = model . NewAppError ( "SqlTeamStore.Save" ,
"store.sql_team.save.existing.app_error" , nil , "id=" + team . Id , http . StatusBadRequest )
2015-06-14 23:53:32 -08:00
storeChannel <- result
close ( storeChannel )
return
}
team . PreSave ( )
2015-09-04 11:59:10 -07:00
2016-10-21 17:19:28 -07:00
if result . Err = team . IsValid ( ) ; result . Err != nil {
2015-09-04 16:56:18 -07:00
storeChannel <- result
close ( storeChannel )
return
2015-06-14 23:53:32 -08:00
}
if err := s . GetMaster ( ) . Insert ( team ) ; err != nil {
2017-09-06 14:00:56 -04:00
if IsUniqueConstraintError ( err , [ ] string { "Name" , "teams_name_key" } ) {
2017-01-31 07:59:36 -05:00
result . Err = model . NewAppError ( "SqlTeamStore.Save" , "store.sql_team.save.domain_exists.app_error" , nil , "id=" + team . Id + ", " + err . Error ( ) , http . StatusBadRequest )
2015-06-14 23:53:32 -08:00
} else {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.Save" , "store.sql_team.save.app_error" , nil , "id=" + team . Id + ", " + err . Error ( ) , http . StatusInternalServerError )
2015-06-14 23:53:32 -08:00
}
} else {
result . Data = team
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) Update ( team * model . Team ) store . StoreChannel {
2015-06-14 23:53:32 -08:00
2017-09-25 09:11:25 -05:00
storeChannel := make ( store . StoreChannel , 1 )
2015-06-14 23:53:32 -08:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2015-06-14 23:53:32 -08:00
team . PreUpdate ( )
2016-10-21 17:19:28 -07:00
if result . Err = team . IsValid ( ) ; result . Err != nil {
2015-06-14 23:53:32 -08:00
storeChannel <- result
close ( storeChannel )
return
}
if oldResult , err := s . GetMaster ( ) . Get ( model . Team { } , team . Id ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.Update" , "store.sql_team.update.finding.app_error" , nil , "id=" + team . Id + ", " + err . Error ( ) , http . StatusInternalServerError )
2015-06-14 23:53:32 -08:00
} else if oldResult == nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.Update" , "store.sql_team.update.find.app_error" , nil , "id=" + team . Id , http . StatusBadRequest )
2015-06-14 23:53:32 -08:00
} else {
oldTeam := oldResult . ( * model . Team )
team . CreateAt = oldTeam . CreateAt
2015-10-27 22:18:52 -07:00
team . UpdateAt = model . GetMillis ( )
2015-07-08 11:50:10 -04:00
team . Name = oldTeam . Name
2015-06-14 23:53:32 -08:00
if count , err := s . GetMaster ( ) . Update ( team ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.Update" , "store.sql_team.update.updating.app_error" , nil , "id=" + team . Id + ", " + err . Error ( ) , http . StatusInternalServerError )
2015-06-14 23:53:32 -08:00
} else if count != 1 {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.Update" , "store.sql_team.update.app_error" , nil , "id=" + team . Id , http . StatusInternalServerError )
2015-06-14 23:53:32 -08:00
} else {
result . Data = team
}
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) UpdateDisplayName ( name string , teamId string ) store . StoreChannel {
2015-06-14 23:53:32 -08:00
2017-09-25 09:11:25 -05:00
storeChannel := make ( store . StoreChannel , 1 )
2015-06-14 23:53:32 -08:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2015-06-14 23:53:32 -08:00
2015-07-21 12:26:27 -08:00
if _ , err := s . GetMaster ( ) . Exec ( "UPDATE Teams SET DisplayName = :Name WHERE Id = :Id" , map [ string ] interface { } { "Name" : name , "Id" : teamId } ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.UpdateName" , "store.sql_team.update_display_name.app_error" , nil , "team_id=" + teamId , http . StatusInternalServerError )
2015-06-14 23:53:32 -08:00
} else {
result . Data = teamId
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) Get ( id string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2015-06-14 23:53:32 -08:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2015-06-14 23:53:32 -08:00
if obj , err := s . GetReplica ( ) . Get ( model . Team { } , id ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.Get" , "store.sql_team.get.finding.app_error" , nil , "id=" + id + ", " + err . Error ( ) , http . StatusInternalServerError )
2015-06-14 23:53:32 -08:00
} else if obj == nil {
2017-02-07 08:57:41 -08:00
result . Err = model . NewAppError ( "SqlTeamStore.Get" , "store.sql_team.get.find.app_error" , nil , "id=" + id , http . StatusNotFound )
2015-06-14 23:53:32 -08:00
} else {
2015-10-27 22:18:52 -07:00
team := obj . ( * model . Team )
if len ( team . InviteId ) == 0 {
team . InviteId = team . Id
}
result . Data = team
2015-06-14 23:53:32 -08:00
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetByInviteId ( inviteId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2015-10-27 22:18:52 -07:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2015-10-27 22:18:52 -07:00
team := model . Team { }
if err := s . GetReplica ( ) . SelectOne ( & team , "SELECT * FROM Teams WHERE Id = :InviteId OR InviteId = :InviteId" , map [ string ] interface { } { "InviteId" : inviteId } ) ; err != nil {
2017-06-28 07:56:29 -04:00
result . Err = model . NewAppError ( "SqlTeamStore.GetByInviteId" , "store.sql_team.get_by_invite_id.finding.app_error" , nil , "inviteId=" + inviteId + ", " + err . Error ( ) , http . StatusNotFound )
2015-10-27 22:18:52 -07:00
}
if len ( team . InviteId ) == 0 {
team . InviteId = team . Id
}
if len ( inviteId ) == 0 || team . InviteId != inviteId {
2017-06-28 07:56:29 -04:00
result . Err = model . NewAppError ( "SqlTeamStore.GetByInviteId" , "store.sql_team.get_by_invite_id.find.app_error" , nil , "inviteId=" + inviteId , http . StatusNotFound )
2015-10-27 22:18:52 -07:00
}
result . Data = & team
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetByName ( name string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2015-06-14 23:53:32 -08:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2015-06-14 23:53:32 -08:00
team := model . Team { }
2015-07-21 12:26:27 -08:00
if err := s . GetReplica ( ) . SelectOne ( & team , "SELECT * FROM Teams WHERE Name = :Name" , map [ string ] interface { } { "Name" : name } ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetByName" , "store.sql_team.get_by_name.app_error" , nil , "name=" + name + ", " + err . Error ( ) , http . StatusInternalServerError )
2015-06-14 23:53:32 -08:00
}
2015-10-27 22:18:52 -07:00
if len ( team . InviteId ) == 0 {
team . InviteId = team . Id
}
2015-06-14 23:53:32 -08:00
result . Data = & team
storeChannel <- result
close ( storeChannel )
} ( )
2017-02-02 11:46:42 -05:00
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) SearchByName ( name string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2017-02-02 11:46:42 -05:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2017-02-02 11:46:42 -05:00
var teams [ ] * model . Team
if _ , err := s . GetReplica ( ) . Select ( & teams , "SELECT * FROM Teams WHERE Name LIKE :Name" , map [ string ] interface { } { "Name" : name + "%" } ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.SearchByName" , "store.sql_team.get_by_name.app_error" , nil , "name=" + name + ", " + err . Error ( ) , http . StatusInternalServerError )
2017-02-02 11:46:42 -05:00
}
result . Data = teams
storeChannel <- result
close ( storeChannel )
} ( )
2015-06-14 23:53:32 -08:00
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) SearchAll ( term string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2017-04-04 02:34:14 +09:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2017-04-04 02:34:14 +09:00
var teams [ ] * model . Team
if _ , err := s . GetReplica ( ) . Select ( & teams , "SELECT * FROM Teams WHERE Name LIKE :Term OR DisplayName LIKE :Term" , map [ string ] interface { } { "Term" : term + "%" } ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.SearchAll" , "store.sql_team.search_all_team.app_error" , nil , "term=" + term + ", " + err . Error ( ) , http . StatusInternalServerError )
2017-04-04 02:34:14 +09:00
}
result . Data = teams
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) SearchOpen ( term string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2017-04-04 02:34:14 +09:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2017-04-04 02:34:14 +09:00
var teams [ ] * model . Team
2017-08-09 09:22:57 -04:00
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 {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.SearchOpen" , "store.sql_team.search_open_team.app_error" , nil , "term=" + term + ", " + err . Error ( ) , http . StatusInternalServerError )
2017-04-04 02:34:14 +09:00
}
result . Data = teams
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetAll ( ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2015-06-14 23:53:32 -08:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2015-06-14 23:53:32 -08:00
var data [ ] * model . Team
2016-04-21 22:37:01 -07:00
if _ , err := s . GetReplica ( ) . Select ( & data , "SELECT * FROM Teams" ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetAllTeams" , "store.sql_team.get_all.app_error" , nil , err . Error ( ) , http . StatusInternalServerError )
2015-06-14 23:53:32 -08:00
}
2015-10-27 22:18:52 -07:00
for _ , team := range data {
if len ( team . InviteId ) == 0 {
team . InviteId = team . Id
}
}
2015-06-14 23:53:32 -08:00
result . Data = data
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2015-08-26 12:49:07 -04:00
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetAllPage ( offset int , limit int ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2017-02-28 10:41:38 +02:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2017-02-28 10:41:38 +02:00
var data [ ] * model . Team
if _ , err := s . GetReplica ( ) . Select ( & data , "SELECT * FROM Teams LIMIT :Limit OFFSET :Offset" , map [ string ] interface { } { "Offset" : offset , "Limit" : limit } ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetAllTeams" , "store.sql_team.get_all.app_error" , nil , err . Error ( ) , http . StatusInternalServerError )
2017-02-28 10:41:38 +02:00
}
for _ , team := range data {
if len ( team . InviteId ) == 0 {
team . InviteId = team . Id
}
}
result . Data = data
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetTeamsByUserId ( userId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2015-08-26 12:49:07 -04:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2015-08-26 12:49:07 -04:00
var data [ ] * model . Team
2016-07-13 07:39:14 -04:00
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 {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetTeamsByUserId" , "store.sql_team.get_all.app_error" , nil , err . Error ( ) , http . StatusInternalServerError )
2015-08-26 12:49:07 -04:00
}
2015-10-27 22:18:52 -07:00
for _ , team := range data {
if len ( team . InviteId ) == 0 {
team . InviteId = team . Id
}
}
result . Data = data
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetAllTeamListing ( ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2015-10-27 22:18:52 -07:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2015-10-27 22:18:52 -07:00
2016-04-21 22:37:01 -07:00
query := "SELECT * FROM Teams WHERE AllowOpenInvite = 1"
2015-10-27 23:28:37 -07:00
2017-08-31 01:54:16 +08:00
if * utils . Cfg . SqlSettings . DriverName == model . DATABASE_DRIVER_POSTGRES {
2016-04-21 22:37:01 -07:00
query = "SELECT * FROM Teams WHERE AllowOpenInvite = true"
2015-10-27 23:28:37 -07:00
}
2015-10-27 22:18:52 -07:00
var data [ ] * model . Team
2015-10-27 23:28:37 -07:00
if _ , err := s . GetReplica ( ) . Select ( & data , query ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetAllTeamListing" , "store.sql_team.get_all_team_listing.app_error" , nil , err . Error ( ) , http . StatusInternalServerError )
2015-10-27 22:18:52 -07:00
}
for _ , team := range data {
if len ( team . InviteId ) == 0 {
team . InviteId = team . Id
}
}
2015-08-26 12:49:07 -04:00
result . Data = data
2017-02-28 10:41:38 +02:00
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetAllTeamPageListing ( offset int , limit int ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2017-02-28 10:41:38 +02:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2017-02-28 10:41:38 +02:00
query := "SELECT * FROM Teams WHERE AllowOpenInvite = 1 LIMIT :Limit OFFSET :Offset"
2017-08-31 01:54:16 +08:00
if * utils . Cfg . SqlSettings . DriverName == model . DATABASE_DRIVER_POSTGRES {
2017-02-28 10:41:38 +02:00
query = "SELECT * FROM Teams WHERE AllowOpenInvite = true LIMIT :Limit OFFSET :Offset"
}
var data [ ] * model . Team
if _ , err := s . GetReplica ( ) . Select ( & data , query , map [ string ] interface { } { "Offset" : offset , "Limit" : limit } ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetAllTeamListing" , "store.sql_team.get_all_team_listing.app_error" , nil , err . Error ( ) , http . StatusInternalServerError )
2017-02-28 10:41:38 +02:00
}
for _ , team := range data {
if len ( team . InviteId ) == 0 {
team . InviteId = team . Id
}
}
result . Data = data
2015-08-26 12:49:07 -04:00
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2015-11-15 18:18:02 -08:00
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) PermanentDelete ( teamId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2015-11-15 18:18:02 -08:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2015-11-15 18:18:02 -08:00
if _ , err := s . GetMaster ( ) . Exec ( "DELETE FROM Teams WHERE Id = :TeamId" , map [ string ] interface { } { "TeamId" : teamId } ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.Delete" , "store.sql_team.permanent_delete.app_error" , nil , "teamId=" + teamId + ", " + err . Error ( ) , http . StatusInternalServerError )
2015-11-15 18:18:02 -08:00
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2016-02-25 12:32:46 -05:00
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) AnalyticsTeamCount ( ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-02-25 12:32:46 -05:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-02-25 12:32:46 -05:00
if c , err := s . GetReplica ( ) . SelectInt ( "SELECT COUNT(*) FROM Teams WHERE DeleteAt = 0" , map [ string ] interface { } { } ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.AnalyticsTeamCount" , "store.sql_team.analytics_team_count.app_error" , nil , err . Error ( ) , http . StatusInternalServerError )
2016-02-25 12:32:46 -05:00
} else {
result . Data = c
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2016-04-21 22:37:01 -07:00
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) SaveMember ( member * model . TeamMember ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-04-21 22:37:01 -07:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-04-21 22:37:01 -07:00
if result . Err = member . IsValid ( ) ; result . Err != nil {
storeChannel <- result
close ( storeChannel )
return
}
2017-06-06 14:39:31 -04:00
if count , err := s . GetMaster ( ) . SelectInt (
` SELECT
COUNT ( 0 )
FROM
TeamMembers
2017-07-05 12:10:15 -04:00
INNER JOIN
Users
ON
TeamMembers . UserId = Users . Id
2017-06-06 14:39:31 -04:00
WHERE
TeamId = : TeamId
2017-07-05 12:10:15 -04:00
AND TeamMembers . DeleteAt = 0
AND Users . DeleteAt = 0 ` , map [ string ] interface { } { "TeamId" : member . TeamId } ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlUserStore.Save" , "store.sql_user.save.member_count.app_error" , nil , "teamId=" + member . TeamId + ", " + err . Error ( ) , http . StatusInternalServerError )
2016-04-21 22:37:01 -07:00
storeChannel <- result
close ( storeChannel )
return
2017-08-31 01:54:16 +08:00
} else if int ( count ) >= * utils . Cfg . TeamSettings . MaxUsersPerTeam {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlUserStore.Save" , "store.sql_user.save.max_accounts.app_error" , nil , "teamId=" + member . TeamId , http . StatusBadRequest )
2016-04-21 22:37:01 -07:00
storeChannel <- result
close ( storeChannel )
return
}
if err := s . GetMaster ( ) . Insert ( member ) ; err != nil {
2017-09-06 14:00:56 -04:00
if IsUniqueConstraintError ( err , [ ] string { "TeamId" , "teammembers_pkey" , "PRIMARY" } ) {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.SaveMember" , TEAM_MEMBER_EXISTS_ERROR , nil , "team_id=" + member . TeamId + ", user_id=" + member . UserId + ", " + err . Error ( ) , http . StatusBadRequest )
2016-04-21 22:37:01 -07:00
} else {
2017-09-20 14:34:50 +01:00
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 )
2016-04-21 22:37:01 -07:00
}
} else {
result . Data = member
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) UpdateMember ( member * model . TeamMember ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-04-21 22:37:01 -07:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-04-21 22:37:01 -07:00
2016-09-13 12:42:48 -04:00
member . PreUpdate ( )
2016-04-21 22:37:01 -07:00
if result . Err = member . IsValid ( ) ; result . Err != nil {
storeChannel <- result
close ( storeChannel )
return
}
if _ , err := s . GetMaster ( ) . Update ( member ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.UpdateMember" , "store.sql_team.save_member.save.app_error" , nil , err . Error ( ) , http . StatusInternalServerError )
2016-04-21 22:37:01 -07:00
} else {
result . Data = member
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetMember ( teamId string , userId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-05-16 12:55:22 -04:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-05-16 12:55:22 -04:00
var member model . TeamMember
err := s . GetReplica ( ) . SelectOne ( & member , "SELECT * FROM TeamMembers WHERE TeamId = :TeamId AND UserId = :UserId" , map [ string ] interface { } { "TeamId" : teamId , "UserId" : userId } )
if err != nil {
2016-06-04 10:52:25 -04:00
if err == sql . ErrNoRows {
2017-02-07 08:57:41 -08:00
result . Err = model . NewAppError ( "SqlTeamStore.GetMember" , "store.sql_team.get_member.missing.app_error" , nil , "teamId=" + teamId + " userId=" + userId + " " + err . Error ( ) , http . StatusNotFound )
2016-06-04 10:52:25 -04:00
} else {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetMember" , "store.sql_team.get_member.app_error" , nil , "teamId=" + teamId + " userId=" + userId + " " + err . Error ( ) , http . StatusInternalServerError )
2016-06-04 10:52:25 -04:00
}
2016-05-16 12:55:22 -04:00
} else {
2017-01-19 09:00:13 -05:00
result . Data = & member
2016-05-16 12:55:22 -04:00
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetMembers ( teamId string , offset int , limit int ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-04-21 22:37:01 -07:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-04-21 22:37:01 -07:00
var members [ ] * model . TeamMember
2016-10-19 14:49:25 -04:00
_ , 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 } )
2016-04-21 22:37:01 -07:00
if err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetMembers" , "store.sql_team.get_members.app_error" , nil , "teamId=" + teamId + " " + err . Error ( ) , http . StatusInternalServerError )
2016-04-21 22:37:01 -07:00
} else {
result . Data = members
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetTotalMemberCount ( teamId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-10-19 14:49:25 -04:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-10-19 14:49:25 -04:00
count , err := s . GetReplica ( ) . SelectInt ( `
SELECT
count ( * )
FROM
TeamMembers ,
Users
WHERE
TeamMembers . UserId = Users . Id
AND TeamMembers . TeamId = : TeamId
2016-11-04 12:27:19 -04:00
AND TeamMembers . DeleteAt = 0 ` , map [ string ] interface { } { "TeamId" : teamId } )
if err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetTotalMemberCount" , "store.sql_team.get_member_count.app_error" , nil , "teamId=" + teamId + " " + err . Error ( ) , http . StatusInternalServerError )
2016-11-04 12:27:19 -04:00
} else {
result . Data = count
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetActiveMemberCount ( teamId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-11-04 12:27:19 -04:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-11-04 12:27:19 -04:00
count , err := s . GetReplica ( ) . SelectInt ( `
SELECT
count ( * )
FROM
TeamMembers ,
Users
WHERE
TeamMembers . UserId = Users . Id
AND TeamMembers . TeamId = : TeamId
AND TeamMembers . DeleteAt = 0
2016-10-19 14:49:25 -04:00
AND Users . DeleteAt = 0 ` , map [ string ] interface { } { "TeamId" : teamId } )
if err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetActiveMemberCount" , "store.sql_team.get_member_count.app_error" , nil , "teamId=" + teamId + " " + err . Error ( ) , http . StatusInternalServerError )
2016-10-19 14:49:25 -04:00
} else {
result . Data = count
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetMembersByIds ( teamId string , userIds [ ] string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-10-19 14:49:25 -04:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-10-19 14:49:25 -04:00
var members [ ] * model . TeamMember
props := make ( map [ string ] interface { } )
idQuery := ""
for index , userId := range userIds {
if len ( idQuery ) > 0 {
idQuery += ", "
}
props [ "userId" + strconv . Itoa ( index ) ] = userId
idQuery += ":userId" + strconv . Itoa ( index )
}
props [ "TeamId" ] = teamId
if _ , err := s . GetReplica ( ) . Select ( & members , "SELECT * FROM TeamMembers WHERE TeamId = :TeamId AND UserId IN (" + idQuery + ") AND DeleteAt = 0" , props ) ; err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetMembersByIds" , "store.sql_team.get_members_by_ids.app_error" , nil , "teamId=" + teamId + " " + err . Error ( ) , http . StatusInternalServerError )
2016-10-19 14:49:25 -04:00
} else {
result . Data = members
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetTeamsForUser ( userId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-04-21 22:37:01 -07:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-04-21 22:37:01 -07:00
var members [ ] * model . TeamMember
_ , err := s . GetReplica ( ) . Select ( & members , "SELECT * FROM TeamMembers WHERE UserId = :UserId" , map [ string ] interface { } { "UserId" : userId } )
if err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetMembers" , "store.sql_team.get_members.app_error" , nil , "userId=" + userId + " " + err . Error ( ) , http . StatusInternalServerError )
2016-04-21 22:37:01 -07:00
} else {
result . Data = members
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetChannelUnreadsForAllTeams ( excludeTeamId , userId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-12-19 10:05:46 -03:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-12-19 10:05:46 -03:00
2016-12-21 16:20:11 -03:00
var data [ ] * model . ChannelUnread
_ , err := s . GetReplica ( ) . Select ( & data ,
2016-12-19 10:05:46 -03:00
` SELECT
2017-03-13 09:46:28 -04:00
Channels . TeamId TeamId , Channels . Id ChannelId , ( Channels . TotalMsgCount - ChannelMembers . MsgCount ) MsgCount , ChannelMembers . MentionCount MentionCount , ChannelMembers . NotifyProps NotifyProps
2016-12-19 10:05:46 -03:00
FROM
2016-12-21 16:20:11 -03:00
Channels , ChannelMembers
2016-12-19 10:05:46 -03:00
WHERE
2017-03-13 09:46:28 -04:00
Id = ChannelId
AND UserId = : UserId
AND DeleteAt = 0
AND TeamId != : TeamId ` ,
map [ string ] interface { } { "UserId" : userId , "TeamId" : excludeTeamId } )
2016-12-21 16:20:11 -03:00
2016-12-19 10:05:46 -03:00
if err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetChannelUnreadsForAllTeams" , "store.sql_team.get_unread.app_error" , nil , "userId=" + userId + " " + err . Error ( ) , http . StatusInternalServerError )
2017-03-13 09:46:28 -04:00
} else {
result . Data = data
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) GetChannelUnreadsForTeam ( teamId , userId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2017-03-13 09:46:28 -04:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2017-03-13 09:46:28 -04:00
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 TeamId = : TeamId
AND DeleteAt = 0 ` ,
map [ string ] interface { } { "TeamId" : teamId , "UserId" : userId } )
if err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlTeamStore.GetChannelUnreadsForTeam" , "store.sql_team.get_unread.app_error" , nil , "teamId=" + teamId + " " + err . Error ( ) , http . StatusInternalServerError )
2016-12-19 10:05:46 -03:00
} else {
2016-12-21 16:20:11 -03:00
result . Data = data
2016-12-19 10:05:46 -03:00
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) RemoveMember ( teamId string , userId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-04-21 22:37:01 -07:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-04-21 22:37:01 -07:00
_ , err := s . GetMaster ( ) . Exec ( "DELETE FROM TeamMembers WHERE TeamId = :TeamId AND UserId = :UserId" , map [ string ] interface { } { "TeamId" : teamId , "UserId" : userId } )
if err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlChannelStore.RemoveMember" , "store.sql_team.remove_member.app_error" , nil , "team_id=" + teamId + ", user_id=" + userId + ", " + err . Error ( ) , http . StatusInternalServerError )
2016-04-21 22:37:01 -07:00
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) RemoveAllMembersByTeam ( teamId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-04-21 22:37:01 -07:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-04-21 22:37:01 -07:00
_ , err := s . GetMaster ( ) . Exec ( "DELETE FROM TeamMembers WHERE TeamId = :TeamId" , map [ string ] interface { } { "TeamId" : teamId } )
if err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlChannelStore.RemoveMember" , "store.sql_team.remove_member.app_error" , nil , "team_id=" + teamId + ", " + err . Error ( ) , http . StatusInternalServerError )
2016-04-21 22:37:01 -07:00
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2017-09-25 09:11:25 -05:00
func ( s SqlTeamStore ) RemoveAllMembersByUser ( userId string ) store . StoreChannel {
storeChannel := make ( store . StoreChannel , 1 )
2016-04-21 22:37:01 -07:00
go func ( ) {
2017-09-25 09:11:25 -05:00
result := store . StoreResult { }
2016-04-21 22:37:01 -07:00
_ , err := s . GetMaster ( ) . Exec ( "DELETE FROM TeamMembers WHERE UserId = :UserId" , map [ string ] interface { } { "UserId" : userId } )
if err != nil {
2017-09-20 14:34:50 +01:00
result . Err = model . NewAppError ( "SqlChannelStore.RemoveMember" , "store.sql_team.remove_member.app_error" , nil , "user_id=" + userId + ", " + err . Error ( ) , http . StatusInternalServerError )
2016-04-21 22:37:01 -07:00
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}