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
- START_DATE =
Time.parse('2024-09-03').freeze
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.
15 16 17 |
# File 'app/services/lab/lims/push_worker.rb', line 15 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
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 82 |
# File 'app/services/lab/lims/push_worker.rb', line 49 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: 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
40 41 42 43 44 45 |
# File 'app/services/lab/lims/push_worker.rb', line 40 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
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'app/services/lab/lims/push_worker.rb', line 19 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 StandardError => e logger.error("Failed to push order ##{order.accession_number}: #{e.class} - #{e.message}") rescue StandardError => e logger.error("Failed to push order ##{order.id}: #{order&.accession_number} : #{e.class} - #{e.message}") end break unless wait logger.info('Waiting for orders...') sleep(Lab::Lims::Config.updates_poll_frequency) end end |