From 27586a320add265f3e032d2cb21b27e93b51a2b0 Mon Sep 17 00:00:00 2001 From: =Corey Hulen Date: Mon, 1 Feb 2016 18:52:43 -0800 Subject: Adding loc to new command backend --- api/command.go | 44 +++++----- api/command_echo.go | 24 ++++-- api/command_join.go | 28 ++++--- api/command_loadtest.go | 20 +++-- api/command_logout.go | 18 ++-- api/command_me.go | 18 ++-- api/command_shrug.go | 18 ++-- api/webhook.go | 14 ++-- i18n/en.json | 204 ++++++++++++++++++++++++++++++++------------- i18n/es.json | 116 -------------------------- model/command.go | 20 ++--- store/sql_command_store.go | 15 ++-- 12 files changed, 280 insertions(+), 259 deletions(-) diff --git a/api/command.go b/api/command.go index 985735fe2..f01727062 100644 --- a/api/command.go +++ b/api/command.go @@ -4,6 +4,7 @@ package api import ( + "fmt" "io/ioutil" "net/http" "net/url" @@ -16,14 +17,15 @@ import ( ) type CommandProvider interface { - GetCommand() *model.Command + GetTrigger() string + GetCommand(c *Context) *model.Command DoCommand(c *Context, channelId string, message string) *model.CommandResponse } var commandProviders = make(map[string]CommandProvider) func RegisterCommandProvider(newProvider CommandProvider) { - commandProviders[newProvider.GetCommand().Trigger] = newProvider + commandProviders[newProvider.GetTrigger()] = newProvider } func GetCommandProvidersProvider(name string) CommandProvider { @@ -56,7 +58,7 @@ func listCommands(c *Context, w http.ResponseWriter, r *http.Request) { commands := make([]*model.Command, 0, 32) seen := make(map[string]bool) for _, value := range commandProviders { - cpy := *value.GetCommand() + cpy := *value.GetCommand(c) if cpy.AutoComplete && !seen[cpy.Id] { cpy.Sanatize() seen[cpy.Trigger] = true @@ -87,7 +89,7 @@ func executeCommand(c *Context, w http.ResponseWriter, r *http.Request) { channelId := strings.TrimSpace(props["channelId"]) if len(command) <= 1 || strings.Index(command, "/") != 0 { - c.Err = model.NewLocAppError("executeCommand", "api.command.check_command.start.app_error", nil, "") + c.Err = model.NewLocAppError("executeCommand", "api.command.execute_command.start.app_error", nil, "") return } @@ -147,7 +149,7 @@ func executeCommand(c *Context, w http.ResponseWriter, r *http.Request) { teamCmds := result.Data.([]*model.Command) for _, cmd := range teamCmds { if trigger == cmd.Trigger { - l4g.Debug("Executing cmd=" + trigger + " userId=" + c.Session.UserId) + l4g.Debug(fmt.Sprintf(utils.T("api.command.execute_command.debug"), trigger, c.Session.UserId)) p := url.Values{} p.Set("token", cmd.Token) @@ -178,18 +180,18 @@ func executeCommand(c *Context, w http.ResponseWriter, r *http.Request) { } if resp, err := client.Do(req); err != nil { - c.Err = model.NewAppError("command", "Command with a trigger of '"+trigger+"' failed", err.Error()) + c.Err = model.NewLocAppError("command", "api.command.execute_command.failed.app_error", map[string]interface{}{"Trigger": trigger}, err.Error()) } else { if resp.StatusCode == http.StatusOK { response := model.CommandResponseFromJson(resp.Body) if response == nil { - c.Err = model.NewAppError("command", "Command with a trigger of '"+trigger+"' returned an empty response", "") + c.Err = model.NewLocAppError("command", "api.command.execute_command.failed_empty.app_error", map[string]interface{}{"Trigger": trigger}, "") } else { handleResponse(c, w, response, channelId) } } else { body, _ := ioutil.ReadAll(resp.Body) - c.Err = model.NewAppError("command", "Command with a trigger of '"+trigger+"' returned response "+resp.Status, string(body)) + c.Err = model.NewLocAppError("command", "api.command.execute_command.failed_resp.app_error", map[string]interface{}{"Trigger": trigger, "Status": resp.Status}, string(body)) } } @@ -200,7 +202,7 @@ func executeCommand(c *Context, w http.ResponseWriter, r *http.Request) { } } - c.Err = model.NewAppError("command", "Command with a trigger of '"+trigger+"' not found", "") + c.Err = model.NewLocAppError("command", "api.command.execute_command.not_found.app_error", map[string]interface{}{"Trigger": trigger}, "") } func handleResponse(c *Context, w http.ResponseWriter, response *model.CommandResponse, channelId string) { @@ -209,14 +211,14 @@ func handleResponse(c *Context, w http.ResponseWriter, response *model.CommandRe post.ChannelId = channelId post.Message = response.Text if _, err := CreatePost(c, post, true); err != nil { - c.Err = model.NewAppError("command", "An error while saving the command response to the channel", "") + c.Err = model.NewLocAppError("command", "api.command.execute_command.save.app_error", nil, "") } } else if response.ResponseType == model.COMMAND_RESPONSE_TYPE_EPHEMERAL { post := &model.Post{} post.ChannelId = channelId post.Message = "TODO_EPHEMERAL: " + response.Text if _, err := CreatePost(c, post, true); err != nil { - c.Err = model.NewAppError("command", "An error while saving the command response to the channel", "") + c.Err = model.NewLocAppError("command", "api.command.execute_command.save.app_error", nil, "") } } @@ -225,14 +227,14 @@ func handleResponse(c *Context, w http.ResponseWriter, response *model.CommandRe func createCommand(c *Context, w http.ResponseWriter, r *http.Request) { if !*utils.Cfg.ServiceSettings.EnableCommands { - c.Err = model.NewAppError("createCommand", "Commands have been disabled by the system admin.", "") + c.Err = model.NewLocAppError("createCommand", "api.command.disabled.app_error", nil, "") c.Err.StatusCode = http.StatusNotImplemented return } if *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations { if !(c.IsSystemAdmin() || c.IsTeamAdmin()) { - c.Err = model.NewAppError("createCommand", "Integrations have been limited to admins only.", "") + c.Err = model.NewLocAppError("createCommand", "api.command.admin_only.app_error", nil, "") c.Err.StatusCode = http.StatusForbidden return } @@ -262,14 +264,14 @@ func createCommand(c *Context, w http.ResponseWriter, r *http.Request) { func listTeamCommands(c *Context, w http.ResponseWriter, r *http.Request) { if !*utils.Cfg.ServiceSettings.EnableCommands { - c.Err = model.NewAppError("createCommand", "Commands have been disabled by the system admin.", "") + c.Err = model.NewLocAppError("listTeamCommands", "api.command.disabled.app_error", nil, "") c.Err.StatusCode = http.StatusNotImplemented return } if *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations { if !(c.IsSystemAdmin() || c.IsTeamAdmin()) { - c.Err = model.NewAppError("createCommand", "Integrations have been limited to admins only.", "") + c.Err = model.NewLocAppError("listTeamCommands", "api.command.admin_only.app_error", nil, "") c.Err.StatusCode = http.StatusForbidden return } @@ -286,14 +288,14 @@ func listTeamCommands(c *Context, w http.ResponseWriter, r *http.Request) { func regenCommandToken(c *Context, w http.ResponseWriter, r *http.Request) { if !*utils.Cfg.ServiceSettings.EnableCommands { - c.Err = model.NewAppError("createCommand", "Commands have been disabled by the system admin.", "") + c.Err = model.NewLocAppError("regenCommandToken", "api.command.disabled.app_error", nil, "") c.Err.StatusCode = http.StatusNotImplemented return } if *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations { if !(c.IsSystemAdmin() || c.IsTeamAdmin()) { - c.Err = model.NewAppError("createCommand", "Integrations have been limited to admins only.", "") + c.Err = model.NewLocAppError("regenCommandToken", "api.command.admin_only.app_error", nil, "") c.Err.StatusCode = http.StatusForbidden return } @@ -318,7 +320,7 @@ func regenCommandToken(c *Context, w http.ResponseWriter, r *http.Request) { if c.Session.TeamId != cmd.TeamId && c.Session.UserId != cmd.CreatorId && !c.IsTeamAdmin() { c.LogAudit("fail - inappropriate permissions") - c.Err = model.NewAppError("regenToken", "Inappropriate permissions to regenerate command token", "user_id="+c.Session.UserId) + c.Err = model.NewLocAppError("regenToken", "api.command.regen.app_error", nil, "user_id="+c.Session.UserId) return } } @@ -335,14 +337,14 @@ func regenCommandToken(c *Context, w http.ResponseWriter, r *http.Request) { func deleteCommand(c *Context, w http.ResponseWriter, r *http.Request) { if !*utils.Cfg.ServiceSettings.EnableCommands { - c.Err = model.NewAppError("createCommand", "Commands have been disabled by the system admin.", "") + c.Err = model.NewLocAppError("deleteCommand", "api.command.disabled.app_error", nil, "") c.Err.StatusCode = http.StatusNotImplemented return } if *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations { if !(c.IsSystemAdmin() || c.IsTeamAdmin()) { - c.Err = model.NewAppError("createCommand", "Integrations have been limited to admins only.", "") + c.Err = model.NewLocAppError("deleteCommand", "api.command.admin_only.app_error", nil, "") c.Err.StatusCode = http.StatusForbidden return } @@ -364,7 +366,7 @@ func deleteCommand(c *Context, w http.ResponseWriter, r *http.Request) { } else { if c.Session.TeamId != result.Data.(*model.Command).TeamId && c.Session.UserId != result.Data.(*model.Command).CreatorId && !c.IsTeamAdmin() { c.LogAudit("fail - inappropriate permissions") - c.Err = model.NewAppError("deleteCommand", "Inappropriate permissions to delete command", "user_id="+c.Session.UserId) + c.Err = model.NewLocAppError("deleteCommand", "api.command.delete.app_error", nil, "user_id="+c.Session.UserId) return } } diff --git a/api/command_echo.go b/api/command_echo.go index a5042c9ea..805db7ad2 100644 --- a/api/command_echo.go +++ b/api/command_echo.go @@ -17,17 +17,25 @@ var echoSem chan bool type EchoProvider struct { } +const ( + CMD_ECHO = "echo" +) + func init() { RegisterCommandProvider(&EchoProvider{}) } -func (me *EchoProvider) GetCommand() *model.Command { +func (me *EchoProvider) GetTrigger() string { + return CMD_ECHO +} + +func (me *EchoProvider) GetCommand(c *Context) *model.Command { return &model.Command{ - Trigger: "echo", + Trigger: CMD_ECHO, AutoComplete: true, - AutoCompleteDesc: "Echo back text from your account", - AutoCompleteHint: "\"message\" [delay in seconds]", - DisplayName: "echo", + AutoCompleteDesc: c.T("api.command_echo.desc"), + AutoCompleteHint: c.T("api.command_echo.hint"), + DisplayName: c.T("api.command_echo.name"), } } @@ -51,7 +59,7 @@ func (me *EchoProvider) DoCommand(c *Context, channelId string, message string) } if delay > 10000 { - return &model.CommandResponse{Text: "Delays must be under 10000 seconds", ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} + return &model.CommandResponse{Text: c.T("api.command_echo.delay.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} } if echoSem == nil { @@ -60,7 +68,7 @@ func (me *EchoProvider) DoCommand(c *Context, channelId string, message string) } if len(echoSem) >= maxThreads { - return &model.CommandResponse{Text: "High volume of echo request, cannot process request", ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} + return &model.CommandResponse{Text: c.T("api.command_echo.high_volume.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} } echoSem <- true @@ -73,7 +81,7 @@ func (me *EchoProvider) DoCommand(c *Context, channelId string, message string) time.Sleep(time.Duration(delay) * time.Second) if _, err := CreatePost(c, post, true); err != nil { - l4g.Error("Unable to create /echo post, err=%v", err) + l4g.Error(c.T("api.command_echo.create.app_error"), err) } }() diff --git a/api/command_join.go b/api/command_join.go index 67c1c1ad1..ba3b0041e 100644 --- a/api/command_join.go +++ b/api/command_join.go @@ -10,23 +10,31 @@ import ( type JoinProvider struct { } +const ( + CMD_JOIN = "join" +) + func init() { RegisterCommandProvider(&JoinProvider{}) } -func (me *JoinProvider) GetCommand() *model.Command { +func (me *JoinProvider) GetTrigger() string { + return CMD_JOIN +} + +func (me *JoinProvider) GetCommand(c *Context) *model.Command { return &model.Command{ - Trigger: "join", + Trigger: CMD_JOIN, AutoComplete: true, - AutoCompleteDesc: "Join the open channel", - AutoCompleteHint: "[channel-name]", - DisplayName: "join", + AutoCompleteDesc: c.T("api.command_join.desc"), + AutoCompleteHint: c.T("api.command_join.hint"), + DisplayName: c.T("api.command_join.name"), } } func (me *JoinProvider) DoCommand(c *Context, channelId string, message string) *model.CommandResponse { if result := <-Srv.Store.Channel().GetMoreChannels(c.Session.TeamId, c.Session.UserId); result.Err != nil { - return &model.CommandResponse{Text: "An error occured while listing channels.", ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} + return &model.CommandResponse{Text: c.T("api.command_join.list.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} } else { channels := result.Data.(*model.ChannelList) @@ -35,20 +43,20 @@ func (me *JoinProvider) DoCommand(c *Context, channelId string, message string) if v.Name == message { if v.Type == model.CHANNEL_DIRECT { - return &model.CommandResponse{Text: "An error occured while joining the channel.", ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} + return &model.CommandResponse{Text: c.T("api.command_join.fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} } JoinChannel(c, v.Id, "") if c.Err != nil { c.Err = nil - return &model.CommandResponse{Text: "An error occured while joining the channel.", ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} + return &model.CommandResponse{Text: c.T("api.command_join.fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} } - return &model.CommandResponse{GotoLocation: c.GetTeamURL() + "/channels/" + v.Name, Text: "Joined channel.", ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} + return &model.CommandResponse{GotoLocation: c.GetTeamURL() + "/channels/" + v.Name, Text: c.T("api.command_join.success"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} } } } - return &model.CommandResponse{ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, Text: "We couldn't find the channel"} + return &model.CommandResponse{ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, Text: c.T("api.command_join.missing.app_error")} } diff --git a/api/command_loadtest.go b/api/command_loadtest.go index 8f79006b4..e320176f4 100644 --- a/api/command_loadtest.go +++ b/api/command_loadtest.go @@ -52,6 +52,10 @@ var usage = `Mattermost load testing commands to help configure the system ` +const ( + CMD_LOADTEST = "loadtest" +) + type LoadTestProvider struct { } @@ -61,9 +65,13 @@ func init() { } } -func (me *LoadTestProvider) GetCommand() *model.Command { +func (me *LoadTestProvider) GetTrigger() string { + return CMD_LOADTEST +} + +func (me *LoadTestProvider) GetCommand(c *Context) *model.Command { return &model.Command{ - Trigger: "loadtest", + Trigger: CMD_LOADTEST, AutoComplete: false, AutoCompleteDesc: "Debug Load Testing", AutoCompleteHint: "help", @@ -73,10 +81,10 @@ func (me *LoadTestProvider) GetCommand() *model.Command { func (me *LoadTestProvider) DoCommand(c *Context, channelId string, message string) *model.CommandResponse { - // This command is only available when EnableTesting is true - // if !utils.Cfg.ServiceSettings.EnableTesting { - // return &model.CommandResponse{} - // } + //This command is only available when EnableTesting is true + if !utils.Cfg.ServiceSettings.EnableTesting { + return &model.CommandResponse{} + } if strings.HasPrefix(message, "setup") { return me.SetupCommand(c, channelId, message) diff --git a/api/command_logout.go b/api/command_logout.go index 01e81aaf0..fb69b4f85 100644 --- a/api/command_logout.go +++ b/api/command_logout.go @@ -10,20 +10,28 @@ import ( type LogoutProvider struct { } +const ( + CMD_LOGOUT = "logout" +) + func init() { RegisterCommandProvider(&LogoutProvider{}) } -func (me *LogoutProvider) GetCommand() *model.Command { +func (me *LogoutProvider) GetTrigger() string { + return CMD_LOGOUT +} + +func (me *LogoutProvider) GetCommand(c *Context) *model.Command { return &model.Command{ - Trigger: "logout", + Trigger: CMD_LOGOUT, AutoComplete: true, - AutoCompleteDesc: "Logout", + AutoCompleteDesc: c.T("api.command_logout.desc"), AutoCompleteHint: "", - DisplayName: "logout", + DisplayName: c.T("api.command_logout.name"), } } func (me *LogoutProvider) DoCommand(c *Context, channelId string, message string) *model.CommandResponse { - return &model.CommandResponse{GotoLocation: "/logout", ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, Text: "Logging out..."} + return &model.CommandResponse{GotoLocation: "/logout", ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, Text: c.T("api.command_logout.success_message")} } diff --git a/api/command_me.go b/api/command_me.go index f0154fe53..c6147278b 100644 --- a/api/command_me.go +++ b/api/command_me.go @@ -10,17 +10,25 @@ import ( type MeProvider struct { } +const ( + CMD_ME = "me" +) + func init() { RegisterCommandProvider(&MeProvider{}) } -func (me *MeProvider) GetCommand() *model.Command { +func (me *MeProvider) GetTrigger() string { + return CMD_ME +} + +func (me *MeProvider) GetCommand(c *Context) *model.Command { return &model.Command{ - Trigger: "me", + Trigger: CMD_ME, AutoComplete: true, - AutoCompleteDesc: "Do an action", - AutoCompleteHint: "[message]", - DisplayName: "me", + AutoCompleteDesc: c.T("api.command_me.desc"), + AutoCompleteHint: c.T("api.command_me.hint"), + DisplayName: c.T("api.command_me.name"), } } diff --git a/api/command_shrug.go b/api/command_shrug.go index c49bd46ae..8fb5bc200 100644 --- a/api/command_shrug.go +++ b/api/command_shrug.go @@ -10,17 +10,25 @@ import ( type ShrugProvider struct { } +const ( + CMD_SHRUG = "shrug" +) + func init() { RegisterCommandProvider(&ShrugProvider{}) } -func (me *ShrugProvider) GetCommand() *model.Command { +func (me *ShrugProvider) GetTrigger() string { + return CMD_SHRUG +} + +func (me *ShrugProvider) GetCommand(c *Context) *model.Command { return &model.Command{ - Trigger: "shrug", + Trigger: CMD_SHRUG, AutoComplete: true, - AutoCompleteDesc: `Adds ¯\_(ツ)_/¯ to your message`, - AutoCompleteHint: "[message]", - DisplayName: "shrug", + AutoCompleteDesc: c.T("api.command_shrug.desc"), + AutoCompleteHint: c.T("api.command_shrug.hint"), + DisplayName: c.T("api.command_shrug.name"), } } diff --git a/api/webhook.go b/api/webhook.go index 399f62fdb..3906d09be 100644 --- a/api/webhook.go +++ b/api/webhook.go @@ -34,7 +34,7 @@ func createIncomingHook(c *Context, w http.ResponseWriter, r *http.Request) { if *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations { if !(c.IsSystemAdmin() || c.IsTeamAdmin()) { - c.Err = model.NewAppError("createCommand", "Integrations have been limited to admins only.", "") + c.Err = model.NewLocAppError("createIncomingHook", "api.command.admin_only.app_error", nil, "") c.Err.StatusCode = http.StatusForbidden return } @@ -89,7 +89,7 @@ func deleteIncomingHook(c *Context, w http.ResponseWriter, r *http.Request) { if *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations { if !(c.IsSystemAdmin() || c.IsTeamAdmin()) { - c.Err = model.NewAppError("createCommand", "Integrations have been limited to admins only.", "") + c.Err = model.NewLocAppError("deleteIncomingHook", "api.command.admin_only.app_error", nil, "") c.Err.StatusCode = http.StatusForbidden return } @@ -134,7 +134,7 @@ func getIncomingHooks(c *Context, w http.ResponseWriter, r *http.Request) { if *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations { if !(c.IsSystemAdmin() || c.IsTeamAdmin()) { - c.Err = model.NewAppError("createCommand", "Integrations have been limited to admins only.", "") + c.Err = model.NewLocAppError("getIncomingHooks", "api.command.admin_only.app_error", nil, "") c.Err.StatusCode = http.StatusForbidden return } @@ -158,7 +158,7 @@ func createOutgoingHook(c *Context, w http.ResponseWriter, r *http.Request) { if *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations { if !(c.IsSystemAdmin() || c.IsTeamAdmin()) { - c.Err = model.NewAppError("createCommand", "Integrations have been limited to admins only.", "") + c.Err = model.NewLocAppError("createOutgoingHook", "api.command.admin_only.app_error", nil, "") c.Err.StatusCode = http.StatusForbidden return } @@ -222,7 +222,7 @@ func getOutgoingHooks(c *Context, w http.ResponseWriter, r *http.Request) { if *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations { if !(c.IsSystemAdmin() || c.IsTeamAdmin()) { - c.Err = model.NewAppError("createCommand", "Integrations have been limited to admins only.", "") + c.Err = model.NewLocAppError("getOutgoingHooks", "api.command.admin_only.app_error", nil, "") c.Err.StatusCode = http.StatusForbidden return } @@ -246,7 +246,7 @@ func deleteOutgoingHook(c *Context, w http.ResponseWriter, r *http.Request) { if *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations { if !(c.IsSystemAdmin() || c.IsTeamAdmin()) { - c.Err = model.NewAppError("createCommand", "Integrations have been limited to admins only.", "") + c.Err = model.NewLocAppError("deleteOutgoingHook", "api.command.admin_only.app_error", nil, "") c.Err.StatusCode = http.StatusForbidden return } @@ -291,7 +291,7 @@ func regenOutgoingHookToken(c *Context, w http.ResponseWriter, r *http.Request) if *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations { if !(c.IsSystemAdmin() || c.IsTeamAdmin()) { - c.Err = model.NewAppError("createCommand", "Integrations have been limited to admins only.", "") + c.Err = model.NewLocAppError("regenOutgoingHookToken", "api.command.admin_only.app_error", nil, "") c.Err.StatusCode = http.StatusForbidden return } diff --git a/i18n/en.json b/i18n/en.json index 0f219be0e..8a3e993d2 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -244,120 +244,140 @@ "translation": "Tried to perform an invalid update of the default channel {{.Channel}}" }, { - "id": "api.command.check_command.start.app_error", - "translation": "Command must start with /" + "id": "api.command.init.debug", + "translation": "Initializing command api routes" }, { - "id": "api.command.echo_command.create.error", - "translation": "Unable to create /echo post, err=%v" + "id": "api.command.execute_command.start.app_error", + "translation": "No command trigger found" }, { - "id": "api.command.echo_command.description", - "translation": "Echo back text from your account, /echo \"message\" [delay in seconds]" + "id": "api.command.execute_command.debug", + "translation": "Executing cmd=%v userId=%v" }, { - "id": "api.command.echo_command.high_volume.app_error", - "translation": "High volume of echo request, cannot process request" + "id": "api.command.execute_command.failed.app_error", + "translation": "Command with a trigger of '{{.Trigger}}' failed" }, { - "id": "api.command.echo_command.under.app_error", - "translation": "Delays must be under 10000 seconds" + "id": "api.command.execute_command.failed_empty.app_error", + "translation": "Command with a trigger of '{{.Trigger}}' returned an empty response" }, { - "id": "api.command.init.debug", - "translation": "Initializing command api routes" + "id": "api.command.execute_command.failed_resp.app_error", + "translation": "Command with a trigger of '{{.Trigger}}' returned response {{.Status}}" + }, + { + "id": "api.command.execute_command.not_found.app_error", + "translation": "Command with a trigger of '{{.Trigger}}' not found" + }, + { + "id": "api.command.execute_command.save.app_error", + "translation": "An error while saving the command response to the channel" }, { - "id": "api.command.load_test_channels_command.channel.description", - "translation": "Add a specified number of random channels to current team " + "id": "api.command.disabled.app_error", + "translation": "Commands have been disabled by the system admin." }, { - "id": "api.command.load_test_channels_command.fuzz.description", - "translation": "Add a specified number of random channels with fuzz text to current team " + "id": "api.command.admin_only.app_error", + "translation": "Integrations have been limited to admins only." }, { - "id": "api.command.load_test_command.description", - "translation": "Debug Load Testing" + "id": "api.command.regen.app_error", + "translation": "Inappropriate permissions to regenerate command token" }, { - "id": "api.command.load_test_posts_command.fuzz.description", - "translation": "Add some random posts with fuzz text to current channel " + "id": "api.command.delete.app_error", + "translation": "Inappropriate permissions to delete command" }, { - "id": "api.command.load_test_posts_command.posts.description", - "translation": "Add some random posts to current channel " + "id": "api.command_echo.desc", + "translation": "Echo back text from your account" }, { - "id": "api.command.load_test_setup_command.create.error", - "translation": "Failed to create testing environment" + "id": "api.command_echo.hint", + "translation": "'message' [delay in seconds]" }, { - "id": "api.command.load_test_setup_command.created.info", - "translation": "Team Created: %v" + "id": "api.command_echo.name", + "translation": "echo" }, { - "id": "api.command.load_test_setup_command.description", - "translation": "Creates a testing environment in current team. [teams] [fuzz] " + "id": "api.command_echo.delay.app_error", + "translation": "Delays must be under 10000 seconds" }, { - "id": "api.command.load_test_setup_command.login.info", - "translation": "\t User to login: %v, %v" + "id": "api.command_echo.high_volume.app_error", + "translation": "High volume of echo request, cannot process request" }, { - "id": "api.command.load_test_url_command.create.error", - "translation": "Unable to create post, err=%v" + "id": "api.command_echo.create.app_error", + "translation": "Unable to create /echo post, err=%v" }, { - "id": "api.command.load_test_url_command.description", - "translation": "Add a post containing the text from a given url to current channel " + "id": "api.command_join.desc", + "translation": "Join the open channel" }, { - "id": "api.command.load_test_url_command.file.app_error", - "translation": "Unable to get file" + "id": "api.command_join.hint", + "translation": "[channel-name]" }, { - "id": "api.command.load_test_url_command.reading.app_error", - "translation": "Encountered error reading file" + "id": "api.command_join.name", + "translation": "join" }, { - "id": "api.command.load_test_url_command.url.app_error", - "translation": "Command must contain a url" + "id": "api.command_join.list.app_error", + "translation": "An error occured while listing channels." }, { - "id": "api.command.load_test_users_command.fuzz.description", - "translation": "Add a specified number of random users with fuzz text to current team " + "id": "api.command_join.fail.app_error", + "translation": "An error occured while joining the channel." }, { - "id": "api.command.load_test_users_command.users.description", - "translation": "Add a specified number of random users to current team " + "id": "api.command_join.success", + "translation": "Joined channel." }, { - "id": "api.command.logout_command.description", - "translation": "Logout" + "id": "api.command_join.missing.app_error", + "translation": "We couldn't find the channel" }, { - "id": "api.command.me_command.create.error", - "translation": "Unable to create /me post post, err=%v" + "id": "api.command_logout.desc", + "translation": "Logout of Mattermost" }, { - "id": "api.command.me_command.description", - "translation": "Do an action, /me [message]" + "id": "api.command_logout.name", + "translation": "logout" }, { - "id": "api.command.no_implemented.app_error", - "translation": "Command not implemented" + "id": "api.command_logout.success_message", + "translation": "Logging out..." }, { - "id": "api.command.shrug_command.create.error", - "translation": "Unable to create /shrug post post, err=%v" + "id": "api.command_me.desc", + "translation": "Do an action" }, { - "id": "api.command.shrug_command.description", - "translation": "Adds ¯\\_(ツ)_/¯ to your message, /shrug [message]" + "id": "api.command_me.hint", + "translation": "[message]" }, { - "id": "api.commmand.join_command.description", - "translation": "Join the open channel" + "id": "api.command_me.name", + "translation": "me" + }, + { + "id": "api.command_shrug.desc", + "translation": "Adds ¯\\_(ツ)_/¯ to your message" + }, + { + "id": "api.command_shrug.hint", + "translation": "[message]" + }, + { + "id": "api.command_shrug.name", + "translation": "shrug" }, { "id": "api.context.404.app_error", @@ -1775,6 +1795,46 @@ "id": "model.channel.is_valid.2_or_more.app_error", "translation": "Name must be 2 or more lowercase alphanumeric characters" }, + { + "id": "model.command.is_valid.id.app_error", + "translation": "Invalid Id" + }, + { + "id": "model.command.is_valid.token.app_error", + "translation": "Invalid token" + }, + { + "id": "model.command.is_valid.create_at.app_error", + "translation": "Create at must be a valid time" + }, + { + "id": "model.command.is_valid.update_at.app_error", + "translation": "Update at must be a valid time" + }, + { + "id": "model.command.is_valid.user_id.app_error", + "translation": "Invalid user id" + }, + { + "id": "model.command.is_valid.team_id.app_error", + "translation": "Invalid team id" + }, + { + "id": "model.command.is_valid.trigger.app_error", + "translation": "Invalid trigger" + }, + { + "id": "model.command.is_valid.url.app_error", + "translation": "Invalid url" + }, + { + "id": "model.command.is_valid.url_http.app_error", + "translation": "Invalid URL. Must be a valid URL and start with http:// or https://" + }, + { + "id": "model.command.is_valid.method.app_error", + "translation": "Invalid Method" + }, { "id": "model.channel.is_valid.create_at.app_error", "translation": "Create at must be a valid time" @@ -2343,6 +2403,34 @@ "id": "store.sql_audit.save.saving.app_error", "translation": "We encountered an error saving the audit" }, + { + "id": "store.sql_command.save.saving_overwrite.app_error", + "translation": "You cannot overwrite an existing Command" + }, + { + "id": "store.sql_command.save.saving.app_error", + "translation": "We couldn't save the Command" + }, + { + "id": "store.sql_command.save.get.app_error", + "translation": "We couldn't get the command" + }, + { + "id": "store.sql_command.save.get_team.app_error", + "translation": "We couldn't get the commands" + }, + { + "id": "store.sql_command.save.delete.app_error", + "translation": "We couldn't delete the command" + }, + { + "id": "store.sql_command.save.delete_perm.app_error", + "translation": "We couldn't delete the command" + }, + { + "id": "store.sql_command.save.update.app_error", + "translation": "We couldn't update the command" + }, { "id": "store.sql_channel.analytics_type_count.app_error", "translation": "We couldn't get channel type counts" diff --git a/i18n/es.json b/i18n/es.json index ee48c9acb..a79048652 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -243,122 +243,6 @@ "id": "api.channel.update_channel.tried.app_error", "translation": "Intento de realizar una actualización inválida al canal predeterminado {{.Channel}}" }, - { - "id": "api.command.check_command.start.app_error", - "translation": "El comando debe comenzar con /" - }, - { - "id": "api.command.echo_command.create.error", - "translation": "No se puede crear /echo mensaje, err=%v" - }, - { - "id": "api.command.echo_command.description", - "translation": "Echo del texto desde tu cuenta, /echo \"mensaje\" [retraso en segundos]" - }, - { - "id": "api.command.echo_command.high_volume.app_error", - "translation": "Volumen alto de solicitudes echo, no se puede procesar la solicitud" - }, - { - "id": "api.command.echo_command.under.app_error", - "translation": "El retraso debe ser menor a 10000 segundos" - }, - { - "id": "api.command.init.debug", - "translation": "Inicializando rutas del API para los comandos" - }, - { - "id": "api.command.load_test_channels_command.channel.description", - "translation": "Agrega un número específico de canales aleatorios al equipo actual " - }, - { - "id": "api.command.load_test_channels_command.fuzz.description", - "translation": "Agrega un número específico de canales aleatorios con el texto fuzz al equipo actual " - }, - { - "id": "api.command.load_test_command.description", - "translation": "Depurar pruebas de carga" - }, - { - "id": "api.command.load_test_posts_command.fuzz.description", - "translation": "Agrega algunos mensajes aleatorios con el texto fuzz al canal actual " - }, - { - "id": "api.command.load_test_posts_command.posts.description", - "translation": "Agrega algunos mensajes aleatorios al canal actual " - }, - { - "id": "api.command.load_test_setup_command.create.error", - "translation": "Falla al crear el entorno de pruebas" - }, - { - "id": "api.command.load_test_setup_command.created.info", - "translation": "Equipo Creado: %v" - }, - { - "id": "api.command.load_test_setup_command.description", - "translation": "Crea un entorno de prueba para el equipo actual. [equipos] [fuzz] " - }, - { - "id": "api.command.load_test_setup_command.login.info", - "translation": "\t Usuario que inicia sesión: %v, %v" - }, - { - "id": "api.command.load_test_url_command.create.error", - "translation": "No se pudo crear el mensaje, err=%v" - }, - { - "id": "api.command.load_test_url_command.description", - "translation": "Agraga un mensaje que contiene el texto de un url dado al canal actual " - }, - { - "id": "api.command.load_test_url_command.file.app_error", - "translation": "No se puede obtener el archivo" - }, - { - "id": "api.command.load_test_url_command.reading.app_error", - "translation": "Se encontró un error leyendo el archivo" - }, - { - "id": "api.command.load_test_url_command.url.app_error", - "translation": "El comando debe contener un url" - }, - { - "id": "api.command.load_test_users_command.fuzz.description", - "translation": "Agraga un número específico de usuarios aleatorios con el texto fuzz al equipo actual " - }, - { - "id": "api.command.load_test_users_command.users.description", - "translation": "Agrega un número específico de usuarios aleatorios al equipo actual " - }, - { - "id": "api.command.logout_command.description", - "translation": "Cerrar sesión" - }, - { - "id": "api.command.me_command.create.error", - "translation": "No se pudo crear el mensaje /me mensaje, err=%v" - }, - { - "id": "api.command.me_command.description", - "translation": "Realiza una acción, /me [mensaje]" - }, - { - "id": "api.command.no_implemented.app_error", - "translation": "Comando no implementado" - }, - { - "id": "api.command.shrug_command.create.error", - "translation": "No se pudo crear el mensaje /shrug mensaje, err=%v" - }, - { - "id": "api.command.shrug_command.description", - "translation": "Agrega ¯\\_(ツ)_/¯ a tu mensaje, /shrug [mensaje]" - }, - { - "id": "api.commmand.join_command.description", - "translation": "Unirme al canal abierto" - }, { "id": "api.context.404.app_error", "translation": "Lo sentimos, pero no pudimos encontrar la página." diff --git a/model/command.go b/model/command.go index c917a46ea..4a726b4ac 100644 --- a/model/command.go +++ b/model/command.go @@ -75,43 +75,43 @@ func CommandListFromJson(data io.Reader) []*Command { func (o *Command) IsValid() *AppError { if len(o.Id) != 26 { - return NewAppError("Command.IsValid", "Invalid Id", "") + return NewLocAppError("Command.IsValid", "model.command.is_valid.id.app_error", nil, "") } if len(o.Token) != 26 { - return NewAppError("Command.IsValid", "Invalid token", "") + return NewLocAppError("Command.IsValid", "model.command.is_valid.token.app_error", nil, "") } if o.CreateAt == 0 { - return NewAppError("Command.IsValid", "Create at must be a valid time", "id="+o.Id) + return NewLocAppError("Command.IsValid", "model.command.is_valid.create_at.app_error", nil, "") } if o.UpdateAt == 0 { - return NewAppError("Command.IsValid", "Update at must be a valid time", "id="+o.Id) + return NewLocAppError("Command.IsValid", "model.command.is_valid.update_at.app_error", nil, "") } if len(o.CreatorId) != 26 { - return NewAppError("Command.IsValid", "Invalid user id", "") + return NewLocAppError("Command.IsValid", "model.command.is_valid.user_id.app_error", nil, "") } if len(o.TeamId) != 26 { - return NewAppError("Command.IsValid", "Invalid team id", "") + return NewLocAppError("Command.IsValid", "model.command.is_valid.team_id.app_error", nil, "") } if len(o.Trigger) > 1024 { - return NewAppError("Command.IsValid", "Invalid trigger", "") + return NewLocAppError("Command.IsValid", "model.command.is_valid.trigger.app_error", nil, "") } if len(o.URL) == 0 || len(o.URL) > 1024 { - return NewAppError("Command.IsValid", "Invalid url", "") + return NewLocAppError("Command.IsValid", "model.command.is_valid.url.app_error", nil, "") } if !IsValidHttpUrl(o.URL) { - return NewAppError("Command.IsValid", "Invalid URL. Must be a valid URL and start with http:// or https://", "") + return NewLocAppError("Command.IsValid", "model.command.is_valid.url_http.app_error", nil, "") } if !(o.Method == COMMAND_METHOD_GET || o.Method == COMMAND_METHOD_POST) { - return NewAppError("Command.IsValid", "Invalid Method", "") + return NewLocAppError("Command.IsValid", "model.command.is_valid.method.app_error", nil, "") } return nil diff --git a/store/sql_command_store.go b/store/sql_command_store.go index cb817d8f8..760235e10 100644 --- a/store/sql_command_store.go +++ b/store/sql_command_store.go @@ -47,8 +47,7 @@ func (s SqlCommandStore) Save(command *model.Command) StoreChannel { result := StoreResult{} if len(command.Id) > 0 { - result.Err = model.NewAppError("SqlCommandStore.Save", - "You cannot overwrite an existing Command", "id="+command.Id) + result.Err = model.NewLocAppError("SqlCommandStore.Save", "store.sql_command.save.saving_overwrite.app_error", nil, "id="+command.Id) storeChannel <- result close(storeChannel) return @@ -62,7 +61,7 @@ func (s SqlCommandStore) Save(command *model.Command) StoreChannel { } if err := s.GetMaster().Insert(command); err != nil { - result.Err = model.NewAppError("SqlCommandStore.Save", "We couldn't save the Command", "id="+command.Id+", "+err.Error()) + result.Err = model.NewLocAppError("SqlCommandStore.Save", "store.sql_command.save.saving.app_error", nil, "id="+command.Id+", "+err.Error()) } else { result.Data = command } @@ -83,7 +82,7 @@ func (s SqlCommandStore) Get(id string) StoreChannel { 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 { - result.Err = model.NewAppError("SqlCommandStore.Get", "We couldn't get the command", "id="+id+", err="+err.Error()) + result.Err = model.NewLocAppError("SqlCommandStore.Get", "store.sql_command.save.get.app_error", nil, "id="+id+", err="+err.Error()) } result.Data = &command @@ -104,7 +103,7 @@ func (s SqlCommandStore) GetByTeam(teamId string) StoreChannel { 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 { - result.Err = model.NewAppError("SqlCommandStore.GetByTeam", "We couldn't get the commands", "teamId="+teamId+", err="+err.Error()) + result.Err = model.NewLocAppError("SqlCommandStore.GetByTeam", "store.sql_command.save.get_team.app_error", nil, "teamId="+teamId+", err="+err.Error()) } result.Data = commands @@ -124,7 +123,7 @@ func (s SqlCommandStore) Delete(commandId string, time int64) StoreChannel { _, 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 { - result.Err = model.NewAppError("SqlCommandStore.Delete", "We couldn't delete the command", "id="+commandId+", err="+err.Error()) + result.Err = model.NewLocAppError("SqlCommandStore.Delete", "store.sql_command.save.delete.app_error", nil, "id="+commandId+", err="+err.Error()) } storeChannel <- result @@ -142,7 +141,7 @@ func (s SqlCommandStore) PermanentDeleteByUser(userId string) StoreChannel { _, err := s.GetMaster().Exec("DELETE FROM Commands WHERE CreatorId = :UserId", map[string]interface{}{"UserId": userId}) if err != nil { - result.Err = model.NewAppError("SqlCommandStore.DeleteByUser", "We couldn't delete the command", "id="+userId+", err="+err.Error()) + result.Err = model.NewLocAppError("SqlCommandStore.DeleteByUser", "store.sql_command.save.delete_perm.app_error", nil, "id="+userId+", err="+err.Error()) } storeChannel <- result @@ -161,7 +160,7 @@ func (s SqlCommandStore) Update(hook *model.Command) StoreChannel { hook.UpdateAt = model.GetMillis() if _, err := s.GetMaster().Update(hook); err != nil { - result.Err = model.NewAppError("SqlCommandStore.Update", "We couldn't update the command", "id="+hook.Id+", "+err.Error()) + result.Err = model.NewLocAppError("SqlCommandStore.Update", "store.sql_command.save.update.app_error", nil, "id="+hook.Id+", "+err.Error()) } else { result.Data = hook } -- cgit v1.2.3-1-g7c22