# 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