diff options
Diffstat (limited to 'app.rb')
| -rw-r--r-- | app.rb | 40 |
1 files changed, 40 insertions, 0 deletions
@@ -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] |
