discourse/lib/discourse_dev/record.rb
Martin Brennan 6442bbf46c
DEV: Reintroduce chat rake dev generate tasks (#21164)
This is to help generate random channels and chat
messages for local dev. This was removed in 12a18d4d55
presumably because it was not worth refactoring at the
time.

I've only added these tasks:

- `rake chat:message:populate\[113,20\]` (channel_id, count)
  - Generates the count of messages for a channel ID provided,
    otherwise uses a random channel and 200 count.
- `rake chat:category_channel:populate`
  - Creates a chat channel for a random category.
- `rake chat🧵populate\[132,5\]` (channel_id, message_count)
  - Creates a thread with N messages in the specified channel,
    and enables threading in that channel if necessary
2023-04-20 10:53:10 +10:00

87 lines
2.3 KiB
Ruby

# frozen_string_literal: true
require "discourse_dev"
require "rails"
require "faker"
module DiscourseDev
class Record
DEFAULT_COUNT = 30.freeze
AUTO_POPULATED = "auto_populated"
attr_reader :model, :type
def initialize(model, count = DEFAULT_COUNT)
@@initialized ||=
begin
Faker::Discourse.unique.clear
RateLimiter.disable
true
end
@model = model
@type = model.to_s.downcase.to_sym
@count = count
end
def create!
record = model.create!(data)
record.custom_fields[AUTO_POPULATED] = true if record.respond_to?(:custom_fields)
yield(record) if block_given?
DiscourseEvent.trigger(:after_create_dev_record, record, type)
record
end
def populate!(ignore_current_count: false)
unless Discourse.allow_dev_populate?
raise 'To run this rake task in a production site, set the value of `ALLOW_DEV_POPULATE` environment variable to "1"'
end
unless ignore_current_count || @ignore_current_count
if current_count >= @count
puts "Already have #{current_count} #{type} records"
Rake.application.top_level_tasks.each { |task_name| Rake::Task[task_name].reenable }
Rake::Task["dev:repopulate"].invoke
return
elsif current_count > 0
@count -= current_count
puts "There are #{current_count} #{type} records. Creating #{@count} more."
else
puts "Creating #{@count} sample #{type} records"
end
end
records = []
@count.times do
records << create!
putc "." unless type == :post
end
puts unless type == :post
DiscourseEvent.trigger(:after_populate_dev_records, records, type)
records
end
def current_count
model.count
end
def self.populate!(**args)
self.new(**args).populate!
end
def self.random(model, use_existing_records: true)
if !use_existing_records && model.new.respond_to?(:custom_fields)
model.joins(:_custom_fields).where("#{:type}_custom_fields.name = '#{AUTO_POPULATED}'")
end
count = model.count
raise "#{:type} records are not yet populated" if count == 0
offset = Faker::Number.between(from: 0, to: count - 1)
model.offset(offset).first
end
end
end