Class: Lab::Lims::PushWorker
- Inherits:
-
Object
- Object
- Lab::Lims::PushWorker
- Includes:
- Utils
- Defined in:
- app/services/lab/lims/push_worker.rb
Overview
Pushes all local orders to a LIMS Api object.
Constant Summary collapse
- SECONDS_TO_WAIT_FOR_ORDERS =
30
Constants included from Utils
Utils::LIMS_LOG_PATH, Utils::TEST_NAME_MAPPINGS
Instance Attribute Summary collapse
-
#lims_api ⇒ Object
readonly
Returns the value of attribute lims_api.
Instance Method Summary collapse
-
#initialize(lims_api) ⇒ PushWorker
constructor
A new instance of PushWorker.
-
#push_order(order) ⇒ Object
Pushes given order to LIMS queue.
- #push_order_by_id(order_id) ⇒ Object
- #push_orders(batch_size: 1000, wait: false) ⇒ Object
Methods included from Utils
find_concept_by_name, lab_user, #logger, parse_date, structify, translate_test_name
Constructor Details
#initialize(lims_api) ⇒ PushWorker
Returns a new instance of PushWorker.
14 15 16 |
# File 'app/services/lab/lims/push_worker.rb', line 14 def initialize(lims_api) @lims_api = lims_api end |
Instance Attribute Details
#lims_api ⇒ Object (readonly)
Returns the value of attribute lims_api.
8 9 10 |
# File 'app/services/lab/lims/push_worker.rb', line 8 def lims_api @lims_api end |
Instance Method Details
#push_order(order) ⇒ Object
Pushes given order to LIMS queue
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'app/services/lab/lims/push_worker.rb', line 48 def push_order(order) logger.info("Pushing order ##{order.order_id}") order_dto = Lab::Lims::OrderSerializer.serialize_order(order) mapping = Lab::LimsOrderMapping.find_by(order_id: order.order_id) ActiveRecord::Base.transaction do if mapping && !order.voided.zero? Rails.logger.info("Deleting order ##{order_dto[:accession_number]} from LIMS") lims_api.delete_order(mapping.lims_id, order_dto) mapping.destroy elsif mapping Rails.logger.info("Updating order ##{order_dto[:accession_number]} in LIMS") lims_api.update_order(mapping.lims_id, order_dto) if order_dto['test_results'].nil? || order_dto['test_results'].empty? mapping.update(pushed_at: Time.now) else mapping.update(pushed_at: Time.now, result_push_status: true) end elsif order_dto[:_id] && Lab::LimsOrderMapping.where(lims_id: order_dto[:_id]).exists? # HACK: v1.1.7 had a bug where duplicates of recently created orders where being created by # the pull worker. This here detects those duplicates and voids them. Rails.logger.warn("Duplicate accession number found: #{order_dto[:_id]}, skipping order...") fix_duplicates!(order) else Rails.logger.info("Creating order ##{order_dto[:accession_number]} in LIMS") update = lims_api.create_order(order_dto) Lab::LimsOrderMapping.create!(order:, lims_id: update['id'], revision: update['rev'], pushed_at: Time.now, result_push_status: false) end end order_dto end |
#push_order_by_id(order_id) ⇒ Object
39 40 41 42 43 44 |
# File 'app/services/lab/lims/push_worker.rb', line 39 def push_order_by_id(order_id) order = Lab::LabOrder.joins(order_type: { name: 'Lab' }) .unscoped .find(order_id) push_order(order) end |
#push_orders(batch_size: 1000, wait: false) ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'app/services/lab/lims/push_worker.rb', line 18 def push_orders(batch_size: 1000, wait: false) loop do logger.info('Looking for new orders to push to LIMS...') orders = orders_pending_sync(batch_size).all logger.debug("Found #{orders.size} orders...") orders.each do |order| push_order(order) rescue GatewayError => e logger.error("Failed to push order ##{order.accession_number}: #{e.class} - #{e.}") rescue StandardError => e logger.error("Failed to push order ##{order.id}: #{order&.accession_number} : #{e.class} - #{e.}") end break unless wait logger.info('Waiting for orders...') sleep(Lab::Lims::Config.updates_poll_frequency) end end |