2015-10-08 12:27:09 -04:00
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
2015-06-14 23:53:32 -08:00
// See License.txt for license information.
package store
import (
"github.com/mattermost/platform/model"
2015-10-20 17:30:24 -07:00
"github.com/mattermost/platform/utils"
2015-06-14 23:53:32 -08:00
)
type SqlTeamStore struct {
* SqlStore
}
func NewSqlTeamStore ( sqlStore * SqlStore ) TeamStore {
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 )
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 )
2015-06-14 23:53:32 -08:00
}
return s
}
func ( s SqlTeamStore ) UpgradeSchemaIfNeeded ( ) {
}
func ( s SqlTeamStore ) CreateIndexesIfNotExists ( ) {
2015-07-21 12:52:38 -08:00
s . CreateIndexIfNotExists ( "idx_teams_name" , "Teams" , "Name" )
2015-10-27 22:18:52 -07:00
s . CreateIndexIfNotExists ( "idx_teams_invite_id" , "Teams" , "InviteId" )
2015-06-14 23:53:32 -08:00
}
2016-01-20 13:36:16 -06:00
func ( s SqlTeamStore ) Save ( team * model . Team ) StoreChannel {
2015-06-14 23:53:32 -08:00
storeChannel := make ( StoreChannel )
go func ( ) {
result := StoreResult { }
if len ( team . Id ) > 0 {
result . Err = model . NewAppError ( "SqlTeamStore.Save" ,
"Must call update for exisiting team" , "id=" + team . Id )
storeChannel <- result
close ( storeChannel )
return
}
team . PreSave ( )
2015-09-04 11:59:10 -07:00
2015-10-20 17:30:24 -07:00
if result . Err = team . IsValid ( * utils . Cfg . TeamSettings . RestrictTeamNames ) ; 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 {
2015-07-23 10:15:53 -08:00
if IsUniqueConstraintError ( err . Error ( ) , "Name" , "teams_name_key" ) {
2015-06-14 23:53:32 -08:00
result . Err = model . NewAppError ( "SqlTeamStore.Save" , "A team with that domain already exists" , "id=" + team . Id + ", " + err . Error ( ) )
} else {
result . Err = model . NewAppError ( "SqlTeamStore.Save" , "We couldn't save the team" , "id=" + team . Id + ", " + err . Error ( ) )
}
} else {
result . Data = team
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2016-01-20 13:36:16 -06:00
func ( s SqlTeamStore ) Update ( team * model . Team ) StoreChannel {
2015-06-14 23:53:32 -08:00
storeChannel := make ( StoreChannel )
go func ( ) {
result := StoreResult { }
team . PreUpdate ( )
2015-10-20 17:30:24 -07:00
if result . Err = team . IsValid ( * utils . Cfg . TeamSettings . RestrictTeamNames ) ; 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 {
2015-10-30 12:41:51 -05:00
result . Err = model . NewAppError ( "SqlTeamStore.Update" , "We encountered an error finding the team" , "id=" + team . Id + ", " + err . Error ( ) )
2015-06-14 23:53:32 -08:00
} else if oldResult == nil {
result . Err = model . NewAppError ( "SqlTeamStore.Update" , "We couldn't find the existing team to update" , "id=" + team . Id )
} 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 {
2015-10-30 12:41:51 -05:00
result . Err = model . NewAppError ( "SqlTeamStore.Update" , "We encountered an error updating the team" , "id=" + team . Id + ", " + err . Error ( ) )
2015-06-14 23:53:32 -08:00
} else if count != 1 {
result . Err = model . NewAppError ( "SqlTeamStore.Update" , "We couldn't update the team" , "id=" + team . Id )
} else {
result . Data = team
}
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2016-01-20 13:36:16 -06:00
func ( s SqlTeamStore ) UpdateDisplayName ( name string , teamId string ) StoreChannel {
2015-06-14 23:53:32 -08:00
storeChannel := make ( StoreChannel )
go func ( ) {
result := StoreResult { }
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 {
2015-06-14 23:53:32 -08:00
result . Err = model . NewAppError ( "SqlTeamStore.UpdateName" , "We couldn't update the team name" , "team_id=" + teamId )
} else {
result . Data = teamId
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2016-01-20 13:36:16 -06:00
func ( s SqlTeamStore ) Get ( id string ) StoreChannel {
2015-06-14 23:53:32 -08:00
storeChannel := make ( StoreChannel )
go func ( ) {
result := StoreResult { }
if obj , err := s . GetReplica ( ) . Get ( model . Team { } , id ) ; err != nil {
2015-10-30 12:41:51 -05:00
result . Err = model . NewAppError ( "SqlTeamStore.Get" , "We encountered an error finding the team" , "id=" + id + ", " + err . Error ( ) )
2015-06-14 23:53:32 -08:00
} else if obj == nil {
result . Err = model . NewAppError ( "SqlTeamStore.Get" , "We couldn't find the existing team" , "id=" + id )
} 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
}
2016-01-20 13:36:16 -06:00
func ( s SqlTeamStore ) GetByInviteId ( inviteId string ) StoreChannel {
2015-10-27 22:18:52 -07:00
storeChannel := make ( StoreChannel )
go func ( ) {
result := StoreResult { }
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 {
result . Err = model . NewAppError ( "SqlTeamStore.GetByInviteId" , "We couldn't find the existing team" , "inviteId=" + inviteId + ", " + err . Error ( ) )
}
if len ( team . InviteId ) == 0 {
team . InviteId = team . Id
}
if len ( inviteId ) == 0 || team . InviteId != inviteId {
result . Err = model . NewAppError ( "SqlTeamStore.GetByInviteId" , "We couldn't find the existing team" , "inviteId=" + inviteId )
}
result . Data = & team
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2016-01-20 13:36:16 -06:00
func ( s SqlTeamStore ) GetByName ( name string ) StoreChannel {
2015-06-14 23:53:32 -08:00
storeChannel := make ( StoreChannel )
go func ( ) {
result := StoreResult { }
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 {
2015-07-08 11:50:10 -04:00
result . Err = model . NewAppError ( "SqlTeamStore.GetByName" , "We couldn't find the existing team" , "name=" + name + ", " + err . Error ( ) )
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 )
} ( )
return storeChannel
}
2016-01-20 13:36:16 -06:00
func ( s SqlTeamStore ) GetTeamsForEmail ( email string ) StoreChannel {
2015-06-14 23:53:32 -08:00
storeChannel := make ( StoreChannel )
go func ( ) {
result := StoreResult { }
var data [ ] * model . Team
2015-07-12 18:19:03 -08:00
if _ , err := s . GetReplica ( ) . Select ( & data , "SELECT Teams.* FROM Teams, Users WHERE Teams.Id = Users.TeamId AND Users.Email = :Email" , map [ string ] interface { } { "Email" : email } ) ; err != nil {
2015-10-30 12:41:51 -05:00
result . Err = model . NewAppError ( "SqlTeamStore.GetTeamsForEmail" , "We encountered a problem when looking up teams" , "email=" + email + ", " + err . Error ( ) )
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
2016-01-20 13:36:16 -06:00
func ( s SqlTeamStore ) GetAll ( ) StoreChannel {
2015-08-26 12:49:07 -04:00
storeChannel := make ( StoreChannel )
go func ( ) {
result := StoreResult { }
var data [ ] * model . Team
if _ , err := s . GetReplica ( ) . Select ( & data , "SELECT * FROM Teams" ) ; err != nil {
2015-09-23 12:49:28 -07:00
result . Err = model . NewAppError ( "SqlTeamStore.GetAllTeams" , "We could not get all teams" , err . Error ( ) )
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
}
2016-01-20 13:36:16 -06:00
func ( s SqlTeamStore ) GetAllTeamListing ( ) StoreChannel {
2015-10-27 22:18:52 -07:00
storeChannel := make ( StoreChannel )
go func ( ) {
result := StoreResult { }
2015-10-27 23:28:37 -07:00
query := "SELECT * FROM Teams WHERE AllowTeamListing = 1"
if utils . Cfg . SqlSettings . DriverName == model . DATABASE_DRIVER_POSTGRES {
query = "SELECT * FROM Teams WHERE AllowTeamListing = true"
}
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 {
2015-10-27 22:18:52 -07:00
result . Err = model . NewAppError ( "SqlTeamStore.GetAllTeams" , "We could not get all teams" , err . Error ( ) )
}
for _ , team := range data {
if len ( team . InviteId ) == 0 {
team . InviteId = team . Id
}
}
2015-08-26 12:49:07 -04:00
result . Data = data
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}
2015-11-15 18:18:02 -08:00
2016-01-20 13:36:16 -06:00
func ( s SqlTeamStore ) PermanentDelete ( teamId string ) StoreChannel {
2015-11-15 18:18:02 -08:00
storeChannel := make ( StoreChannel )
go func ( ) {
result := StoreResult { }
if _ , err := s . GetMaster ( ) . Exec ( "DELETE FROM Teams WHERE Id = :TeamId" , map [ string ] interface { } { "TeamId" : teamId } ) ; err != nil {
result . Err = model . NewAppError ( "SqlTeamStore.Delete" , "We couldn't delete the existing team" , "teamId=" + teamId + ", " + err . Error ( ) )
}
storeChannel <- result
close ( storeChannel )
} ( )
return storeChannel
}