Skip to content

Instantly share code, notes, and snippets.

@hogihung
Created November 30, 2018 21:32
Show Gist options
  • Save hogihung/901c0b1e7c04edfea08301c2c884c58f to your computer and use it in GitHub Desktop.
Save hogihung/901c0b1e7c04edfea08301c2c884c58f to your computer and use it in GitHub Desktop.
require 'csv'
$VERBOSE = nil
namespace :user do
desc "Display Help for managing users"
task :help do
puts "Below are examples of how to use the user related rake tasks:"
puts " rake user:create_user['John Q. User','john.q.user@email.com','mypassword']"
puts " rake user:delete_user['John Q. User','john.q.user@bobots.com']"
puts " rake user:create_from_file[/tmp/add_api_users.csv]"
puts " rake user:delete_from_file[/tmp/delete_api_users.csv]"
puts ""
puts "NOTE: Make sure you do not have spaces when you list parameters in the []s"
puts ""
puts "Example CSV file:"
puts "-----------------"
puts "contact,contact_email,password"
puts "John Q. User,john.q.user@email.com,myPassW0rd"
end
desc "List current defined users"
task :list_users => :environment do
puts "The following users are defined:"
puts "--------------------------------"
users = DB[:api_users].all
users.each do |user|
display_user(user)
end
end
desc "Create an API User using passed arguments in format: ['contact','email_addr','password']"
task :create_user, [:contact, :contact_email, :password] => :environment do |t, args|
record = args.to_hash
user = APIUser.where(contact: record[:contact], contact_email: record[:contact_email]).first
if user.nil?
puts "Creating user #{record[:contact]} : #{record[:contact_email]}"
user = APIUser.new(record)
user[:is_active] = 1
user.save
else
puts "User #{record[:contact]} : #{record[:contact_email]} already exists, exitting."
end
end
desc "Delete an API User using their email address in format: ['some_user@domain.com']"
task :delete_user, [:contact_email] => :environment do |t, args|
record = args.to_hash
user = APIUser.where(contact: record[:contact], contact_email: record[:contact_email]).first
if user.nil?
puts "User #{record[:contact]} : #{record[:contact_email]} does not exist, ignorring"
else
puts "Deleting user #{record[:contact]} : #{record[:contact_email]}"
end
end
desc "Create users from records found in CSV file (creates or updates existing users)"
task :create_from_file, [:filename] => :environment do |t, args|
records = parse_csv(args[:filename])
records.each do |record|
next if record.empty?
user = APIUser.find(contact: record['contact'], contact_email: record['contact_email'])
if user.nil?
puts "Creating a new record for user: #{record['contact']}"
user = APIUser.new(record)
user[:is_active] = 1
user.save
else
puts "Updating record for user: #{record['contact']}"
user[:contact] = record['contact']
user[:contact_email] = record['contact_email']
end
end
end
desc "Delete users from records found in CSV file"
task :delete_from_file, [:filename] => :environment do |t, args|
records = parse_csv(args[:filename])
records.each do |record|
next if record.empty?
user = APIUser.find(contact: record['contact'], contact_email: record['contact_email'])
if user.nil?
puts "No record found for: #{record['contact']}, ignoring entry"
else
puts "Deleting record for user: #{record['contact']}"
user = APIUser.where(contact: record['contact'], contact_email: record['contact_email']).first
user.delete
end
end
end
def parse_csv(filename)
validate_(filename)
records = []
CSV.foreach(filename, headers: true) do |row|
records << row.to_hash
end
records
end
def validate_(filename)
if File.exist?(filename)
return filename
else
puts 'Invalid filename, exiting.'
exit
end
end
def display_user(user)
puts "ID: #{user[:id]}, Contact: #{user[:contact]}, Contact Email: #{user[:contact_email]}, Is Active: #{user[:is_active]}, Role: #{user[:role]}, Access Level: #{user[:access_level]}"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment