From 3bc89083fca64a1d096cc897f13d0a9b68433a8f Mon Sep 17 00:00:00 2001 From: Charles Kenney Date: Wed, 17 Oct 2018 20:31:51 -0400 Subject: Add GetFileLink method to plugin API (#9665) * add GetFileLink method to plugin API * Update plugin/api.go * add translations for new plugin API errors --- app/plugin_api.go | 17 +++++++++++++++++ i18n/en.json | 8 ++++++++ plugin/api.go | 5 +++++ plugin/client_rpc_generated.go | 29 +++++++++++++++++++++++++++++ plugin/plugintest/api.go | 23 +++++++++++++++++++++++ 5 files changed, 82 insertions(+) diff --git a/app/plugin_api.go b/app/plugin_api.go index 3574c0298..32e3d6303 100644 --- a/app/plugin_api.go +++ b/app/plugin_api.go @@ -369,6 +369,23 @@ func (api *PluginAPI) GetFileInfo(fileId string) (*model.FileInfo, *model.AppErr return api.app.GetFileInfo(fileId) } +func (api *PluginAPI) GetFileLink(fileId string) (string, *model.AppError) { + if !api.app.Config().FileSettings.EnablePublicLink { + return "", model.NewAppError("GetFileLink", "plugin_api.get_file_link.disabled.app_error", nil, "", http.StatusNotImplemented) + } + + info, err := api.app.GetFileInfo(fileId) + if err != nil { + return "", err + } + + if len(info.PostId) == 0 { + return "", model.NewAppError("GetFileLink", "plugin_api.get_file_link.no_post.app_error", nil, "file_id="+info.Id, http.StatusBadRequest) + } + + return api.app.GeneratePublicLink(api.app.GetSiteURL(), info), nil +} + func (api *PluginAPI) ReadFile(path string) ([]byte, *model.AppError) { return api.app.ReadFile(path) } diff --git a/i18n/en.json b/i18n/en.json index d5a6f519a..7f4e8c4a5 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -4842,6 +4842,14 @@ "id": "oauth.gitlab.tos.error", "translation": "GitLab's Terms of Service have updated. Please go to gitlab.com to accept them and then try logging into Mattermost again." }, + { + "id": "plugin_api.get_file_link.disabled.app_error", + "translation": "Public links have been disabled" + }, + { + "id": "plugin_api.get_file_link.no_post.app_error", + "translation": "Unable to get public link for file. File must be attached to a post that can be read." + }, { "id": "plugin.api.update_user_status.bad_status", "translation": "Unable to set the user status. Unknown user status." diff --git a/plugin/api.go b/plugin/api.go index 3e35811b8..660309f57 100644 --- a/plugin/api.go +++ b/plugin/api.go @@ -256,6 +256,11 @@ type API interface { // Minimum server version: 5.3 GetFileInfo(fileId string) (*model.FileInfo, *model.AppError) + // GetFileLink gets the public link to a file by fileId. + // + // Minimum server version: 5.6 + GetFileLink(fileId string) (string, *model.AppError) + // ReadFileAtPath reads the file from the backend for a specific path // // Minimum server version: 5.3 diff --git a/plugin/client_rpc_generated.go b/plugin/client_rpc_generated.go index f7db87e2e..4648b86ce 100644 --- a/plugin/client_rpc_generated.go +++ b/plugin/client_rpc_generated.go @@ -2399,6 +2399,35 @@ func (s *apiRPCServer) GetFileInfo(args *Z_GetFileInfoArgs, returns *Z_GetFileIn return nil } +type Z_GetFileLinkArgs struct { + A string +} + +type Z_GetFileLinkReturns struct { + A string + B *model.AppError +} + +func (g *apiRPCClient) GetFileLink(fileId string) (string, *model.AppError) { + _args := &Z_GetFileLinkArgs{fileId} + _returns := &Z_GetFileLinkReturns{} + if err := g.client.Call("Plugin.GetFileLink", _args, _returns); err != nil { + log.Printf("RPC call to GetFileLink API failed: %s", err.Error()) + } + return _returns.A, _returns.B +} + +func (s *apiRPCServer) GetFileLink(args *Z_GetFileLinkArgs, returns *Z_GetFileLinkReturns) error { + if hook, ok := s.impl.(interface { + GetFileLink(fileId string) (string, *model.AppError) + }); ok { + returns.A, returns.B = hook.GetFileLink(args.A) + } else { + return encodableError(fmt.Errorf("API GetFileLink called but not implemented.")) + } + return nil +} + type Z_ReadFileArgs struct { A string } diff --git a/plugin/plugintest/api.go b/plugin/plugintest/api.go index 0fe2ab0ea..78e361e0f 100644 --- a/plugin/plugintest/api.go +++ b/plugin/plugintest/api.go @@ -574,6 +574,29 @@ func (_m *API) GetFileInfo(fileId string) (*model.FileInfo, *model.AppError) { return r0, r1 } +// GetFileLink provides a mock function with given fields: fileId +func (_m *API) GetFileLink(fileId string) (string, *model.AppError) { + ret := _m.Called(fileId) + + var r0 string + if rf, ok := ret.Get(0).(func(string) string); ok { + r0 = rf(fileId) + } else { + r0 = ret.Get(0).(string) + } + + var r1 *model.AppError + if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + r1 = rf(fileId) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*model.AppError) + } + } + + return r0, r1 +} + // GetGroupChannel provides a mock function with given fields: userIds func (_m *API) GetGroupChannel(userIds []string) (*model.Channel, *model.AppError) { ret := _m.Called(userIds) -- cgit v1.2.3-1-g7c22