mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-14 05:05:55 +08:00
105 lines
2.8 KiB
Ruby
105 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Experiments
|
|
class CopyExperimentAsTemplateService
|
|
extend Service
|
|
|
|
attr_reader :errors, :c_exp
|
|
alias cloned_experiment c_exp
|
|
|
|
def initialize(experiment_id:, project_id:, user_id:)
|
|
@exp = Experiment.find experiment_id
|
|
@project = Project.find project_id
|
|
@user = User.find user_id
|
|
@original_project = @exp&.project
|
|
@c_exp = nil
|
|
@errors = {}
|
|
end
|
|
|
|
def call
|
|
return self unless valid?
|
|
|
|
ActiveRecord::Base.transaction do
|
|
@c_exp = Experiment.new(
|
|
name: find_uniq_name,
|
|
description: @exp.description,
|
|
created_by: @user,
|
|
last_modified_by: @user,
|
|
project: @project
|
|
)
|
|
|
|
# Copy all signle taskas
|
|
@c_exp.my_modules << @exp.my_modules.without_group.map do |m|
|
|
m.deep_clone_to_experiment(@user, @c_exp)
|
|
end
|
|
|
|
# Copy all grouped tasks
|
|
@exp.my_module_groups.each do |g|
|
|
@c_exp.my_module_groups << g.deep_clone_to_experiment(@user, @c_exp)
|
|
end
|
|
|
|
# Copy user assignments to the experiment
|
|
@exp.user_assignments.map do |user_assignment|
|
|
new_user_assigment = user_assignment.dup
|
|
new_user_assigment.assignable = @c_exp
|
|
new_user_assigment.save!
|
|
end
|
|
|
|
@c_exp.save!
|
|
end
|
|
@errors.merge!(@c_exp.errors.to_hash) unless @c_exp.valid?
|
|
|
|
@c_exp = nil unless succeed?
|
|
track_activity if succeed?
|
|
|
|
self
|
|
end
|
|
|
|
def succeed?
|
|
@errors.none?
|
|
end
|
|
|
|
private
|
|
|
|
def find_uniq_name
|
|
experiment_names = @project.experiments.map(&:name)
|
|
format = 'Clone %d - %s'
|
|
free_index = 1
|
|
free_index += 1 while experiment_names
|
|
.include?(format(format, free_index, @exp.name))
|
|
format(format, free_index, @exp.name).truncate(Constants::NAME_MAX_LENGTH)
|
|
end
|
|
|
|
def valid?
|
|
unless @exp && @project && @user
|
|
@errors[:invalid_arguments] =
|
|
{ 'experiment': @exp,
|
|
'project': @project,
|
|
'user': @user }
|
|
.map do |key, value|
|
|
"Can't find #{key.capitalize}" if value.nil?
|
|
end.compact
|
|
return false
|
|
end
|
|
|
|
if @exp.projects_with_role_above_user(@user).include?(@project)
|
|
true
|
|
else
|
|
@errors[:user_without_permissions] =
|
|
['You are not allowed to copy this experiment to this project']
|
|
false
|
|
end
|
|
end
|
|
|
|
def track_activity
|
|
Activities::CreateActivityService
|
|
.call(activity_type: :clone_experiment,
|
|
owner: @user,
|
|
team: @project.team,
|
|
project: @c_exp.project,
|
|
subject: @c_exp,
|
|
message_items: { experiment_new: @c_exp.id,
|
|
experiment_original: @exp.id })
|
|
end
|
|
end
|
|
end
|