Class: Accession::Submission

Inherits:
Object
  • Object
show all
Includes:
Accessionable, ActiveModel::Model
Defined in:
lib/accession/submission.rb

Overview

Made up of a sample, user and service Used by Request to extract relevant information to send to appropriate accessioning service

Instance Attribute Summary collapse

Attributes included from Accessionable

#ebi_alias

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Accessionable

#date, #ebi_alias_datestamped, #filename, #schema_type, #to_file, #to_xml

Constructor Details

#initialize(sample) ⇒ Submission

Returns a new instance of Submission.



16
17
18
19
# File 'lib/accession/submission.rb', line 16

def initialize(sample)
  @sample = sample
  @service = sample&.service
end

Instance Attribute Details

#sampleObject (readonly)

Returns the value of attribute sample.



9
10
11
# File 'lib/accession/submission.rb', line 9

def sample
  @sample
end

#serviceObject (readonly)

Returns the value of attribute service.



9
10
11
# File 'lib/accession/submission.rb', line 9

def service
  @service
end

Class Method Details

.clientObject

Define the client as a class method for easy test mocking



22
23
24
# File 'lib/accession/submission.rb', line 22

def self.client
  HTTPClients::AccessioningV1Client.new
end

Instance Method Details

#build_xml(xml) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/accession/submission.rb', line 26

def build_xml(xml)
  xml.SUBMISSION(
    XML_NAMESPACE,
    center_name: CENTER_NAME,
    broker_name: service.broker,
    alias: sample.ebi_alias_datestamped,
    submission_date: date
  ) do
    actions(xml)
  end
end

#compile_filesObject

Returns a hash mapping file type names to File objects. Files should be closed or unlinked after use. { 'SUBMISSION' => open_temp_submission_file, 'SAMPLE' => open_temp_sample_file }



71
72
73
74
75
76
77
# File 'lib/accession/submission.rb', line 71

def compile_files
  {}.tap do |f|
    [self, sample].each do |accessionable|
      f[accessionable.schema_type.upcase] = accessionable.to_file
    end
  end
end

#submit_accession(event_user) ⇒ Object

rubocop:disable Metrics/MethodLength,Metrics/AbcSize



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/accession/submission.rb', line 38

def submit_accession(event_user) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
  # Rubocop metrics disabled as refactoring this method would reduce clarity
  unless valid?
    raise Accession::InternalValidationError,
          "Accessionable submission is invalid: #{errors.full_messages.join(', ')}"
  end

  client = self.class.client
   = service.
  files = compile_files

  if accessioned?
    client.submit_and_fetch_accession_number(, files)
    sample.sample.events.updated_accessioned_metadata!('sample', event_user)
    Rails.logger.info("Sample '#{sample.sample.name}' " \
                      "with alias '#{sample.ebi_alias}' " \
                      "and accession number '#{sample.ebi_accession_number}' " \
                      "has had it's accession metadata successfully updated.")
  else
    accession_number = client.submit_and_fetch_accession_number(, files)
    sample.update_accession_number(accession_number, event_user)
  end
ensure
  # Ensure all opened files are closed
  files&.each_value(&:close!)
end