FEATURE: Export chat messages to CSV file (#22113)

To export chat messages, go to `/admin/plugins/chat` and click the Create export 
button in the _Export chat messages_ section. You'll receive a direct message 
when the export is finished.

Currently, this exports all messages from the last 6 months, but not more than 
10000 messages.

This exports all chat messages, including messages from private channels and 
users' direct conversations. This also exports messages that were deleted.
This commit is contained in:
Andrei Prigorshnev
2023-06-21 16:13:36 +04:00
committed by GitHub
parent 720c0c6e4d
commit 3ea31f443c
12 changed files with 230 additions and 1 deletions

View File

@ -0,0 +1,52 @@
# frozen_string_literal: true
describe Chat::MessagesExporter do
fab!(:public_channel) { Fabricate(:chat_channel) }
fab!(:public_channel_message_1) { Fabricate(:chat_message, chat_channel: public_channel) }
fab!(:public_channel_message_2) { Fabricate(:chat_message, chat_channel: public_channel) }
# this message is deleted in the before block:
fab!(:deleted_message) { Fabricate(:chat_message, chat_channel: public_channel) }
fab!(:private_channel) { Fabricate(:private_category_channel, group: Fabricate(:group)) }
fab!(:private_channel_message_1) { Fabricate(:chat_message, chat_channel: private_channel) }
fab!(:private_channel_message_2) { Fabricate(:chat_message, chat_channel: private_channel) }
fab!(:user_1) { Fabricate(:user) }
fab!(:user_2) { Fabricate(:user) }
fab!(:dm_channel) { Fabricate(:direct_message_channel, users: [user_1, user_2]) }
fab!(:direct_message_1) { Fabricate(:chat_message, chat_channel: private_channel, user: user_1) }
fab!(:direct_message_2) { Fabricate(:chat_message, chat_channel: private_channel, user: user_2) }
before { deleted_message.trash! }
it "exports messages" do
exporter = Class.new.extend(Chat::MessagesExporter)
result = exporter.chat_message_export.to_a
expect(result.length).to be(7)
assert_exported_message(result[0], public_channel_message_1)
assert_exported_message(result[1], public_channel_message_2)
assert_exported_message(result[2], deleted_message)
assert_exported_message(result[3], private_channel_message_1)
assert_exported_message(result[4], private_channel_message_2)
assert_exported_message(result[5], direct_message_1)
assert_exported_message(result[6], direct_message_2)
end
def assert_exported_message(data_row, message)
expect(data_row[0]).to eq(message.id)
expect(data_row[1]).to eq(message.chat_channel.id)
expect(data_row[2]).to eq(message.chat_channel.name)
expect(data_row[3]).to eq(message.user.id)
expect(data_row[4]).to eq(message.user.username)
expect(data_row[5]).to eq(message.message)
expect(data_row[6]).to eq(message.cooked)
expect(data_row[7]).to eq_time(message.created_at)
expect(data_row[8]).to eq_time(message.updated_at)
expect(data_row[9]).to eq_time(message.deleted_at)
expect(data_row[10]).to eq(message.in_reply_to_id)
expect(data_row[11]).to eq(message.last_editor.id)
expect(data_row[12]).to eq(message.last_editor.username)
end
end