2019-11-29 06:59:40 -05:00
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
2015-06-15 03:53:32 -04:00
package model
import (
2017-09-15 08:32:11 -04:00
"net/http"
2016-05-20 14:47:10 -04:00
"strings"
2015-06-15 03:53:32 -04:00
)
const (
2021-07-12 14:05:36 -04:00
CommandMethodPost = "P"
CommandMethodGet = "G"
MinTriggerLength = 1
MaxTriggerLength = 128
2015-06-15 03:53:32 -04:00
)
type Command struct {
2020-07-31 11:40:15 -04: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-05-21 04:24:56 -04:00
AutocompleteData * AutocompleteData ` db:"-" json:"autocomplete_data,omitempty" `
// AutocompleteIconData is a base64 encoded svg
AutocompleteIconData string ` db:"-" json:"autocomplete_icon_data,omitempty" `
2015-06-15 03:53:32 -04:00
}
2025-03-31 04:44:34 -04:00
func ( o * Command ) Auditable ( ) map [ string ] any {
return map [ string ] any {
2022-07-14 07:52:46 -04:00
"id" : o . Id ,
"create_at" : o . CreateAt ,
"update_at" : o . UpdateAt ,
"delete_at" : o . DeleteAt ,
"creator_id" : o . CreatorId ,
"team_id" : o . TeamId ,
"trigger" : o . Trigger ,
"username" : o . Username ,
"icon_url" : o . IconURL ,
"auto_complete" : o . AutoComplete ,
"auto_complete_desc" : o . AutoCompleteDesc ,
"auto_complete_hint" : o . AutoCompleteHint ,
"display_name" : o . DisplayName ,
"description" : o . Description ,
"url" : o . URL ,
}
}
2016-01-06 22:09:05 -05:00
func ( o * Command ) IsValid ( ) * AppError {
2020-05-07 13:27:35 -04:00
if ! IsValidId ( o . Id ) {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.id.app_error" , nil , "" , http . StatusBadRequest )
2016-01-06 22:09:05 -05:00
}
if len ( o . Token ) != 26 {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.token.app_error" , nil , "" , http . StatusBadRequest )
2016-01-06 22:09:05 -05:00
}
if o . CreateAt == 0 {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.create_at.app_error" , nil , "" , http . StatusBadRequest )
2016-01-06 22:09:05 -05:00
}
if o . UpdateAt == 0 {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.update_at.app_error" , nil , "" , http . StatusBadRequest )
2016-01-06 22:09:05 -05:00
}
2020-07-31 11:40:15 -04: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 ) {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.user_id.app_error" , nil , "" , http . StatusBadRequest )
2016-01-06 22:09:05 -05:00
}
2020-07-31 11:40:15 -04: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-05-07 13:27:35 -04:00
if ! IsValidId ( o . TeamId ) {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.team_id.app_error" , nil , "" , http . StatusBadRequest )
2016-01-06 22:09:05 -05:00
}
2021-07-12 14:05:36 -04:00
if len ( o . Trigger ) < MinTriggerLength || len ( o . Trigger ) > MaxTriggerLength || strings . Index ( o . Trigger , "/" ) == 0 || strings . Contains ( o . Trigger , " " ) {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.trigger.app_error" , nil , "" , http . StatusBadRequest )
2016-01-06 22:09:05 -05:00
}
2021-01-25 05:15:17 -05:00
if o . URL == "" || len ( o . URL ) > 1024 {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.url.app_error" , nil , "" , http . StatusBadRequest )
2016-01-06 22:09:05 -05:00
}
2021-08-16 13:46:44 -04:00
if ! IsValidHTTPURL ( o . URL ) {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.url_http.app_error" , nil , "" , http . StatusBadRequest )
2016-01-06 22:09:05 -05:00
}
2021-07-12 14:05:36 -04:00
if ! ( o . Method == CommandMethodGet || o . Method == CommandMethodPost ) {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.method.app_error" , nil , "" , http . StatusBadRequest )
2016-01-06 22:09:05 -05:00
}
2016-03-30 10:56:20 -04:00
if len ( o . DisplayName ) > 64 {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.display_name.app_error" , nil , "" , http . StatusBadRequest )
2016-03-30 10:56:20 -04:00
}
if len ( o . Description ) > 128 {
2017-09-15 08:32:11 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.description.app_error" , nil , "" , http . StatusBadRequest )
2016-03-30 10:56:20 -04:00
}
2020-05-21 04:24:56 -04:00
if o . AutocompleteData != nil {
if err := o . AutocompleteData . IsValid ( ) ; err != nil {
2022-08-18 05:01:37 -04:00
return NewAppError ( "Command.IsValid" , "model.command.is_valid.autocomplete_data.app_error" , nil , "" , http . StatusBadRequest ) . Wrap ( err )
2020-05-21 04:24:56 -04:00
}
}
2016-01-06 22:09:05 -05: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 ( )
}
2016-01-08 23:57:38 -05:00
2016-02-03 15:16:37 -05:00
func ( o * Command ) Sanitize ( ) {
2016-01-08 23:57:38 -05:00
o . Token = ""
o . CreatorId = ""
o . Method = ""
o . URL = ""
o . Username = ""
o . IconURL = ""
}