summaryrefslogtreecommitdiffstats
path: root/app.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app.rb')
-rw-r--r--app.rb40
1 files changed, 40 insertions, 0 deletions
diff --git a/app.rb b/app.rb
index ece8b18..9f02422 100644
--- a/app.rb
+++ b/app.rb
@@ -1007,6 +1007,46 @@ post '/admin/people/:uuid/delete' do
redirect '/admin/people'
end
+post '/admin/people/:uuid/bulk_move' do
+ require_admin!
+ src = params[:uuid]
+ action = params['bulk_action'].to_s.strip
+ entries = Array(params['entries[]']).map { |e| JSON.parse(e) rescue nil }.compact
+
+ halt 400 if entries.empty?
+
+ data = load_people_data
+ people = data['people'] || {}
+ halt 404 unless people.key?(src)
+
+ to_move = entries.filter_map do |e|
+ rel = e['rel']; box = e['box'].map(&:to_i)
+ people[src]['members'].find { |m| m['rel'] == rel && m['box'].map(&:to_i) == box }
+ end
+
+ people[src]['members'] -= to_move
+
+ case action
+ when 'blacklist'
+ data['blacklist'] ||= []
+ data['blacklist'].concat(to_move)
+ when 'pool'
+ people['__pool__'] ||= { 'name' => '__pool__', 'slug' => nil, 'members' => [] }
+ people['__pool__']['members'].concat(to_move)
+ when /\A[0-9a-f-]{36}\z/
+ halt 404 unless people.key?(action)
+ people[action]['members'].concat(to_move)
+ else
+ halt 400
+ end
+
+ people.delete(src) if people[src]['members'].empty?
+ data['people'] = people
+ atomic_write(PEOPLE_PATH, JSON.pretty_generate(data))
+
+ people[src] ? redirect("/admin/people/#{src}") : redirect('/admin/people')
+end
+
post '/admin/people/:uuid/merge' do
require_admin!
src = params[:uuid]