summaryrefslogtreecommitdiff
path: root/app/controllers/admin/users_controller.rb
blob: 223939b1dd389ca55ee35d867cfab64d1d139f03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# frozen_string_literal: true

class Admin::UsersController < ApplicationController
  before_action :check_auth, except: [:index]
  before_action :load_user, except: [:index]

  def index
    authorize! :mod_read, User

    @users = if params[:q]
      @query = params[:q]
      User.where('(name ILIKE ?) OR (email = ?)', @query + '%', @query)
    else
      User
    end.order(created_at: :desc)

    @title = 'Admin - Users'
    @users = @users.where(role: User::STAFF_ROLES) if params[:staff].present?
    @users = @users.where(otp_required_for_login: true) if params[:twofactor].present? && can?(:twofactor, User)
    @users = @users.page(params[:page]).per(50)

    respond_to do |format|
      format.html
      format.json { render json: @users }
    end
  end

  def edit
    @title = "Editing User: #{@user.name}"
  end

  def update
    if @current_user.can?(:manage, Role)
      @user.set_or_unset_role params[:batch_tag],            :batch_update, Tag
      @user.set_or_unset_role params[:abuses_polls],         :abuses,       Poll
      @user.set_or_unset_role params[:abuses_poll_votes],    :abuses,       PollVote
      @user.set_or_unset_role params[:image_mod] == '1',     :moderator,    Post
      @user.set_or_unset_role params[:dupe_mod] == '1',      :moderator,    DuplicateReport
      @user.set_or_unset_role params[:comment_mod] == '1',   :moderator,    Comment
      @user.set_or_unset_role params[:tag_mod] == '1',       :moderator,    Tag
      @user.set_or_unset_role params[:link_mod] == '1',      :moderator,    UserLink
      @user.set_or_unset_role params[:user_edit] == '1',     :moderator,    User
      @user.set_or_unset_role params[:forum_mod] == '1',     :moderator,    Topic
      @user.set_or_unset_role params[:tag_admin] == '1',     :admin,        Tag
      @user.set_or_unset_role params[:can_notice] == '1',    :admin,        SiteNotice
      @user.set_or_unset_role params[:can_badges] == '1',    :admin,        Badge
      @user.set_or_unset_role params[:can_roles] == '1',     :admin,        Role
      @user.set_or_unset_role params[:flipper] == '1',       :flipper
      @user.set_or_unset_role params[:ban_competent] == '1', :ban_competent
      @user.set_or_unset_role params[:twofactor] == '1',     :twofactor
      @user.set_or_unset_role params[:batch_delete] == '1',  :batch_delete, Post
    end

    authorize! :manage, Role if (role_changed = params[:user][:role].present? && @user.role != params[:user][:role])

    respond_to do |format|
      if @user.update(user_params)
        @user.unsubscribe_restricted_actors if role_changed

        format.html { redirect_to profile_path(@user.slug), notice: 'User was successfully updated.' }
        format.json { render json: @user, status: :created, location: admin_users_path }
      else
        format.html { render action: 'new' }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  private

  def check_auth
    authorize! :manage, User
  end

  def load_user
    @user = User.find_by_slug(params[:id])
    raise ActiveRecord::RecordNotFound unless @user
  end

  def user_params
    params.require(:user).permit(:name, :email, :role, :secondary_role, :hide_default_role, :personal_title, :avatar, :remove_avatar)
  end
end