This reverts commit 5aa24aedc8.
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
c3ffac4f6b
Коммит
f257109953
@@ -10,7 +10,6 @@ import (
|
|||||||
const (
|
const (
|
||||||
INTERNAL_KEY_PREFIX = "mmi_"
|
INTERNAL_KEY_PREFIX = "mmi_"
|
||||||
BOT_USER_KEY = INTERNAL_KEY_PREFIX + "botid"
|
BOT_USER_KEY = INTERNAL_KEY_PREFIX + "botid"
|
||||||
CHANNEL_KEY = INTERNAL_KEY_PREFIX + "channelid"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Starts the serving of a Mattermost plugin over net/rpc. gRPC is not yet supported.
|
// Starts the serving of a Mattermost plugin over net/rpc. gRPC is not yet supported.
|
||||||
|
|||||||
@@ -1,111 +0,0 @@
|
|||||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
||||||
// See LICENSE.txt for license information.
|
|
||||||
|
|
||||||
package plugin
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/mattermost/mattermost-server/model"
|
|
||||||
"github.com/mattermost/mattermost-server/utils"
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (p *HelpersImpl) EnsureChannel(channel *model.Channel) (retChannelId string, retErr error) {
|
|
||||||
// Must provide a channel with a name and teadId
|
|
||||||
if channel == nil || len(channel.Name) < 1 || len(channel.TeamId) < 1 {
|
|
||||||
return "", errors.New("passed a bad channel, nil or no name or no team id")
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we fail for any reason, this could be a race between creation of channel and
|
|
||||||
// retrieval from another EnsureChannel. Just try the basic retrieve existing again.
|
|
||||||
defer func() {
|
|
||||||
if retChannelId == "" || retErr != nil {
|
|
||||||
var err error
|
|
||||||
var channelIdBytes []byte
|
|
||||||
|
|
||||||
err = utils.ProgressiveRetry(func() error {
|
|
||||||
channelIdBytes, err = p.API.KVGet(CHANNEL_KEY)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err == nil && channelIdBytes != nil {
|
|
||||||
retChannelId = string(channelIdBytes)
|
|
||||||
retErr = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Fetch channel ID from key value store
|
|
||||||
channelIdBytes, kvGetErr := p.API.KVGet(CHANNEL_KEY)
|
|
||||||
if kvGetErr != nil {
|
|
||||||
// Failed to retrive the value of channel
|
|
||||||
return "", errors.Wrap(kvGetErr, "failed to get channel ID")
|
|
||||||
}
|
|
||||||
|
|
||||||
var existingChannel *model.Channel
|
|
||||||
var channelGetErr *model.AppError
|
|
||||||
|
|
||||||
// If channel ID exists, get existing channel by ID else get it by Name
|
|
||||||
if channelIdBytes != nil {
|
|
||||||
existingChannel, channelGetErr = p.API.GetChannel(string(channelIdBytes))
|
|
||||||
if channelGetErr != nil {
|
|
||||||
return "", errors.Wrap(channelGetErr, "failed to get channel by ID")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
existingChannel, channelGetErr = p.API.GetChannelByName(channel.TeamId, channel.Name, false)
|
|
||||||
if channelGetErr != nil {
|
|
||||||
return "", errors.Wrap(channelGetErr, "failed to get channel by name")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If channel exists, update the metadata
|
|
||||||
if existingChannel != nil {
|
|
||||||
return updateChannel(p, existingChannel, channel)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new channel
|
|
||||||
createdChannel, createChannelErr := p.API.CreateChannel(channel)
|
|
||||||
if createChannelErr != nil {
|
|
||||||
return "", errors.Wrap(createChannelErr, "failed to create channel")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the new channel id in key value store
|
|
||||||
if kvSetErr := p.API.KVSet(CHANNEL_KEY, []byte(createdChannel.Id)); kvSetErr != nil {
|
|
||||||
p.API.LogWarn("Failed to set created channel id.", "channelid", createdChannel.Id, "err", kvSetErr)
|
|
||||||
}
|
|
||||||
|
|
||||||
return createdChannel.Id, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateChannel(p *HelpersImpl, existing *model.Channel, new *model.Channel) (string, error) {
|
|
||||||
// Update metadata of the channel
|
|
||||||
if updateErr := updateChannelMeta(existing, new); updateErr != nil {
|
|
||||||
return "", errors.Wrap(updateErr, "Failed to update the metadata of existing channel")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send the updates to API
|
|
||||||
updatedChannel, channelUpdateErr := p.API.UpdateChannel(existing)
|
|
||||||
if channelUpdateErr != nil {
|
|
||||||
return "", errors.Wrap(channelUpdateErr, "Failed to update the existing channel")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Channel exists!
|
|
||||||
return updatedChannel.Id, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateChannelMeta(existing *model.Channel, new *model.Channel) error {
|
|
||||||
// Check if channels are of different types
|
|
||||||
if existing.Type != new.Type {
|
|
||||||
return errors.New("Channel type cannot be updated")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update metadata of channel
|
|
||||||
existing.Name = new.Name
|
|
||||||
existing.DisplayName = new.DisplayName
|
|
||||||
existing.Purpose = new.Purpose
|
|
||||||
existing.Header = new.Header
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@@ -1,297 +0,0 @@
|
|||||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
||||||
// See LICENSE.txt for license information.
|
|
||||||
|
|
||||||
package plugin_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/mattermost/mattermost-server/model"
|
|
||||||
"github.com/mattermost/mattermost-server/plugin"
|
|
||||||
"github.com/mattermost/mattermost-server/plugin/plugintest"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestEnsureChannel(t *testing.T) {
|
|
||||||
setupAPI := func() *plugintest.API {
|
|
||||||
return &plugintest.API{}
|
|
||||||
}
|
|
||||||
|
|
||||||
testChannel := &model.Channel{
|
|
||||||
Id: model.NewId(),
|
|
||||||
TeamId: model.NewId(),
|
|
||||||
Type: "public",
|
|
||||||
Name: "test_channel",
|
|
||||||
DisplayName: "Test Channel",
|
|
||||||
Purpose: "Testing EnsureChannel",
|
|
||||||
Header: "Testing EnsureChannel",
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Run("bad parameters", func(t *testing.T) {
|
|
||||||
t.Run("no channel", func(t *testing.T) {
|
|
||||||
p := &plugin.HelpersImpl{}
|
|
||||||
channelId, err := p.EnsureChannel(nil)
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("empty name", func(t *testing.T) {
|
|
||||||
p := &plugin.HelpersImpl{}
|
|
||||||
channelId, err := p.EnsureChannel(&model.Channel{
|
|
||||||
Name: "",
|
|
||||||
})
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("name without teamId", func(t *testing.T) {
|
|
||||||
p := &plugin.HelpersImpl{}
|
|
||||||
channelId, err := p.EnsureChannel(&model.Channel{
|
|
||||||
Name: "test_channel",
|
|
||||||
})
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("teamId without name", func(t *testing.T) {
|
|
||||||
p := &plugin.HelpersImpl{}
|
|
||||||
channelId, err := p.EnsureChannel(&model.Channel{
|
|
||||||
TeamId: model.NewId(),
|
|
||||||
})
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("teamId with empty name", func(t *testing.T) {
|
|
||||||
p := &plugin.HelpersImpl{}
|
|
||||||
channelId, err := p.EnsureChannel(&model.Channel{
|
|
||||||
TeamId: model.NewId(),
|
|
||||||
})
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("if channel already exists in Key Value store", func(t *testing.T) {
|
|
||||||
t.Run("should return an error if unable to get channel id", func(t *testing.T) {
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return(nil, &model.AppError{})
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("should return an error if unable to get channel", func(t *testing.T) {
|
|
||||||
expectedChannelId := model.NewId()
|
|
||||||
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return([]byte(expectedChannelId), nil)
|
|
||||||
api.On("GetChannel", expectedChannelId).Return(nil, &model.AppError{})
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("should return an error if unable to update channel", func(t *testing.T) {
|
|
||||||
expectedChannelId := model.NewId()
|
|
||||||
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return([]byte(expectedChannelId), nil)
|
|
||||||
api.On("GetChannel", expectedChannelId).Return(testChannel, nil)
|
|
||||||
api.On("UpdateChannel", testChannel).Return(nil, &model.AppError{})
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("should return the Id of existing channel if metadata is same", func(t *testing.T) {
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return([]byte(testChannel.Id), nil)
|
|
||||||
api.On("GetChannel", testChannel.Id).Return(testChannel, nil)
|
|
||||||
api.On("UpdateChannel", testChannel).Return(testChannel, nil)
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, testChannel.Id, channelId)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("should return error if channel type is different from existing one", func(t *testing.T) {
|
|
||||||
privChannel := &model.Channel{
|
|
||||||
Id: model.NewId(),
|
|
||||||
Type: "private",
|
|
||||||
TeamId: testChannel.TeamId,
|
|
||||||
Name: testChannel.Name,
|
|
||||||
}
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return([]byte(testChannel.Id), nil)
|
|
||||||
api.On("GetChannel", testChannel.Id).Return(privChannel, nil)
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("should return the Id of updated channel if metadata is different", func(t *testing.T) {
|
|
||||||
updatedChannel := &model.Channel{
|
|
||||||
Id: model.NewId(),
|
|
||||||
TeamId: testChannel.TeamId,
|
|
||||||
Name: testChannel.Name,
|
|
||||||
}
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return([]byte(testChannel.Id), nil)
|
|
||||||
api.On("GetChannel", testChannel.Id).Return(testChannel, nil)
|
|
||||||
api.On("UpdateChannel", testChannel).Return(updatedChannel, nil)
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, updatedChannel.Id, channelId)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("if channel is not in Key Value store but already exists", func(t *testing.T) {
|
|
||||||
t.Run("should return an error if unable to get channel", func(t *testing.T) {
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return(nil, nil)
|
|
||||||
api.On("GetChannelByName", testChannel.TeamId, testChannel.Name, false).Return(nil, &model.AppError{})
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("should return the Id of existing channel if metadata is same", func(t *testing.T) {
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return(nil, nil)
|
|
||||||
api.On("GetChannelByName", testChannel.TeamId, testChannel.Name, false).Return(testChannel, nil)
|
|
||||||
api.On("UpdateChannel", testChannel).Return(testChannel, nil)
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, testChannel.Id, channelId)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("should return error if failed to update the channel", func(t *testing.T) {
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return(nil, nil)
|
|
||||||
api.On("GetChannelByName", testChannel.TeamId, testChannel.Name, false).Return(testChannel, nil)
|
|
||||||
api.On("UpdateChannel", testChannel).Return(nil, &model.AppError{})
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("should return the Id of updated channel if metadata is different", func(t *testing.T) {
|
|
||||||
updatedChannel := &model.Channel{
|
|
||||||
Id: model.NewId(),
|
|
||||||
TeamId: testChannel.TeamId,
|
|
||||||
Name: testChannel.Name,
|
|
||||||
}
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return(nil, nil)
|
|
||||||
api.On("GetChannelByName", testChannel.TeamId, testChannel.Name, false).Return(testChannel, nil)
|
|
||||||
api.On("UpdateChannel", testChannel).Return(updatedChannel, nil)
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, updatedChannel.Id, channelId)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("should return error if channel type is different from existing one", func(t *testing.T) {
|
|
||||||
privChannel := &model.Channel{
|
|
||||||
Id: model.NewId(),
|
|
||||||
Type: "private",
|
|
||||||
TeamId: testChannel.TeamId,
|
|
||||||
Name: testChannel.Name,
|
|
||||||
}
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return(nil, nil)
|
|
||||||
api.On("GetChannelByName", testChannel.TeamId, testChannel.Name, false).Return(privChannel, nil)
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("if channel does not exist", func(t *testing.T) {
|
|
||||||
t.Run("should create new channel and return the Id", func(t *testing.T) {
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return(nil, nil)
|
|
||||||
api.On("GetChannelByName", testChannel.TeamId, testChannel.Name, false).Return(nil, nil)
|
|
||||||
api.On("CreateChannel", testChannel).Return(testChannel, nil)
|
|
||||||
api.On("KVSet", plugin.CHANNEL_KEY, []byte(testChannel.Id)).Return(nil)
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, testChannel.Id, channelId)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("should return error if unable to create new channel", func(t *testing.T) {
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return(nil, nil)
|
|
||||||
api.On("GetChannelByName", testChannel.TeamId, testChannel.Name, false).Return(nil, nil)
|
|
||||||
api.On("CreateChannel", testChannel).Return(nil, &model.AppError{})
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, "", channelId)
|
|
||||||
assert.NotNil(t, err)
|
|
||||||
})
|
|
||||||
t.Run("should log and return id if unable to write to Key Value store", func(t *testing.T) {
|
|
||||||
api := setupAPI()
|
|
||||||
api.On("KVGet", plugin.CHANNEL_KEY).Return(nil, nil)
|
|
||||||
api.On("GetChannelByName", testChannel.TeamId, testChannel.Name, false).Return(nil, nil)
|
|
||||||
api.On("CreateChannel", testChannel).Return(testChannel, nil)
|
|
||||||
api.On("KVSet", plugin.CHANNEL_KEY, []byte(testChannel.Id)).Return(&model.AppError{})
|
|
||||||
api.On("LogWarn", "Failed to set created channel id.", "channelid", testChannel.Id, "err", &model.AppError{})
|
|
||||||
defer api.AssertExpectations(t)
|
|
||||||
|
|
||||||
p := &plugin.HelpersImpl{API: api}
|
|
||||||
|
|
||||||
channelId, err := p.EnsureChannel(testChannel)
|
|
||||||
|
|
||||||
assert.Equal(t, testChannel.Id, channelId)
|
|
||||||
assert.Nil(t, err)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
Ссылка в новой задаче
Block a user