Add controller action for Archive&Restore

This commit is contained in:
Urban Rotnik 2020-06-09 19:18:30 +02:00
parent 26db4f3515
commit fabfd7ddaf
3 changed files with 170 additions and 1 deletions

View file

@ -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

View file

@ -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'

View file

@ -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