52 lines
1.6 KiB
Ruby
52 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class BackfillThreadMemberships < ActiveRecord::Migration[7.0]
|
|
def up
|
|
thread_tracking_notification_level = 2
|
|
|
|
sql = <<~SQL
|
|
INSERT INTO user_chat_thread_memberships(
|
|
user_id,
|
|
thread_id,
|
|
notification_level,
|
|
last_read_message_id,
|
|
created_at,
|
|
updated_at
|
|
)
|
|
SELECT
|
|
thread_participant_stats.user_id,
|
|
thread_participant_stats.thread_id,
|
|
#{thread_tracking_notification_level},
|
|
(
|
|
SELECT id FROM chat_messages
|
|
WHERE thread_id = thread_participant_stats.thread_id
|
|
AND deleted_at IS NULL
|
|
ORDER BY created_at DESC, id DESC
|
|
LIMIT 1
|
|
),
|
|
NOW(),
|
|
NOW()
|
|
FROM (
|
|
SELECT chat_messages.thread_id, chat_messages.user_id
|
|
FROM chat_messages
|
|
INNER JOIN chat_threads ON chat_threads.id = chat_messages.thread_id
|
|
WHERE chat_messages.thread_id IS NOT NULL
|
|
GROUP BY chat_messages.thread_id, chat_messages.user_id
|
|
ORDER BY chat_messages.thread_id ASC, chat_messages.user_id ASC
|
|
) AS thread_participant_stats
|
|
INNER JOIN users ON users.id = thread_participant_stats.user_id
|
|
LEFT JOIN user_chat_thread_memberships ON user_chat_thread_memberships.thread_id = thread_participant_stats.thread_id
|
|
AND user_chat_thread_memberships.user_id = thread_participant_stats.user_id
|
|
WHERE user_chat_thread_memberships IS NULL
|
|
ORDER BY user_chat_thread_memberships.thread_id ASC
|
|
ON CONFLICT DO NOTHING;
|
|
SQL
|
|
|
|
execute(sql)
|
|
end
|
|
|
|
def down
|
|
raise ActiveRecord::IrreversibleMigration
|
|
end
|
|
end
|