From fabfd7ddaf6e5511ee0b5d5a694cdbb84fe9a58c Mon Sep 17 00:00:00 2001 From: Urban Rotnik Date: Tue, 9 Jun 2020 19:18:30 +0200 Subject: [PATCH] Add controller action for Archive&Restore --- app/controllers/repository_rows_controller.rb | 28 +++- config/routes.rb | 6 + .../repository_rows_controller_spec.rb | 137 ++++++++++++++++++ 3 files changed, 170 insertions(+), 1 deletion(-) diff --git a/app/controllers/repository_rows_controller.rb b/app/controllers/repository_rows_controller.rb index fdb82f49c..3868590c5 100644 --- a/app/controllers/repository_rows_controller.rb +++ b/app/controllers/repository_rows_controller.rb @@ -9,7 +9,7 @@ class RepositoryRowsController < ApplicationController before_action :check_read_permissions, except: %i(create update delete_records copy_records) before_action :check_snapshotting_status, only: %i(create update delete_records copy_records) before_action :check_create_permissions, only: :create - before_action :check_delete_permissions, only: :delete_records + before_action :check_delete_permissions, only: %i(delete_records archive_records restore_records) before_action :check_manage_permissions, only: %i(update copy_records) def index @@ -170,6 +170,32 @@ class RepositoryRowsController < ApplicationController } end + def archive_records + service = RepositoryActions::ArchiveRowsService.call(repository: @repository, + repository_rows: copy_records_params, + user: current_user, + team: current_team) + + if service.succeed? + render json: {}, status: :ok + else + render json: { status: service.errors }, status: :unprocessable_entity + end + end + + def restore_records + service = RepositoryActions::RestoreRowsService.call(repository: @repository, + repository_rows: copy_records_params, + user: current_user, + team: current_team) + + if service.succeed? + render json: {}, status: :ok + else + render json: { status: service.errors }, status: :unprocessable_entity + end + end + private include StringUtility diff --git a/config/routes.rb b/config/routes.rb index ff41159e3..aa7d8b555 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -617,6 +617,12 @@ Rails.application.routes.draw do post 'copy_records', to: 'repository_rows#copy_records', defaults: { format: 'json' } + post 'archive_records', + to: 'repository_rows#archive_records', + defaults: { format: 'json' } + post 'restore_records', + to: 'repository_rows#restore_records', + defaults: { format: 'json' } get 'repository_columns/:id/destroy_html', to: 'repository_columns#destroy_html', as: 'columns_destroy_html' diff --git a/spec/controllers/repository_rows_controller_spec.rb b/spec/controllers/repository_rows_controller_spec.rb index b5b6b0150..e1132bd07 100644 --- a/spec/controllers/repository_rows_controller_spec.rb +++ b/spec/controllers/repository_rows_controller_spec.rb @@ -189,4 +189,141 @@ describe RepositoryRowsController, type: :controller do .to(change { Activity.count }) end end + + describe 'POST archive_rows' do + let(:action) { post :archive_records, params: params, format: :json } + let(:params) do + { repository_id: repository.id, selected_rows: [repository_row.id] } + end + + context 'when has permission' do + context 'when archiving passes' do + it 'change archived boolean to true' do + action + + expect(repository_row.reload.archived).to be_truthy + end + + it 'renders 200' do + action + + expect(response).to have_http_status(:ok) + end + end + + context 'when archiving fails' do + before do + # Make invalid row record + repository_row.name = '' + repository_row.save(validate: false) + end + + it 'does not change archived boolean to true' do + action + + expect(repository_row.reload.archived).to be_falsey + end + + it 'renders 422' do + action + + expect(response).to have_http_status(:unprocessable_entity) + end + end + end + + context 'when does not have permission' do + let!(:user_team) { create :user_team, :guest, team: second_team, user: user } + let(:second_team) { create :team, created_by: second_user } + let(:second_user) { create :user } + let(:repository) { create :repository, team: second_team, created_by: second_user } + + context 'when guest' do + it 'renders 403' do + action + + expect(response).to have_http_status(:forbidden) + end + end + + context 'when does not see repository' do + let(:repository) { create :repository, team: (create :team), created_by: second_user } + + it 'renders 404' do + action + + expect(response).to have_http_status(:not_found) + end + end + end + end + + describe 'POST restore_rows' do + let(:repository_row) { create :repository_row, :archived, repository: repository, created_by: user } + let(:action) { post :restore_records, params: params, format: :json } + let(:params) do + { repository_id: repository.id, selected_rows: [repository_row.id] } + end + + context 'when has permission' do + context 'when restoring passes' do + it 'change archived boolean to false' do + action + + expect(repository_row.reload.archived).to be_falsey + end + + it 'renders 200' do + action + + expect(response).to have_http_status(:ok) + end + end + + context 'when restoring fails' do + before do + # Make invalid row record + repository_row.name = '' + repository_row.save(validate: false) + end + + it 'does not change archived boolean to false' do + action + + expect(repository_row.reload.archived).to be_truthy + end + + it 'renders 422' do + action + + expect(response).to have_http_status(:unprocessable_entity) + end + end + end + + context 'when does not have permission' do + let!(:user_team) { create :user_team, :guest, team: second_team, user: user } + let(:second_team) { create :team, created_by: second_user } + let(:second_user) { create :user } + let(:repository) { create :repository, team: second_team, created_by: second_user } + + context 'when guest' do + it 'renders 403' do + action + + expect(response).to have_http_status(:forbidden) + end + end + + context 'when does not see repository' do + let(:repository) { create :repository, team: (create :team), created_by: second_user } + + it 'renders 404' do + action + + expect(response).to have_http_status(:not_found) + end + end + end + end end