mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-09-20 14:45:56 +08:00
Add service for updating ListColumnItems
This commit is contained in:
parent
db2943a1b7
commit
804e36650e
|
@ -0,0 +1,56 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module RepositoryColumns
|
||||
class UpdateListColumnService < RepositoryColumns::ColumnService
|
||||
def initialize(user:, team:, column:, params:)
|
||||
super(user: user, repository: column.repository, team: team, column_name: nil)
|
||||
@column = column
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
return self unless valid?
|
||||
|
||||
@column.lock!
|
||||
|
||||
updating_items_names = @params[:repository_list_items_attributes].to_a.map { |e| e[:data] }
|
||||
existing_items_names = @column.repository_list_items.pluck(:data)
|
||||
to_be_deleted = existing_items_names - updating_items_names
|
||||
to_be_created = updating_items_names - existing_items_names
|
||||
|
||||
if @column.repository_list_items.size - to_be_deleted.size + to_be_created.size >=
|
||||
Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN
|
||||
|
||||
@errors[:repository_column] = { repository_list_items: 'too many items dude!' }
|
||||
end
|
||||
return self unless valid?
|
||||
|
||||
@errors[:repository_column] = @column.errors.messages unless @column.update(@params.slice(:name))
|
||||
return self unless valid?
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
to_be_deleted.each do |item|
|
||||
deleted_item_id = @column.repository_list_items.find_by(data: item).destroy!.id
|
||||
RepositoryCell.where('value_type = ? AND value_id = ?', 'RepositoryListValue', deleted_item_id).destroy_all
|
||||
end
|
||||
|
||||
to_be_created.each do |item|
|
||||
RepositoryListItem.create!(
|
||||
repository: @repository,
|
||||
repository_column: @column,
|
||||
data: item,
|
||||
created_by: @user,
|
||||
last_modified_by: @user
|
||||
)
|
||||
end
|
||||
rescue ActiveRecord::RecordInvalid => e
|
||||
@errors[:repository_column] = { repository_list_item: e.message }
|
||||
|
||||
raise ActiveRecord::Rollback
|
||||
end
|
||||
log_activity(:edit_column_inventory) if valid?
|
||||
|
||||
self
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,111 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe RepositoryColumns::UpdateListColumnService do
|
||||
let(:user) { create :user }
|
||||
let!(:user_team) { create :user_team, :admin, user: user, team: team }
|
||||
let(:team) { create :team }
|
||||
let(:repository) { create :repository, team: team }
|
||||
let(:column) { create :repository_column, :list_type }
|
||||
let(:list_item) { create(:repository_list_item, repository: repository, repository_column: column) }
|
||||
let(:service_call) do
|
||||
RepositoryColumns::UpdateListColumnService.call(column: column,
|
||||
user: user,
|
||||
team: team,
|
||||
params: params)
|
||||
end
|
||||
|
||||
context 'when updates column name' do
|
||||
let(:params) { { name: 'my new column' } }
|
||||
|
||||
it 'updates RepositoryColumn record' do
|
||||
column
|
||||
|
||||
expect { service_call }.to change(column, :name)
|
||||
end
|
||||
|
||||
it 'adds Activity record' do
|
||||
expect { service_call }.to(change { Activity.count }.by(1))
|
||||
end
|
||||
end
|
||||
|
||||
context 'when changing list items' do
|
||||
let(:column) { create :repository_column, :list_type }
|
||||
let(:list_item) { create(:repository_list_item, repository: repository, repository_column: column) }
|
||||
|
||||
context 'when adding list item' do
|
||||
let(:params) do
|
||||
{
|
||||
repository_list_items_attributes: [
|
||||
{ data: list_item.data },
|
||||
{ data: 'new added list item' }
|
||||
]
|
||||
}
|
||||
end
|
||||
|
||||
it 'removes RepositoryStatusItem record' do
|
||||
list_item
|
||||
|
||||
expect { service_call }.to(change { RepositoryListItem.count }.by(1))
|
||||
end
|
||||
end
|
||||
|
||||
context 'when deleting list item' do
|
||||
let(:params) do
|
||||
{
|
||||
repository_list_items_attributes: []
|
||||
}
|
||||
end
|
||||
|
||||
it 'removes RepositoryStatusItem record' do
|
||||
list_item
|
||||
|
||||
expect { service_call }.to(change { RepositoryListItem.count }.by(-1))
|
||||
end
|
||||
end
|
||||
|
||||
context 'when there is more than 500 items' do
|
||||
let(:params) do
|
||||
{
|
||||
repository_list_items_attributes: Array(1..510).map { |e| { data: "Item #{e}" } }
|
||||
}
|
||||
end
|
||||
|
||||
it 'returns error about repository_list_item' do
|
||||
column
|
||||
|
||||
expect(service_call.errors[:repository_column]).to have_key(:repository_list_items)
|
||||
end
|
||||
|
||||
it 'no items has been inserted' do
|
||||
expect { service_call }.to(change { RepositoryListItem.count }.by(0))
|
||||
end
|
||||
end
|
||||
|
||||
context 'when there not valid item' do
|
||||
let(:params) do
|
||||
{
|
||||
repository_list_items_attributes: [
|
||||
{ data: 'first item' },
|
||||
{ data: 'second item' },
|
||||
{ data: 'third item' },
|
||||
{ data: 'Too long item' * 3000 }
|
||||
]
|
||||
}
|
||||
end
|
||||
|
||||
it 'returns error about wrong item' do
|
||||
expect(service_call.errors[:repository_column]).to have_key(:repository_list_item)
|
||||
end
|
||||
|
||||
it 'does not insert any items' do
|
||||
expect { service_call }.to(change { RepositoryListItem.count }.by(0))
|
||||
end
|
||||
|
||||
it 'does not add Activity record' do
|
||||
expect { service_call }.not_to(change { Activity.count })
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue