main
rake 43 lines 1.38 KB
Raw
1 # lib/tasks/admin.rake
2 # Manage staff (admin console) access. Admin is granted by hand — there is no
3 # self-service path to it.
4 #
5 # Usage:
6 # bin/rails "admin:grant[alice]" # by username or email
7 # bin/rails "admin:revoke[alice]"
8 # bin/rails admin:list
9
10 namespace :admin do
11 desc "Grant admin (console) access to a user by username or email"
12 task :grant, [ :who ] => :environment do |_t, args|
13 user = find_user!(args[:who])
14 user.update!(admin: true)
15 puts " [admin:grant] #{user.username} <#{user.email}> is now an admin."
16 end
17
18 desc "Revoke admin access from a user by username or email"
19 task :revoke, [ :who ] => :environment do |_t, args|
20 user = find_user!(args[:who])
21 user.update!(admin: false)
22 puts " [admin:revoke] #{user.username} <#{user.email}> is no longer an admin."
23 end
24
25 desc "List all admins"
26 task list: :environment do
27 admins = User.admins.order(:username)
28 if admins.empty?
29 puts " [admin:list] No admins yet. Grant one: bin/rails \"admin:grant[you]\""
30 else
31 admins.each { |u| puts " - #{u.username} <#{u.email}>" }
32 end
33 end
34 end
35
36 def find_user!(who)
37 who = who.to_s.strip
38 abort " Pass a username or email, e.g. bin/rails \"admin:grant[alice]\"" if who.empty?
39
40 user = User.find_by(username: who) || User.find_by("LOWER(email) = ?", who.downcase)
41 abort " No user found matching '#{who}'." unless user
42 user
43 end