From 93351ff8a4d6ae158721831c7611401ccc4a2606 Mon Sep 17 00:00:00 2001 From: Doug Lauder Date: Tue, 9 Jan 2024 06:42:11 -0500 Subject: [PATCH] Fix error message when sharing already shared channel; also make idempotent (#25854) * fix appError/error assignment bug * make ShareChannel plugin API idempotent --------- Co-authored-by: Mattermost Build --- server/channels/app/plugin_api.go | 8 +++++++- server/channels/app/shared_channel.go | 14 ++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/server/channels/app/plugin_api.go b/server/channels/app/plugin_api.go index 22119e9e15..f3542c6dbe 100644 --- a/server/channels/app/plugin_api.go +++ b/server/channels/app/plugin_api.go @@ -6,6 +6,7 @@ package app import ( "bytes" "encoding/json" + "errors" "fmt" "io" "net/http" @@ -1298,7 +1299,12 @@ func (api *PluginAPI) UnregisterPluginForSharedChannels(pluginID string) error { } func (api *PluginAPI) ShareChannel(sc *model.SharedChannel) (*model.SharedChannel, error) { - return api.app.ShareChannel(api.ctx, sc) + scShared, err := api.app.ShareChannel(api.ctx, sc) + if errors.Is(err, ErrChannelAlreadyShared) { + // sharing an already shared channel is not an error; treat as idempotent and return the existing shared channel + return api.app.GetSharedChannel(sc.ChannelId) + } + return scShared, err } func (api *PluginAPI) UpdateSharedChannel(sc *model.SharedChannel) (*model.SharedChannel, error) { diff --git a/server/channels/app/shared_channel.go b/server/channels/app/shared_channel.go index ea72b975e4..8c1b95cb24 100644 --- a/server/channels/app/shared_channel.go +++ b/server/channels/app/shared_channel.go @@ -15,23 +15,21 @@ import ( ) var ( - errNotFound = errors.New("not found") + errNotFound = errors.New("not found") + ErrChannelAlreadyShared = errors.New("channel is already shared") ) func (a *App) checkChannelNotShared(c request.CTX, channelId string) error { // check that channel exists. - if _, err := a.GetChannel(c, channelId); err != nil { - return fmt.Errorf("cannot share this channel: %w", err) + if _, appErr := a.GetChannel(c, channelId); appErr != nil { + return fmt.Errorf("cannot find channel: %w", appErr) } // Check channel is not already shared. if _, err := a.GetSharedChannel(channelId); err == nil { - var errNotFound *store.ErrNotFound - if errors.As(err, &errNotFound) { - return fmt.Errorf("channel is already shared: %w", err) - } - return fmt.Errorf("cannot find channel: %w", err) + return ErrChannelAlreadyShared } + return nil }