changes per @duco 's request

This commit is contained in:
zmagod 2018-04-13 11:47:33 +02:00
parent cebb06269b
commit 4f21833373
4 changed files with 30 additions and 40 deletions

View file

@ -279,9 +279,9 @@ class RepositoryRowsController < ApplicationController
end end
def copy_records def copy_records
duplicate_service = RepositoryActions::Duplicate.new(current_user, duplicate_service = RepositoryActions::DuplicateRows.new(
@repository, current_user, @repository, params[:selected_rows]
params[:selected_rows]) )
duplicate_service.call duplicate_service.call
render json: { render json: {
flash: t('repositories.copy_records_report', flash: t('repositories.copy_records_report',

View file

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module RepositoryActions module RepositoryActions
class RepositoryCellResolver class DuplicateCell
def initialize(cell, new_row, team) def initialize(cell, new_row, team)
@cell = cell @cell = cell
@new_row = new_row @new_row = new_row
@ -9,21 +9,12 @@ module RepositoryActions
end end
def call def call
case @cell.value_type self.send("duplicate_#{@cell.value_type.underscore}")
when 'RepositoryListValue'
clone_repository_list_value
when 'RepositoryTextValue'
clone_repository_text_value
when 'RepositoryAssetValue'
clone_repository_asset_value
when 'RepositoryDateValue'
clone_repository_date_value
end
end end
private private
def clone_repository_list_value def duplicate_repository_list_value
old_value = @cell.value old_value = @cell.value
RepositoryListValue.create( RepositoryListValue.create(
old_value.attributes.merge(id: nil, old_value.attributes.merge(id: nil,
@ -34,7 +25,7 @@ module RepositoryActions
) )
end end
def clone_repository_text_value def duplicate_repository_text_value
old_value = @cell.value old_value = @cell.value
RepositoryTextValue.create( RepositoryTextValue.create(
old_value.attributes.merge(id: nil, old_value.attributes.merge(id: nil,
@ -45,7 +36,7 @@ module RepositoryActions
) )
end end
def clone_repository_asset_value def duplicate_repository_asset_value
old_value = @cell.value old_value = @cell.value
new_asset = create_new_asset(old_value.asset) new_asset = create_new_asset(old_value.asset)
RepositoryAssetValue.create( RepositoryAssetValue.create(
@ -60,7 +51,7 @@ module RepositoryActions
) )
end end
def clone_repository_date_value def duplicate_repository_date_value
old_value = @cell.value old_value = @cell.value
RepositoryDateValue.create( RepositoryDateValue.create(
old_value.attributes.merge(id: nil, old_value.attributes.merge(id: nil,

View file

@ -1,32 +1,31 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'repository_actions/repository_cell_resolver' require 'repository_actions/duplicate_cell'
module RepositoryActions module RepositoryActions
class Duplicate class DuplicateRows
attr_reader :number_of_duplicated_items attr_reader :number_of_duplicated_items
def initialize(user, repository, rows_to_copy = []) def initialize(user, repository, rows_ids = [])
@user = user @user = user
@repository = repository @repository = repository
@rows_to_copy = rows_to_copy.map(&:to_i).uniq @rows_to_duplicate = sanitize_rows_to_duplicate(rows_ids)
@number_of_duplicated_items = 0 @number_of_duplicated_items = 0
end end
def call def call
sanitize_rows_to_copy @rows_to_duplicate.each do |row_id|
@rows_to_copy.each do |row_id| duplicate_row(row_id)
copy_row(row_id)
end end
end end
private private
def sanitize_rows_to_copy def sanitize_rows_to_duplicate(rows_ids)
ids = @repository.repository_rows.pluck(:id) process_ids = rows_ids.map(&:to_i).uniq
@rows_to_copy.map! { |el| ids.include?(el) ? el : nil }.compact! @repository.repository_rows.where(id: process_ids).pluck(:id)
end end
def copy_row(id) def duplicate_row(id)
row = RepositoryRow.find_by_id(id) row = RepositoryRow.find_by_id(id)
new_row = RepositoryRow.new( new_row = RepositoryRow.new(
row.attributes.merge(new_row_attributes(row.name)) row.attributes.merge(new_row_attributes(row.name))
@ -35,7 +34,7 @@ module RepositoryActions
if new_row.save if new_row.save
@number_of_duplicated_items += 1 @number_of_duplicated_items += 1
row.repository_cells.each do |cell| row.repository_cells.each do |cell|
copy_repository_cell(cell, new_row) duplicate_repository_cell(cell, new_row)
end end
end end
end end
@ -48,10 +47,10 @@ module RepositoryActions
updated_at: timestamp } updated_at: timestamp }
end end
def copy_repository_cell(cell, new_row) def duplicate_repository_cell(cell, new_row)
RepositoryActions::RepositoryCellResolver.new(cell, RepositoryActions::DuplicateCell.new(
new_row, cell, new_row, @user.current_team
@user.current_team).call ).call
end end
end end
end end

View file

@ -1,6 +1,6 @@
require 'rails_helper' require 'rails_helper'
describe RepositoryActions::Duplicate do describe RepositoryActions::DuplicateRows do
let!(:user) { create :user } let!(:user) { create :user }
let!(:repository) { create :repository } let!(:repository) { create :repository }
let!(:list_column) do let!(:list_column) do
@ -41,13 +41,13 @@ describe RepositoryActions::Duplicate do
end end
end end
it 'generates a copy of selected items' do it 'generates a duplicate of selected items' do
expect(repository.repository_rows.reload.size).to eq 3 expect(repository.repository_rows.reload.size).to eq 3
described_class.new(user, repository, @rows_ids).call described_class.new(user, repository, @rows_ids).call
expect(repository.repository_rows.reload.size).to eq 6 expect(repository.repository_rows.reload.size).to eq 6
end end
it 'generates an exact copy of the row with custom column values' do it 'generates an exact duplicate of the row with custom column values' do
described_class.new(user, repository, [@rows_ids.first]).call described_class.new(user, repository, [@rows_ids.first]).call
duplicated_row = repository.repository_rows.order('created_at ASC').last duplicated_row = repository.repository_rows.order('created_at ASC').last
expect(duplicated_row.name).to eq 'row (0) (1)' expect(duplicated_row.name).to eq 'row (0) (1)'
@ -60,7 +60,7 @@ describe RepositoryActions::Duplicate do
end end
end end
it 'prevents to copy items that do not already belong to repository' do it 'prevents to duplicate items that do not already belong to repository' do
new_repository = create :repository, name: 'new repo' new_repository = create :repository, name: 'new repo'
new_row = create :repository_row, name: 'other row', new_row = create :repository_row, name: 'other row',
repository: new_repository repository: new_repository
@ -68,13 +68,13 @@ describe RepositoryActions::Duplicate do
expect(repository.repository_rows.reload.size).to eq 3 expect(repository.repository_rows.reload.size).to eq 3
end end
it 'returns the number of copied items' do it 'returns the number of duplicated items' do
service_obj = described_class.new(user, repository, @rows_ids) service_obj = described_class.new(user, repository, @rows_ids)
service_obj.call service_obj.call
expect(service_obj.number_of_duplicated_items).to eq 3 expect(service_obj.number_of_duplicated_items).to eq 3
end end
it 'returns the number of copied items' do it 'returns the number of duplicated items' do
service_obj = described_class.new(user, repository, []) service_obj = described_class.new(user, repository, [])
service_obj.call service_obj.call
expect(service_obj.number_of_duplicated_items).to eq 0 expect(service_obj.number_of_duplicated_items).to eq 0