2022-11-02 21:41:30 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
task "chat_messages:rebake_uncooked_chat_messages" => :environment do
|
|
|
|
# rebaking uncooked chat_messages can very quickly saturate sidekiq
|
|
|
|
# this provides an insurance policy so you can safely run and stop
|
|
|
|
# this rake task without worrying about your sidekiq imploding
|
|
|
|
Jobs.run_immediately!
|
|
|
|
|
|
|
|
ENV["RAILS_DB"] ? rebake_uncooked_chat_messages : rebake_uncooked_chat_messages_all_sites
|
|
|
|
end
|
|
|
|
|
|
|
|
def rebake_uncooked_chat_messages_all_sites
|
|
|
|
RailsMultisite::ConnectionManagement.each_connection { |db| rebake_uncooked_chat_messages }
|
|
|
|
end
|
|
|
|
|
|
|
|
def rebake_uncooked_chat_messages
|
|
|
|
puts "Rebaking uncooked chat messages on #{RailsMultisite::ConnectionManagement.current_db}"
|
2023-03-17 21:24:38 +08:00
|
|
|
uncooked = Chat::Message.uncooked
|
2022-11-02 21:41:30 +08:00
|
|
|
|
|
|
|
rebaked = 0
|
|
|
|
total = uncooked.count
|
|
|
|
|
|
|
|
ids = uncooked.pluck(:id)
|
|
|
|
# work randomly so you can run this job from lots of consoles if needed
|
|
|
|
ids.shuffle!
|
|
|
|
|
|
|
|
ids.each do |id|
|
|
|
|
# may have been cooked in interim
|
|
|
|
chat_message = uncooked.where(id: id).first
|
|
|
|
|
|
|
|
rebake_chat_message(chat_message) if chat_message
|
|
|
|
|
|
|
|
print_status(rebaked += 1, total)
|
|
|
|
end
|
|
|
|
|
|
|
|
puts "", "#{rebaked} chat messages done!", ""
|
|
|
|
end
|
|
|
|
|
|
|
|
def rebake_chat_message(chat_message, opts = {})
|
|
|
|
opts[:priority] = :ultra_low if !opts[:priority]
|
|
|
|
chat_message.rebake!(**opts)
|
|
|
|
rescue => e
|
|
|
|
puts "",
|
|
|
|
"Failed to rebake chat message (chat_message_id: #{chat_message.id})",
|
|
|
|
e,
|
|
|
|
e.backtrace.join("\n")
|
|
|
|
end
|
|
|
|
|
|
|
|
task "chat:make_channel_to_test_archiving", [:user_for_membership] => :environment do |t, args|
|
|
|
|
user_for_membership = args[:user_for_membership]
|
|
|
|
|
|
|
|
# do not want this running in production!
|
|
|
|
return if !Rails.env.development?
|
|
|
|
|
|
|
|
require "fabrication"
|
|
|
|
Dir[Rails.root.join("spec/fabricators/*.rb")].each { |f| require f }
|
|
|
|
|
|
|
|
messages = [
|
|
|
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
|
|
|
|
"Cras sit **amet** metus eget nisl accumsan ullamcorper.",
|
|
|
|
"Vestibulum commodo justo _quis_ fringilla fringilla.",
|
|
|
|
"Etiam malesuada erat eget aliquam interdum.",
|
|
|
|
"Praesent mattis lacus nec ~~orci~~ [spoiler]semper[/spoiler], et fermentum augue tincidunt.",
|
|
|
|
"Duis vel tortor suscipit justo fringilla faucibus id tempus purus.",
|
|
|
|
"Phasellus *tempus erat* sit amet pharetra facilisis.",
|
|
|
|
"Fusce egestas urna ut nisi ornare, ut malesuada est fermentum.",
|
|
|
|
"Aenean ornare arcu vitae pulvinar dictum.",
|
|
|
|
"Nam at turpis eu magna sollicitudin fringilla sed sed diam.",
|
|
|
|
"Proin non [enim](https://discourse.org/team) nec mauris efficitur convallis.",
|
|
|
|
"Nullam cursus lacus non libero vulputate ornare.",
|
|
|
|
"In eleifend ante ut ullamcorper ultrices.",
|
|
|
|
"In placerat diam sit amet nibh feugiat, in posuere metus feugiat.",
|
|
|
|
"Nullam porttitor leo a leo `cursus`, id hendrerit dui ultrices.",
|
|
|
|
"Pellentesque ut @#{user_for_membership} ut ex pulvinar pharetra sit amet ac leo.",
|
|
|
|
"Vestibulum sit amet enim et lectus tincidunt rhoncus hendrerit in enim.",
|
|
|
|
<<~MSG,
|
|
|
|
some bigger message
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
beep = \"wow\"
|
|
|
|
puts beep
|
|
|
|
```
|
|
|
|
MSG
|
|
|
|
]
|
|
|
|
|
|
|
|
topic = nil
|
|
|
|
chat_channel = nil
|
|
|
|
|
|
|
|
Topic.transaction do
|
|
|
|
topic =
|
|
|
|
Fabricate(
|
|
|
|
:topic,
|
|
|
|
user: make_test_user,
|
|
|
|
title: "Testing topic for chat archiving #{SecureRandom.hex(4)}",
|
|
|
|
)
|
|
|
|
Fabricate(
|
|
|
|
:post,
|
|
|
|
topic: topic,
|
|
|
|
user: topic.user,
|
|
|
|
raw: "This is some cool first post for archive stuff",
|
|
|
|
)
|
|
|
|
chat_channel =
|
2023-03-17 21:24:38 +08:00
|
|
|
Chat::Channel.create(
|
2022-11-02 21:41:30 +08:00
|
|
|
chatable: topic,
|
|
|
|
chatable_type: "Topic",
|
|
|
|
name: "testing channel for archiving #{SecureRandom.hex(4)}",
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
puts "topic: #{topic.id}, #{topic.title}"
|
|
|
|
puts "channel: #{chat_channel.id}, #{chat_channel.name}"
|
|
|
|
|
|
|
|
users = [make_test_user, make_test_user, make_test_user]
|
|
|
|
|
2023-03-17 21:24:38 +08:00
|
|
|
Chat::Channel.transaction do
|
2022-11-02 21:41:30 +08:00
|
|
|
start_time = Time.now
|
|
|
|
|
|
|
|
puts "creating 1039 messages for the channel"
|
|
|
|
1039.times do
|
2023-03-17 21:24:38 +08:00
|
|
|
cm =
|
|
|
|
Chat::Message.new(message: messages.sample, user: users.sample, chat_channel: chat_channel)
|
2022-11-02 21:41:30 +08:00
|
|
|
cm.cook
|
|
|
|
cm.save!
|
|
|
|
end
|
|
|
|
|
|
|
|
puts "message creation done"
|
|
|
|
puts "took #{Time.now - start_time} seconds"
|
|
|
|
|
2023-03-17 21:24:38 +08:00
|
|
|
Chat::UserChatChannelMembership.create(
|
2022-11-02 21:41:30 +08:00
|
|
|
chat_channel: chat_channel,
|
|
|
|
last_read_message_id: 0,
|
|
|
|
user: User.find_by(username: user_for_membership),
|
|
|
|
following: true,
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
puts "channel is located at #{chat_channel.url}"
|
|
|
|
end
|
|
|
|
|
|
|
|
def make_test_user
|
|
|
|
return if !Rails.env.development?
|
|
|
|
unique_prefix = "archiveuser#{SecureRandom.hex(4)}"
|
|
|
|
Fabricate(:user, username: unique_prefix, email: "#{unique_prefix}@testemail.com")
|
|
|
|
end
|