2017-04-12 08:27:57 -04:00
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
2016-01-06 21:09:05 -06:00
// See License.txt for license information.
2017-09-25 09:11:25 -05:00
package sqlstore
2016-01-06 21:09:05 -06:00
import (
2017-09-18 18:31:31 +01:00
"net/http"
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"
2016-01-06 21:09:05 -06:00
)
type SqlCommandStore struct {
2017-06-27 08:02:08 -07:00
SqlStore
2016-01-06 21:09:05 -06:00
}
2017-09-25 09:11:25 -05:00
func NewSqlCommandStore ( sqlStore SqlStore ) store . CommandStore {
2016-01-06 21:09:05 -06:00
s := & SqlCommandStore { sqlStore }
for _ , db := range sqlStore . GetAllConns ( ) {
tableo := db . AddTableWithName ( model . Command { } , "Commands" ) . SetKeys ( false , "Id" )
tableo . ColMap ( "Id" ) . SetMaxSize ( 26 )
tableo . ColMap ( "Token" ) . SetMaxSize ( 26 )
tableo . ColMap ( "CreatorId" ) . SetMaxSize ( 26 )
tableo . ColMap ( "TeamId" ) . SetMaxSize ( 26 )
tableo . ColMap ( "Trigger" ) . SetMaxSize ( 128 )
tableo . ColMap ( "URL" ) . SetMaxSize ( 1024 )
tableo . ColMap ( "Method" ) . SetMaxSize ( 1 )
tableo . ColMap ( "Username" ) . SetMaxSize ( 64 )
tableo . ColMap ( "IconURL" ) . SetMaxSize ( 1024 )
tableo . ColMap ( "AutoCompleteDesc" ) . SetMaxSize ( 1024 )
tableo . ColMap ( "AutoCompleteHint" ) . SetMaxSize ( 1024 )
tableo . ColMap ( "DisplayName" ) . SetMaxSize ( 64 )
2016-03-30 10:56:20 -04:00
tableo . ColMap ( "Description" ) . SetMaxSize ( 128 )
2016-01-06 21:09:05 -06:00
}
return s
}
func ( s SqlCommandStore ) CreateIndexesIfNotExists ( ) {
s . CreateIndexIfNotExists ( "idx_command_team_id" , "Commands" , "TeamId" )
2016-10-24 17:05:27 -03:00
s . CreateIndexIfNotExists ( "idx_command_update_at" , "Commands" , "UpdateAt" )
s . CreateIndexIfNotExists ( "idx_command_create_at" , "Commands" , "CreateAt" )
s . CreateIndexIfNotExists ( "idx_command_delete_at" , "Commands" , "DeleteAt" )
2016-01-06 21:09:05 -06:00
}
2017-09-25 09:11:25 -05:00
func ( s SqlCommandStore ) Save ( command * model . Command ) store . StoreChannel {
2017-10-06 08:12:10 -07:00
return store . Do ( func ( result * store . StoreResult ) {
2016-01-06 21:09:05 -06:00
if len ( command . Id ) > 0 {
2017-09-18 18:31:31 +01:00
result . Err = model . NewAppError ( "SqlCommandStore.Save" , "store.sql_command.save.saving_overwrite.app_error" , nil , "id=" + command . Id , http . StatusBadRequest )
2016-01-06 21:09:05 -06:00
return
}
command . PreSave ( )
if result . Err = command . IsValid ( ) ; result . Err != nil {
return
}
if err := s . GetMaster ( ) . Insert ( command ) ; err != nil {
2017-09-18 18:31:31 +01:00
result . Err = model . NewAppError ( "SqlCommandStore.Save" , "store.sql_command.save.saving.app_error" , nil , "id=" + command . Id + ", " + err . Error ( ) , http . StatusInternalServerError )
2016-01-06 21:09:05 -06:00
} else {
result . Data = command
}
2017-10-06 08:12:10 -07:00
} )
2016-01-06 21:09:05 -06:00
}
2017-09-25 09:11:25 -05:00
func ( s SqlCommandStore ) Get ( id string ) store . StoreChannel {
2017-10-06 08:12:10 -07:00
return store . Do ( func ( result * store . StoreResult ) {
2016-01-06 21:09:05 -06:00
var command model . Command
if err := s . GetReplica ( ) . SelectOne ( & command , "SELECT * FROM Commands WHERE Id = :Id AND DeleteAt = 0" , map [ string ] interface { } { "Id" : id } ) ; err != nil {
2017-09-18 18:31:31 +01:00
result . Err = model . NewAppError ( "SqlCommandStore.Get" , "store.sql_command.save.get.app_error" , nil , "id=" + id + ", err=" + err . Error ( ) , http . StatusInternalServerError )
2016-01-06 21:09:05 -06:00
}
result . Data = & command
2017-10-06 08:12:10 -07:00
} )
2016-01-06 21:09:05 -06:00
}
2017-09-25 09:11:25 -05:00
func ( s SqlCommandStore ) GetByTeam ( teamId string ) store . StoreChannel {
2017-10-06 08:12:10 -07:00
return store . Do ( func ( result * store . StoreResult ) {
2016-01-06 21:09:05 -06:00
var commands [ ] * model . Command
if _ , err := s . GetReplica ( ) . Select ( & commands , "SELECT * FROM Commands WHERE TeamId = :TeamId AND DeleteAt = 0" , map [ string ] interface { } { "TeamId" : teamId } ) ; err != nil {
2017-09-18 18:31:31 +01:00
result . Err = model . NewAppError ( "SqlCommandStore.GetByTeam" , "store.sql_command.save.get_team.app_error" , nil , "teamId=" + teamId + ", err=" + err . Error ( ) , http . StatusInternalServerError )
2016-01-06 21:09:05 -06:00
}
result . Data = commands
2017-10-06 08:12:10 -07:00
} )
2016-01-06 21:09:05 -06:00
}
2017-10-04 19:08:59 +01:00
func ( s SqlCommandStore ) GetByTrigger ( teamId string , trigger string ) store . StoreChannel {
2017-10-06 08:12:10 -07:00
return store . Do ( func ( result * store . StoreResult ) {
2017-10-04 19:08:59 +01:00
var command model . Command
2017-10-09 10:16:14 -07:00
var query string
if s . DriverName ( ) == "mysql" {
query = "SELECT * FROM Commands WHERE TeamId = :TeamId AND `Trigger` = :Trigger AND DeleteAt = 0"
} else {
query = "SELECT * FROM Commands WHERE TeamId = :TeamId AND \"trigger\" = :Trigger AND DeleteAt = 0"
}
if err := s . GetReplica ( ) . SelectOne ( & command , query , map [ string ] interface { } { "TeamId" : teamId , "Trigger" : trigger } ) ; err != nil {
2017-10-04 19:08:59 +01:00
result . Err = model . NewAppError ( "SqlCommandStore.GetByTrigger" , "store.sql_command.get_by_trigger.app_error" , nil , "teamId=" + teamId + ", trigger=" + trigger + ", err=" + err . Error ( ) , http . StatusInternalServerError )
}
result . Data = & command
2017-10-06 08:12:10 -07:00
} )
2017-10-04 19:08:59 +01:00
}
2017-09-25 09:11:25 -05:00
func ( s SqlCommandStore ) Delete ( commandId string , time int64 ) store . StoreChannel {
2017-10-06 08:12:10 -07:00
return store . Do ( func ( result * store . StoreResult ) {
2016-01-06 21:09:05 -06:00
_ , err := s . GetMaster ( ) . Exec ( "Update Commands SET DeleteAt = :DeleteAt, UpdateAt = :UpdateAt WHERE Id = :Id" , map [ string ] interface { } { "DeleteAt" : time , "UpdateAt" : time , "Id" : commandId } )
if err != nil {
2017-09-18 18:31:31 +01:00
result . Err = model . NewAppError ( "SqlCommandStore.Delete" , "store.sql_command.save.delete.app_error" , nil , "id=" + commandId + ", err=" + err . Error ( ) , http . StatusInternalServerError )
2016-01-06 21:09:05 -06:00
}
2017-10-06 08:12:10 -07:00
} )
2016-01-06 21:09:05 -06:00
}
2017-09-25 09:11:25 -05:00
func ( s SqlCommandStore ) PermanentDeleteByTeam ( teamId string ) store . StoreChannel {
2017-10-06 08:12:10 -07:00
return store . Do ( func ( result * store . StoreResult ) {
2017-07-31 08:52:45 -07:00
_ , err := s . GetMaster ( ) . Exec ( "DELETE FROM Commands WHERE TeamId = :TeamId" , map [ string ] interface { } { "TeamId" : teamId } )
if err != nil {
2017-09-18 18:31:31 +01:00
result . Err = model . NewAppError ( "SqlCommandStore.DeleteByTeam" , "store.sql_command.save.delete_perm.app_error" , nil , "id=" + teamId + ", err=" + err . Error ( ) , http . StatusInternalServerError )
2017-07-31 08:52:45 -07:00
}
2017-10-06 08:12:10 -07:00
} )
2017-07-31 08:52:45 -07:00
}
2017-09-25 09:11:25 -05:00
func ( s SqlCommandStore ) PermanentDeleteByUser ( userId string ) store . StoreChannel {
2017-10-06 08:12:10 -07:00
return store . Do ( func ( result * store . StoreResult ) {
2016-01-06 21:09:05 -06:00
_ , err := s . GetMaster ( ) . Exec ( "DELETE FROM Commands WHERE CreatorId = :UserId" , map [ string ] interface { } { "UserId" : userId } )
if err != nil {
2017-09-18 18:31:31 +01:00
result . Err = model . NewAppError ( "SqlCommandStore.DeleteByUser" , "store.sql_command.save.delete_perm.app_error" , nil , "id=" + userId + ", err=" + err . Error ( ) , http . StatusInternalServerError )
2016-01-06 21:09:05 -06:00
}
2017-10-06 08:12:10 -07:00
} )
2016-01-06 21:09:05 -06:00
}
2017-09-25 09:11:25 -05:00
func ( s SqlCommandStore ) Update ( cmd * model . Command ) store . StoreChannel {
2017-10-06 08:12:10 -07:00
return store . Do ( func ( result * store . StoreResult ) {
2016-02-25 12:32:46 -05:00
cmd . UpdateAt = model . GetMillis ( )
2016-01-06 21:09:05 -06:00
2016-02-25 12:32:46 -05:00
if _ , err := s . GetMaster ( ) . Update ( cmd ) ; err != nil {
2017-09-18 18:31:31 +01:00
result . Err = model . NewAppError ( "SqlCommandStore.Update" , "store.sql_command.save.update.app_error" , nil , "id=" + cmd . Id + ", " + err . Error ( ) , http . StatusInternalServerError )
2016-01-06 21:09:05 -06:00
} else {
2016-02-25 12:32:46 -05:00
result . Data = cmd
}
2017-10-06 08:12:10 -07:00
} )
2016-02-25 12:32:46 -05:00
}
2017-09-25 09:11:25 -05:00
func ( s SqlCommandStore ) AnalyticsCommandCount ( teamId string ) store . StoreChannel {
2017-10-06 08:12:10 -07:00
return store . Do ( func ( result * store . StoreResult ) {
2016-02-25 12:32:46 -05:00
query :=
` SELECT
COUNT ( * )
FROM
Commands
WHERE
DeleteAt = 0 `
if len ( teamId ) > 0 {
query += " AND TeamId = :TeamId"
}
if c , err := s . GetReplica ( ) . SelectInt ( query , map [ string ] interface { } { "TeamId" : teamId } ) ; err != nil {
2017-09-18 18:31:31 +01:00
result . Err = model . NewAppError ( "SqlCommandStore.AnalyticsCommandCount" , "store.sql_command.analytics_command_count.app_error" , nil , err . Error ( ) , http . StatusInternalServerError )
2016-02-25 12:32:46 -05:00
} else {
result . Data = c
2016-01-06 21:09:05 -06:00
}
2017-10-06 08:12:10 -07:00
} )
2016-01-06 21:09:05 -06:00
}