2018-04-11 23:17:19 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2018-04-13 17:47:33 +08:00
|
|
|
require 'repository_actions/duplicate_cell'
|
2018-04-11 23:17:19 +08:00
|
|
|
|
|
|
|
module RepositoryActions
|
2018-04-13 17:47:33 +08:00
|
|
|
class DuplicateRows
|
2018-04-11 23:17:19 +08:00
|
|
|
attr_reader :number_of_duplicated_items
|
2018-04-13 17:47:33 +08:00
|
|
|
def initialize(user, repository, rows_ids = [])
|
2018-04-11 23:17:19 +08:00
|
|
|
@user = user
|
|
|
|
@repository = repository
|
2018-04-13 17:47:33 +08:00
|
|
|
@rows_to_duplicate = sanitize_rows_to_duplicate(rows_ids)
|
2018-04-11 23:17:19 +08:00
|
|
|
@number_of_duplicated_items = 0
|
|
|
|
end
|
|
|
|
|
|
|
|
def call
|
2018-04-13 17:47:33 +08:00
|
|
|
@rows_to_duplicate.each do |row_id|
|
|
|
|
duplicate_row(row_id)
|
2018-04-11 23:17:19 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2018-04-13 17:47:33 +08:00
|
|
|
def sanitize_rows_to_duplicate(rows_ids)
|
|
|
|
process_ids = rows_ids.map(&:to_i).uniq
|
|
|
|
@repository.repository_rows.where(id: process_ids).pluck(:id)
|
2018-04-11 23:17:19 +08:00
|
|
|
end
|
|
|
|
|
2018-04-13 17:47:33 +08:00
|
|
|
def duplicate_row(id)
|
2018-04-11 23:17:19 +08:00
|
|
|
row = RepositoryRow.find_by_id(id)
|
|
|
|
new_row = RepositoryRow.new(
|
2019-05-13 21:37:36 +08:00
|
|
|
row.attributes.merge(new_row_attributes(row.name, @user.id))
|
2018-04-11 23:17:19 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
if new_row.save
|
|
|
|
@number_of_duplicated_items += 1
|
|
|
|
row.repository_cells.each do |cell|
|
2018-04-13 17:47:33 +08:00
|
|
|
duplicate_repository_cell(cell, new_row)
|
2018-04-11 23:17:19 +08:00
|
|
|
end
|
2019-03-29 18:24:22 +08:00
|
|
|
|
|
|
|
Activities::CreateActivityService
|
|
|
|
.call(activity_type: :copy_inventory_item,
|
|
|
|
owner: @user,
|
|
|
|
subject: @repository,
|
|
|
|
team: @repository.team,
|
|
|
|
message_items: { repository_row_new: new_row.id, repository_row_original: row.id })
|
2018-04-11 23:17:19 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-05-13 21:37:36 +08:00
|
|
|
def new_row_attributes(name, user_id)
|
2018-04-11 23:17:19 +08:00
|
|
|
timestamp = DateTime.now
|
|
|
|
{ id: nil,
|
|
|
|
name: "#{name} (1)",
|
2019-05-13 21:37:36 +08:00
|
|
|
created_by_id: user_id,
|
2018-04-11 23:17:19 +08:00
|
|
|
created_at: timestamp,
|
|
|
|
updated_at: timestamp }
|
|
|
|
end
|
|
|
|
|
2018-04-13 17:47:33 +08:00
|
|
|
def duplicate_repository_cell(cell, new_row)
|
|
|
|
RepositoryActions::DuplicateCell.new(
|
2018-04-19 19:04:16 +08:00
|
|
|
cell, new_row, @user, @repository.team
|
2018-04-13 17:47:33 +08:00
|
|
|
).call
|
2018-04-11 23:17:19 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|