mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-12-17 22:28:38 +08:00
Add controller action for Archive&Restore
This commit is contained in:
parent
26db4f3515
commit
fabfd7ddaf
3 changed files with 170 additions and 1 deletions
|
|
@ -9,7 +9,7 @@ class RepositoryRowsController < ApplicationController
|
||||||
before_action :check_read_permissions, except: %i(create update delete_records copy_records)
|
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_snapshotting_status, only: %i(create update delete_records copy_records)
|
||||||
before_action :check_create_permissions, only: :create
|
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)
|
before_action :check_manage_permissions, only: %i(update copy_records)
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
|
@ -170,6 +170,32 @@ class RepositoryRowsController < ApplicationController
|
||||||
}
|
}
|
||||||
end
|
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
|
private
|
||||||
|
|
||||||
include StringUtility
|
include StringUtility
|
||||||
|
|
|
||||||
|
|
@ -617,6 +617,12 @@ Rails.application.routes.draw do
|
||||||
post 'copy_records',
|
post 'copy_records',
|
||||||
to: 'repository_rows#copy_records',
|
to: 'repository_rows#copy_records',
|
||||||
defaults: { format: 'json' }
|
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',
|
get 'repository_columns/:id/destroy_html',
|
||||||
to: 'repository_columns#destroy_html',
|
to: 'repository_columns#destroy_html',
|
||||||
as: 'columns_destroy_html'
|
as: 'columns_destroy_html'
|
||||||
|
|
|
||||||
|
|
@ -189,4 +189,141 @@ describe RepositoryRowsController, type: :controller do
|
||||||
.to(change { Activity.count })
|
.to(change { Activity.count })
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue