sanger/sequencescape

View on GitHub
app/models/api/request_io.rb

Summary

Maintainability
A
2 hrs
Test Coverage
A
96%
# frozen_string_literal: true
# Despite name controls rendering of warehouse messages for {Request}
# Historically used to be v0.5 API
class Api::RequestIO < Api::Base
  module Extensions
    module ClassMethods
      def render_class
        Api::RequestIO
      end
    end

    def self.included(base)
      base.class_eval do
        extend ClassMethods

        scope :including_associations_for_json,
              -> {
                includes(
                  [
                    :uuid_object,
                    :request_type,
                    :request_metadata,
                    :user,
                    {
                      asset: [:uuid_object, :barcodes, { primary_aliquot: { sample: :uuid_object } }],
                      target_asset: [:uuid_object, :barcodes, { primary_aliquot: { sample: :uuid_object } }],
                      initial_study: :uuid_object,
                      initial_project: :uuid_object
                    }
                  ]
                )
              }
      end
    end

    def json_root
      'request' # frozen for subclass of the API
    end
  end

  # Maintains the pre-existing identifiers
  class WarehouseAsset
    attr_reader :asset

    def initialize(asset)
      @asset = asset.is_a?(Well) ? asset : asset.try(:labware)
    end

    def two_dimensional_barcode
      @asset.two_dimensional_barcode if @asset.respond_to?(:two_dimensional_barcode)
    end
    delegate_missing_to :asset
  end

  renders_model(::Request)

  map_attribute_to_json_attribute(:uuid)
  map_attribute_to_json_attribute(:id)
  map_attribute_to_json_attribute(:created_at)
  map_attribute_to_json_attribute(:updated_at)
  map_attribute_to_json_attribute(:state)
  map_attribute_to_json_attribute(:priority)

  extra_json_attributes do |object, json_attributes|
    json_attributes['read_length'] = object.request_metadata.read_length if object.is_a?(SequencingRequest)
    json_attributes['library_type'] = object.request_metadata.library_type if object.is_a?(LibraryCreationRequest)
    if object.request_metadata.respond_to?(:fragment_size_required_from)
      json_attributes['fragment_size_required_from'] = object.request_metadata.fragment_size_required_from
    end
    if object.request_metadata.respond_to?(:fragment_size_required_to)
      json_attributes['fragment_size_required_to'] = object.request_metadata.fragment_size_required_to
    end
  end

  with_association(:user) { map_attribute_to_json_attribute(:login, 'user') }

  with_association(:submission) do
    map_attribute_to_json_attribute(:uuid, 'submission_uuid')
    map_attribute_to_json_attribute(:id, 'submission_internal_id')
  end

  with_association(:initial_study) do
    map_attribute_to_json_attribute(:uuid, 'study_uuid')
    map_attribute_to_json_attribute(:id, 'study_internal_id')
    map_attribute_to_json_attribute(:name, 'study_name')
  end

  with_association(:initial_project) do
    map_attribute_to_json_attribute(:uuid, 'project_uuid')
    map_attribute_to_json_attribute(:id, 'project_internal_id')
    map_attribute_to_json_attribute(:name, 'project_name')
  end

  with_association(:asset, decorator: WarehouseAsset) do
    map_attribute_to_json_attribute(:uuid, 'source_asset_uuid')
    map_attribute_to_json_attribute(:id, 'source_asset_internal_id')
    map_attribute_to_json_attribute(:name, 'source_asset_name')
    map_attribute_to_json_attribute(:barcode_number, 'source_asset_barcode')
    map_attribute_to_json_attribute(:qc_state, 'source_asset_state')
    map_attribute_to_json_attribute(:closed, 'source_asset_closed')
    map_attribute_to_json_attribute(:two_dimensional_barcode, 'source_asset_two_dimensional_barcode')

    extra_json_attributes do |object, json_attributes|
      json_attributes['source_asset_type'] = object.sti_type.tableize unless object.nil?
    end

    with_association(:primary_aliquot_if_unique) do
      with_association(:sample) do
        map_attribute_to_json_attribute(:uuid, 'source_asset_sample_uuid')
        map_attribute_to_json_attribute(:id, 'source_asset_sample_internal_id')
      end
    end

    map_attribute_to_json_attribute(:prefix, 'source_asset_barcode_prefix')
  end

  with_association(:target_asset, decorator: WarehouseAsset) do
    map_attribute_to_json_attribute(:uuid, 'target_asset_uuid')
    map_attribute_to_json_attribute(:id, 'target_asset_internal_id')
    map_attribute_to_json_attribute(:name, 'target_asset_name')
    map_attribute_to_json_attribute(:barcode_number, 'target_asset_barcode')
    map_attribute_to_json_attribute(:qc_state, 'target_asset_state')
    map_attribute_to_json_attribute(:closed, 'target_asset_closed')
    map_attribute_to_json_attribute(:two_dimensional_barcode, 'target_asset_two_dimensional_barcode')

    extra_json_attributes do |object, json_attributes|
      json_attributes['target_asset_type'] = object.sti_type.tableize unless object.nil?
    end

    with_association(:primary_aliquot_if_unique) do
      with_association(:sample) do
        map_attribute_to_json_attribute(:uuid, 'target_asset_sample_uuid')
        map_attribute_to_json_attribute(:id, 'target_asset_sample_internal_id')
      end
    end

    map_attribute_to_json_attribute(:prefix, 'target_asset_barcode_prefix')
  end

  with_association(:request_type) { map_attribute_to_json_attribute(:name, 'request_type') }
end