Skip to content

Instantly share code, notes, and snippets.

@coltoneshaw
Created March 27, 2024 20:58
Show Gist options
  • Save coltoneshaw/dbfa7ba8200dfb8d7241f1561f57b3dd to your computer and use it in GitHub Desktop.
Save coltoneshaw/dbfa7ba8200dfb8d7241f1561f57b3dd to your computer and use it in GitHub Desktop.
Merge Mattermost Channels
-- This makes a few assumptions that the secondary channel's setup information is now irrelevant and is being deleted
-- this means sidebar preferences, data retention, channel members, etc. are all being deleted in favor of what is setup on the primary
-- Playbook channel data IS moved to the new channel. However, if the playbook resides on the old team it'll need to be manually moved.
DO $$
DECLARE
_primaryChannelId VARCHAR := 'primary_channel_id';
_secondaryChannelId VARCHAR := 'secondary_channel_name';
-- these are the channels.name values. It should be a `-` spaced value.
_primaryChannelName VARCHAR := 'channel-name';
_secondaryChannelName VARCHAR := 'channel-name';
BEGIN
-- Perform the delete operation for old channel data
DELETE FROM channels WHERE id = _secondaryChannelId;
DELETE FROM channelmemberhistory WHERE channelid = _secondaryChannelId;
DELETE FROM channelmembers WHERE channelid = _secondaryChannelId;
-- channels that have group constraints to them
DELETE FROM groupchannels WHERE channelid = _secondaryChannelId;
-- shared channels
DELETE FROM sharedchannels WHERE channelid = _secondaryChannelId;
DELETE FROM sharedchannelremotes WHERE channelid = _secondaryChannelId;
DELETE FROM sharedchannelremotes WHERE channelid = _secondaryChannelId;
-- more deletes misc
DELETE FROM retentionpolicieschannels WHERE channelid = _secondaryChannelId;
DELETE FROM sidebarchannels WHERE channelid = _secondaryChannelId;
DELETE FROM preferences WHERE name = _secondaryChannelName;
-- moving the webhooks over
UPDATE commandwebhooks SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
UPDATE incomingwebhooks SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
UPDATE outgoingwebhooks SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
-- everything related to posts
UPDATE drafts SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
UPDATE posts SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
UPDATE postspriority SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
UPDATE reactions SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
UPDATE threads SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
-- find and replace of the channel links in a message
UPDATE posts
SET message = REPLACE(message, '~' || _secondaryChannelName, '~' || _primaryChannelName)
WHERE message LIKE '%~' || _secondaryChannelName || '%';
-- playbooks
UPDATE ir_channelaction SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
UPDATE ir_incident SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
UPDATE ir_incident
SET concatenatedbroadcastchannelids = REPLACE(concatenatedbroadcastchannelids, _secondaryChannelId, _secondaryChannelName)
WHERE concatenatedbroadcastchannelids LIKE '%' || _secondaryChannelId || '%';
UPDATE ir_playbook SET broadcastchannelid = _primaryChannelId WHERE broadcastchannelid = _secondaryChannelId;
UPDATE ir_playbook
SET concatenatedbroadcastchannelids = REPLACE(concatenatedbroadcastchannelids, _secondaryChannelId, _secondaryChannelName)
WHERE concatenatedbroadcastchannelids LIKE '%' || _secondaryChannelId || '%';
UPDATE ir_playbook SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
-- moving any users who did not exist already.
UPDATE ir_viewedchannel
SET channelid = _primaryChannelId
WHERE channelid = _secondaryChannelId
AND NOT EXISTS (
SELECT 1
FROM ir_viewedchannel AS existing
WHERE existing.channelid = _primaryChannelId
AND existing.userid = ir_viewedchannel.userid
);
DELETE FROM ir_viewedchannel WHERE channelid = _secondaryChannelId;
UPDATE uploadsessions SET channelid = _primaryChannelId WHERE channelid = _secondaryChannelId;
END $$;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment