1 # frozen_string_literal: true
3 class ModerationZonesController < ApplicationController
6 before_action :authorize_web
7 before_action :set_locale
11 before_action :check_database_readable
12 before_action :check_database_writable, :except => [:index]
13 before_action :set_moderation_zone, :only => [:edit, :update]
16 @moderation_zones = ModerationZone.all
20 @moderation_zone = ModerationZone.new
26 @moderation_zone = ModerationZone.new(moderation_zone_params)
27 @moderation_zone.creator = current_user
29 if @moderation_zone.save
30 redirect_to moderation_zones_url, :notice => t(".success")
32 render :new, :status => :unprocessable_content
37 check_revocation(@moderation_zone, moderation_zone_params)
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
51 render :edit, :status => :unprocessable_content
57 def set_moderation_zone
58 @moderation_zone = ModerationZone.find(params.expect(:id))
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
67 def check_revocation(original, changes)
68 original.revoker = current_user if original.active? && !projected_record(original, changes).active?
71 def updating_without_revoking?(original, changes)
72 original.active? && projected_record(original, changes).active?
75 def reactivating?(original, changes)
76 !original.active? && projected_record(original, changes).active?
79 def projected_record(original, changes)
80 original.dup.tap do |duplicate|
81 duplicate.assign_attributes(changes)