accounts_controller.rb 2.57 KB
Newer Older
Rob Colbert's avatar
Rob Colbert committed
1 2 3 4 5 6 7 8 9 10 11
# frozen_string_literal: true

class Api::V1::Groups::AccountsController < Api::BaseController
  include Authorization

  before_action -> { doorkeeper_authorize! :read, :'read:groups' }, only: [:show]
  before_action -> { doorkeeper_authorize! :write, :'write:groups' }, except: [:show]

  before_action :require_user!
  before_action :set_group

2458773093's avatar
2458773093 committed
12
  after_action :insert_pagination_headers, only: :show
Rob Colbert's avatar
Rob Colbert committed
13 14 15 16 17 18 19 20 21 22

  def show
    @accounts = load_accounts
    render json: @accounts, each_serializer: REST::AccountSerializer
  end

  def create
    authorize @group, :join?

    @group.accounts << current_account
23 24 25 26 27

    if current_user.allows_group_in_home_feed?
      current_user.force_regeneration!
    end

Rob Colbert's avatar
Rob Colbert committed
28 29 30 31 32 33
    render json: @group, serializer: REST::GroupRelationshipSerializer, relationships: relationships
  end

  def update
    authorize @group, :update_account?

Rob Colbert's avatar
Rob Colbert committed
34 35
    @account = @group.accounts.find(params[:account_id])
    GroupAccount.where(group: @group, account: @account).update(group_account_params)
Rob Colbert's avatar
Rob Colbert committed
36 37 38 39 40 41 42
    render_empty
  end

  def destroy
    authorize @group, :leave?

    GroupAccount.where(group: @group, account_id: current_account.id).destroy_all
43 44 45 46 47

    if current_user.allows_group_in_home_feed?
      current_user.force_regeneration!
    end

Rob Colbert's avatar
Rob Colbert committed
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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
    render json: @group, serializer: REST::GroupRelationshipSerializer, relationships: relationships
  end

  private

  def relationships
    GroupRelationshipsPresenter.new([@group.id], current_user.account_id)
  end

  def set_group
    @group = Group.find(params[:group_id])
  end

  def load_accounts
    if unlimited?
      @group.accounts.includes(:account_stat).all
    else
      @group.accounts.includes(:account_stat).paginate_by_max_id(limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:max_id], params[:since_id])
    end
  end

  def insert_pagination_headers
    set_pagination_headers(next_path, prev_path)
  end

  def next_path
    return if unlimited?

    if records_continue?
      api_v1_group_accounts_url pagination_params(max_id: pagination_max_id)
    end
  end

  def prev_path
    return if unlimited?

    unless @accounts.empty?
      api_v1_group_accounts_url pagination_params(since_id: pagination_since_id)
    end
  end

  def pagination_max_id
    @accounts.last.id
  end

  def pagination_since_id
    @accounts.first.id
  end

  def records_continue?
    @accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
  end

  def pagination_params(core_params)
    params.slice(:limit).permit(:limit).merge(core_params)
  end

  def unlimited?
    params[:limit] == '0'
  end

  def group_account_params
    params.permit(:role, :write_permissions)
  end
end