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(contact_user, sample) ⇒ Submission

Returns a new instance of Submission.



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

def initialize(contact_user, sample)
  @sample = sample
  @service = sample&.service
  @contact = contact_user ? Contact.new(contact_user) : nil # only create Contact if user is present
end

Instance Attribute Details

#contactObject (readonly)

Returns the value of attribute contact.



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

def contact
  @contact
end

#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



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

def self.client
  HTTPClients::AccessioningV1Client.new
end

Instance Method Details

#build_xml(xml) ⇒ Object

rubocop:disable Metrics/AbcSize



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/accession/submission.rb', line 27

def build_xml(xml) # rubocop:disable Metrics/AbcSize
  xml.SUBMISSION(
    XML_NAMESPACE,
    center_name: CENTER_NAME,
    broker_name: service.broker,
    alias: sample.ebi_alias_datestamped,
    submission_date: date
  ) do
    xml.CONTACTS { xml.CONTACT(contact.to_h) }

    xml.ACTIONS do
      xml.ACTION { xml.ADD(source: sample.filename, schema: sample.schema_type) }
      xml.ACTION { xml.tag!(service.visibility) }
    end
  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 }



63
64
65
66
67
68
69
# File 'lib/accession/submission.rb', line 63

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

#submit_and_update_accession_number(event_user) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/accession/submission.rb', line 44

def submit_and_update_accession_number(event_user)
  raise StandardError, "Accessionable submission is invalid: #{errors.full_messages.join(', ')}" unless valid?

  client = self.class.client
   = service.
  files = compile_files
  accession_number = client.submit_and_fetch_accession_number(, files)
  sample.update_accession_number(accession_number, event_user)
ensure
  # Ensure all opened files are closed
  files&.each_value(&:close!)
end