Add service for updating ListColumnItems

This commit is contained in:
Urban Rotnik 2019-11-05 14:30:56 +01:00
parent db2943a1b7
commit 804e36650e
2 changed files with 167 additions and 0 deletions

View file

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

View file

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