Skip to content

Instantly share code, notes, and snippets.

@criess
Last active July 13, 2021 13:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save criess/6b41fc852805a22f0d81087d829f5eee to your computer and use it in GitHub Desktop.
Save criess/6b41fc852805a22f0d81087d829f5eee to your computer and use it in GitHub Desktop.
require 'csv'
require 'net/http'
require 'optparse'
require 'securerandom'
##
# example csv:
# ```
# email;gender;lastname;firstname;role
# you@andme.com;other;Some;Name;admin
# he@some.com;male;Lord;Chancellor;admin
# ```
#
# invocation for single addition:
# `bundle exec rails r <this-script-location> -- -n FirstNameValue -l LastNameValue -e 'EmailValue@lvh.me' -g GenderValue -r RoleValue`
#
# gender is enum[female, male, other]
csv_headers = %i[gender email last_name first_name role]
csv = nil
should_direct_params = false
direct_params = {}
OptionParser.new do |parser|
parser.on('-n Name', '--first-name Name', 'first name for user creation') do |val|
direct_params.merge!(first_name: val)
end
parser.on('-l Name', '--last-name Name', 'last name for user creation') do |val|
direct_params.merge!(last_name: val)
end
parser.on('-e EmailAddress', '--email EmailAddress', 'email for user creation') do |val|
direct_params.merge!(email: val)
end
parser.on('-g Gender', '--gender Gender', 'gender for user creation') do |val|
direct_params.merge!(gender: val)
end
parser.on('-r Role', '--role Role', 'role for user creation') do |val|
direct_params.merge!(role: val)
end
parser.on('-f FilePath', '--file FilePath', '') do |val|
csv = val
end
end.parse!
if csv.nil? && direct_params.size < 5
$stdout << "missing info: either -f or all other params are required to execute. see --help\n"
exit 127
end
if csv.is_a?(String) && direct_params.size > 4
$stdout << "ambigous options: either -f or all other params should be given. see --help\n"
exit 63
end
if csv.is_a?(String)
CSV(File.read(csv), col_sep: ';', headers: true).each do |row|
data_keys = row.to_h.keys.map(&:to_sym)
raise "malformed csv row (headers were: #{data_keys}) " unless csv_headers - data_keys == []
raise "already exists: #{row['email']}" if User.where(email: row['email']).any?
user = User.create!(locale: :en, confirmed_at: Time.now, password: SecureRandom.hex(20), **row.to_h).tap(
&:send_reset_password_instructions
)
Person.create!(locale: :en, user: user, **row.to_h.except('role'))
$stdout << "created `#{row['role']}` User: #{row['email']}\n"
end
end
if direct_params.size > 4
raise "already exists: #{direct_params[:email]}" if User.where(email: direct_params[:email]).any?
user = User.create!(locale: :en, confirmed_at: Time.now, password: SecureRandom.hex(20), **direct_params).tap(
&:send_reset_password_instructions
)
Person.create!(locale: :en, user: user, **direct_params.to_h.except(:role))
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment