mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-14 13:16:28 +08:00
57 lines
1.6 KiB
Ruby
57 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module ProtocolImporters
|
|
class ImportProtocolService
|
|
extend Service
|
|
|
|
attr_reader :errors, :protocol
|
|
|
|
def initialize(protocol_params:, steps_params_json:, team_id:, user_id:)
|
|
@user = User.find_by_id user_id
|
|
@team = Team.find_by_id team_id
|
|
@protocol_params = protocol_params
|
|
@steps_params = JSON.parse(steps_params_json)
|
|
@errors = {}
|
|
end
|
|
|
|
def call
|
|
return self unless valid?
|
|
|
|
@protocol = Protocol.new(@protocol_params.merge!(added_by: @user, team: @team))
|
|
|
|
@protocol.steps << @steps_params.map do |step_params|
|
|
# Create step with nested attributes for tables
|
|
s = Step.new(step_params
|
|
.symbolize_keys
|
|
.slice(:name, :position, :description, :tables_attributes)
|
|
.merge(user: @user, completed: false))
|
|
|
|
# 'Manually' create assets here. "Accept nasted attributes" won't work for assets
|
|
s.assets << AttachmentsBuilder.generate(step_params.deep_symbolize_keys, user: @user, team: @team)
|
|
s
|
|
end
|
|
|
|
@errors[:protocol] = @protocol.errors.messages unless @protocol.save
|
|
|
|
self
|
|
end
|
|
|
|
def succeed?
|
|
@errors.none?
|
|
end
|
|
|
|
private
|
|
|
|
def valid?
|
|
unless [@protocol_params, @user, @team].all?
|
|
@errors[:invalid_arguments] = {
|
|
'user': @user,
|
|
'team': @team,
|
|
'@protocol_params': @protocol_params
|
|
}.map { |key, value| "Can't find #{key.capitalize}" if value.nil? }.compact
|
|
return false
|
|
end
|
|
true
|
|
end
|
|
end
|
|
end
|