]> git.openstreetmap.org Git - rails.git/blob - app/controllers/moderation_zones_controller.rb
Merge remote-tracking branch 'upstream/pull/7283'
[rails.git] / app / controllers / moderation_zones_controller.rb
1 # frozen_string_literal: true
2
3 class ModerationZonesController < ApplicationController
4   layout :site_layout
5
6   before_action :authorize_web
7   before_action :set_locale
8
9   authorize_resource
10
11   before_action :check_database_readable
12   before_action :check_database_writable, :except => [:index]
13   before_action :set_moderation_zone, :only => [:edit, :update]
14
15   def index
16     @moderation_zones = ModerationZone.all
17   end
18
19   def new
20     @moderation_zone = ModerationZone.new
21   end
22
23   def edit; end
24
25   def create
26     @moderation_zone = ModerationZone.new(moderation_zone_params)
27     @moderation_zone.creator = current_user
28
29     if @moderation_zone.save
30       redirect_to moderation_zones_url, :notice => t(".success")
31     else
32       render :new, :status => :unprocessable_content
33     end
34   end
35
36   def update
37     check_revocation(@moderation_zone, moderation_zone_params)
38
39     if cannot?(:update, @moderation_zone)
40       flash[:error] = @moderation_zone.revoker ? t(".only_creator_or_revoker_can_edit") : t(".only_creator_can_edit")
41       redirect_to moderation_zones_url
42     elsif current_user != @moderation_zone.creator && updating_without_revoking?(@moderation_zone, moderation_zone_params)
43       flash[:error] = t(".only_creator_can_edit_without_revoking")
44       redirect_to moderation_zones_url
45     elsif reactivating?(@moderation_zone, moderation_zone_params)
46       flash[:error] = t(".no_reactivation")
47       redirect_to moderation_zones_url
48     elsif @moderation_zone.update(moderation_zone_params)
49       redirect_to moderation_zones_url, :notice => t(".success"), :status => :see_other
50     else
51       render :edit, :status => :unprocessable_content
52     end
53   end
54
55   private
56
57   def set_moderation_zone
58     @moderation_zone = ModerationZone.find(params.expect(:id))
59   end
60
61   def moderation_zone_params
62     params.expect(:moderation_zone => [:name, :reason, :zone, :period]).tap do |safe_params|
63       safe_params[:ends_at] = safe_params.delete("period").to_i.hours.from_now
64     end
65   end
66
67   def check_revocation(original, changes)
68     original.revoker = current_user if original.active? && !projected_record(original, changes).active?
69   end
70
71   def updating_without_revoking?(original, changes)
72     original.active? && projected_record(original, changes).active?
73   end
74
75   def reactivating?(original, changes)
76     !original.active? && projected_record(original, changes).active?
77   end
78
79   def projected_record(original, changes)
80     original.dup.tap do |duplicate|
81       duplicate.assign_attributes(changes)
82     end
83   end
84 end