Add Slack corporate import ability (#10905)

* add support for slack corporate export data

* changed tempChannels for channel types. concat after parsing channels

* fix typo

* add fixes suggested by @lieut-data
Этот коммит содержится в:
Sven Hüster
2019-06-04 23:11:29 +02:00
коммит произвёл Jesse Hallam
родитель 367ffbfb42
Коммит cc6c385d3e
5 изменённых файлов: 184 добавлений и 5 удалений

Просмотреть файл

@@ -30,6 +30,7 @@ type SlackChannel struct {
Members []string `json:"members"`
Topic map[string]string `json:"topic"`
Purpose map[string]string `json:"purpose"`
Type string
}
type SlackProfile struct {
@@ -102,7 +103,7 @@ func SlackConvertChannelName(channelName string, channelId string) string {
return strings.ToLower(channelId)
}
func SlackParseChannels(data io.Reader) ([]SlackChannel, error) {
func SlackParseChannels(data io.Reader, channelType string) ([]SlackChannel, error) {
decoder := json.NewDecoder(data)
var channels []SlackChannel
@@ -110,6 +111,11 @@ func SlackParseChannels(data io.Reader) ([]SlackChannel, error) {
mlog.Warn("Slack Import: Error occurred when parsing some Slack channels. Import may work anyway.")
return channels, err
}
for i := range channels {
channels[i].Type = channelType
}
return channels, nil
}
@@ -492,7 +498,7 @@ func (a *App) SlackAddChannels(teamId string, slackchannels []SlackChannel, post
for _, sChannel := range slackchannels {
newChannel := model.Channel{
TeamId: teamId,
Type: model.CHANNEL_OPEN,
Type: sChannel.Type,
DisplayName: sChannel.Name,
Name: SlackConvertChannelName(sChannel.Name, sChannel.Id),
Purpose: sChannel.Purpose["value"],
@@ -656,6 +662,11 @@ func (a *App) SlackImport(fileData multipart.File, fileSize int64, teamID string
}
var channels []SlackChannel
var publicChannels []SlackChannel
var privateChannels []SlackChannel
var groupChannels []SlackChannel
var directChannels []SlackChannel
var users []SlackUser
posts := make(map[string][]SlackPost)
uploads := make(map[string]*zip.File)
@@ -666,7 +677,17 @@ func (a *App) SlackImport(fileData multipart.File, fileSize int64, teamID string
return model.NewAppError("SlackImport", "api.slackimport.slack_import.open.app_error", map[string]interface{}{"Filename": file.Name}, err.Error(), http.StatusInternalServerError), log
}
if file.Name == "channels.json" {
channels, _ = SlackParseChannels(reader)
publicChannels, _ = SlackParseChannels(reader, model.CHANNEL_OPEN)
channels = append(channels, publicChannels...)
} else if file.Name == "dms.json" {
directChannels, _ = SlackParseChannels(reader, model.CHANNEL_DIRECT)
channels = append(channels, directChannels...)
} else if file.Name == "groups.json" {
privateChannels, _ = SlackParseChannels(reader, model.CHANNEL_PRIVATE)
channels = append(channels, privateChannels...)
} else if file.Name == "mpims.json" {
groupChannels, _ = SlackParseChannels(reader, model.CHANNEL_GROUP)
channels = append(channels, groupChannels...)
} else if file.Name == "users.json" {
users, _ = SlackParseUsers(reader)
} else {
@@ -712,7 +733,7 @@ func (a *App) SlackImport(fileData multipart.File, fileSize int64, teamID string
//
// -- Old SlackImport Functions --
// Import functions are sutible for entering posts and users into the database without
// Import functions are suitable for entering posts and users into the database without
// some of the usual checks. (IsValid is still run)
//

Просмотреть файл

@@ -116,11 +116,41 @@ func TestSlackParseChannels(t *testing.T) {
require.NoError(t, err)
defer file.Close()
channels, err := SlackParseChannels(file)
channels, err := SlackParseChannels(file, "O")
require.NoError(t, err)
assert.Equal(t, 6, len(channels))
}
func TestSlackParseDirectMessages(t *testing.T) {
file, err := os.Open("tests/slack-import-test-direct-messages.json")
require.NoError(t, err)
defer file.Close()
channels, err := SlackParseChannels(file, "D")
require.NoError(t, err)
assert.Equal(t, 4, len(channels))
}
func TestSlackParsePrivateChannels(t *testing.T) {
file, err := os.Open("tests/slack-import-test-private-channels.json")
require.NoError(t, err)
defer file.Close()
channels, err := SlackParseChannels(file, "P")
require.NoError(t, err)
assert.Equal(t, 1, len(channels))
}
func TestSlackParseGroupDirectMessages(t *testing.T) {
file, err := os.Open("tests/slack-import-test-group-direct-messages.json")
require.NoError(t, err)
defer file.Close()
channels, err := SlackParseChannels(file, "G")
require.NoError(t, err)
assert.Equal(t, 3, len(channels))
}
func TestSlackParseUsers(t *testing.T) {
file, err := os.Open("tests/slack-import-test-users.json")
require.NoError(t, err)