From 2558251cc59607075420ef423731140d7f8ce4b7 Mon Sep 17 00:00:00 2001 From: 2458773093 <2458773093@protonmail.com> Date: Tue, 16 Jul 2019 15:53:56 +0300 Subject: [PATCH] removed users controller --- .../v1/groups/removed_accounts_controller.rb | 90 +++++++++++++++++++ app/policies/group_policy.rb | 12 +++ config/routes.rb | 1 + 3 files changed, 103 insertions(+) create mode 100644 app/controllers/api/v1/groups/removed_accounts_controller.rb diff --git a/app/controllers/api/v1/groups/removed_accounts_controller.rb b/app/controllers/api/v1/groups/removed_accounts_controller.rb new file mode 100644 index 00000000..e0b5b428 --- /dev/null +++ b/app/controllers/api/v1/groups/removed_accounts_controller.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +class Api::V1::Groups::RemovedAccountsController < Api::BaseController + include Authorization + + before_action -> { doorkeeper_authorize! :write, :'write:groups' } + + before_action :require_user! + before_action :set_group + + after_action :insert_pagination_headers, only: :show + + def show + authorize @group, :show_removed_accounts? + + @accounts = load_accounts + render json: @accounts, each_serializer: REST::AccountSerializer + end + + def create + authorize @group, :create_removed_account? + + @account = @group.accounts.find(params[:account_id]) + @group.removed_accounts << @account + GroupAccount.where(group: @group, account: @account).destroy_all + render_empty + end + + def destroy + authorize @group, :destroy_removed_account? + + @account = @group.removed_accounts.find(params[:account_id]) + GroupRemovedAccount.where(group: @group, account: @account).destroy_all + render_empty + end + + private + + def set_group + @group = Group.find(params[:group_id]) + end + + def load_accounts + if unlimited? + @group.removed_accounts.includes(:account_stat).all + else + @group.removed_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 +end diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb index 33b0ad86..2b629dae 100644 --- a/app/policies/group_policy.rb +++ b/app/policies/group_policy.rb @@ -42,6 +42,18 @@ class GroupPolicy < ApplicationPolicy is_group_admin? end + def show_removed_accounts? + is_group_admin? + end + + def create_removed_account? + is_group_admin? + end + + def destroy_removed_account? + is_group_admin? + end + private def is_member? diff --git a/config/routes.rb b/config/routes.rb index 5966cc72..24c5d152 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -402,6 +402,7 @@ Rails.application.routes.draw do resources :relationships, only: :index, controller: 'groups/relationships' resource :accounts, only: [:show, :create, :update, :destroy], controller: 'groups/accounts' + resource :removed_accounts, only: [:show, :create, :destroy], controller: 'groups/removed_accounts' end resources :polls, only: [:create, :show] do