2020-08-09 15:29:54 -07:00
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
2016-04-10 14:39:38 -07:00
package model
import (
"encoding/json"
"io"
2018-02-08 15:11:04 -08:00
"net/http"
2016-06-23 11:28:05 -07:00
"strings"
2016-04-10 14:39:38 -07:00
)
const (
COMMAND_METHOD_POST = "P"
COMMAND_METHOD_GET = "G"
2016-06-23 11:28:05 -07:00
MIN_TRIGGER_LENGTH = 1
MAX_TRIGGER_LENGTH = 128
2016-04-10 14:39:38 -07:00
)
type Command struct {
2020-10-19 14:40:00 -07:00
Id string ` json:"id" `
Token string ` json:"token" `
CreateAt int64 ` json:"create_at" `
UpdateAt int64 ` json:"update_at" `
DeleteAt int64 ` json:"delete_at" `
CreatorId string ` json:"creator_id" `
TeamId string ` json:"team_id" `
Trigger string ` json:"trigger" `
Method string ` json:"method" `
Username string ` json:"username" `
IconURL string ` json:"icon_url" `
AutoComplete bool ` json:"auto_complete" `
AutoCompleteDesc string ` json:"auto_complete_desc" `
AutoCompleteHint string ` json:"auto_complete_hint" `
DisplayName string ` json:"display_name" `
Description string ` json:"description" `
URL string ` json:"url" `
// PluginId records the id of the plugin that created this Command. If it is blank, the Command
// was not created by a plugin.
PluginId string ` json:"plugin_id" `
2020-08-09 15:29:54 -07:00
AutocompleteData * AutocompleteData ` db:"-" json:"autocomplete_data,omitempty" `
// AutocompleteIconData is a base64 encoded svg
AutocompleteIconData string ` db:"-" json:"autocomplete_icon_data,omitempty" `
2016-04-10 14:39:38 -07:00
}
func ( o * Command ) ToJson ( ) string {
2018-11-18 09:55:05 -08:00
b , _ := json . Marshal ( o )
return string ( b )
2016-04-10 14:39:38 -07:00
}
func CommandFromJson ( data io . Reader ) * Command {
2018-11-18 09:55:05 -08:00
var o * Command
json . NewDecoder ( data ) . Decode ( & o )
return o
2016-04-10 14:39:38 -07:00
}
func CommandListToJson ( l [ ] * Command ) string {
2018-11-18 09:55:05 -08:00
b , _ := json . Marshal ( l )
return string ( b )
2016-04-10 14:39:38 -07:00
}
func CommandListFromJson ( data io . Reader ) [ ] * Command {
var o [ ] * Command
2018-11-18 09:55:05 -08:00
json . NewDecoder ( data ) . Decode ( & o )
return o
2016-04-10 14:39:38 -07:00
}
func ( o * Command ) IsValid ( ) * AppError {
2020-08-09 15:29:54 -07:00
if ! IsValidId ( o . Id ) {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.id.app_error" , nil , "" , http . StatusBadRequest )
2016-04-10 14:39:38 -07:00
}
if len ( o . Token ) != 26 {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.token.app_error" , nil , "" , http . StatusBadRequest )
2016-04-10 14:39:38 -07:00
}
if o . CreateAt == 0 {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.create_at.app_error" , nil , "" , http . StatusBadRequest )
2016-04-10 14:39:38 -07:00
}
if o . UpdateAt == 0 {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.update_at.app_error" , nil , "" , http . StatusBadRequest )
2016-04-10 14:39:38 -07:00
}
2020-10-19 14:40:00 -07:00
// If the CreatorId is blank, this should be a command created by a plugin.
if o . CreatorId == "" && ! IsValidPluginId ( o . PluginId ) {
return NewAppError ( "Command.IsValid" , "model.command.is_valid.plugin_id.app_error" , nil , "" , http . StatusBadRequest )
}
// If the PluginId is blank, this should be a command associated with a userId.
if o . PluginId == "" && ! IsValidId ( o . CreatorId ) {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.user_id.app_error" , nil , "" , http . StatusBadRequest )
2016-04-10 14:39:38 -07:00
}
2020-10-19 14:40:00 -07:00
if o . CreatorId != "" && o . PluginId != "" {
return NewAppError ( "Command.IsValid" , "model.command.is_valid.plugin_id.app_error" , nil , "command cannot have both a CreatorId and a PluginId" , http . StatusBadRequest )
}
2020-08-09 15:29:54 -07:00
if ! IsValidId ( o . TeamId ) {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.team_id.app_error" , nil , "" , http . StatusBadRequest )
2016-04-10 14:39:38 -07:00
}
2016-06-23 11:28:05 -07:00
if len ( o . Trigger ) < MIN_TRIGGER_LENGTH || len ( o . Trigger ) > MAX_TRIGGER_LENGTH || strings . Index ( o . Trigger , "/" ) == 0 || strings . Contains ( o . Trigger , " " ) {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.trigger.app_error" , nil , "" , http . StatusBadRequest )
2016-04-10 14:39:38 -07:00
}
2021-10-16 15:47:22 -07:00
if o . URL == "" || len ( o . URL ) > 1024 {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.url.app_error" , nil , "" , http . StatusBadRequest )
2016-04-10 14:39:38 -07:00
}
if ! IsValidHttpUrl ( o . URL ) {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.url_http.app_error" , nil , "" , http . StatusBadRequest )
2016-04-10 14:39:38 -07:00
}
if ! ( o . Method == COMMAND_METHOD_GET || o . Method == COMMAND_METHOD_POST ) {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.method.app_error" , nil , "" , http . StatusBadRequest )
2016-04-10 14:39:38 -07:00
}
2016-05-15 14:02:30 -07:00
if len ( o . DisplayName ) > 64 {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.display_name.app_error" , nil , "" , http . StatusBadRequest )
2016-05-15 14:02:30 -07:00
}
if len ( o . Description ) > 128 {
2018-02-08 15:11:04 -08:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.description.app_error" , nil , "" , http . StatusBadRequest )
2016-05-15 14:02:30 -07:00
}
2020-08-09 15:29:54 -07:00
if o . AutocompleteData != nil {
if err := o . AutocompleteData . IsValid ( ) ; err != nil {
return NewAppError ( "Command.IsValid" , "model.command.is_valid.autocomplete_data.app_error" , nil , err . Error ( ) , http . StatusBadRequest )
}
}
2016-04-10 14:39:38 -07:00
return nil
}
func ( o * Command ) PreSave ( ) {
if o . Id == "" {
o . Id = NewId ( )
}
if o . Token == "" {
o . Token = NewId ( )
}
o . CreateAt = GetMillis ( )
o . UpdateAt = o . CreateAt
}
func ( o * Command ) PreUpdate ( ) {
o . UpdateAt = GetMillis ( )
}
func ( o * Command ) Sanitize ( ) {
o . Token = ""
o . CreatorId = ""
o . Method = ""
o . URL = ""
o . Username = ""
o . IconURL = ""
}