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 }