Class: Lab::Lims::Api::RestApi
- Inherits:
-
Object
- Object
- Lab::Lims::Api::RestApi
- Defined in:
- app/services/lab/lims/api/rest_api.rb
Defined Under Namespace
Classes: AuthenticationTokenExpired, InvalidParameters, LimsApiError
Constant Summary collapse
- START_DATE =
Time.parse('2024-09-03').freeze
Instance Method Summary collapse
- #acknowledge(acknowledgement_dto) ⇒ Object
- #consume_orders(*_args, patient_id: nil, start_date: nil, **_kwargs) ⇒ Object
- #create_order(order_dto) ⇒ Object
- #delete_order(_id, order_dto) ⇒ Object
-
#initialize(config) ⇒ RestApi
constructor
A new instance of RestApi.
- #update_order(_id, order_dto) ⇒ Object
- #verify_tracking_number(tracking_number) ⇒ Object
Constructor Details
#initialize(config) ⇒ RestApi
Returns a new instance of RestApi.
15 16 17 |
# File 'app/services/lab/lims/api/rest_api.rb', line 15 def initialize(config) @config = config end |
Instance Method Details
#acknowledge(acknowledgement_dto) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'app/services/lab/lims/api/rest_api.rb', line 40 def acknowledge(acknowledgement_dto) Rails.logger.info("Acknowledging order ##{acknowledgement_dto} in LIMS") test_concept = ::ConceptName.find_by_name(acknowledgement_dto.fetch(:test))&.concept if test_concept.nil? return { 'status' => 400, 'message' => "Test concept not found for '#{acknowledgement_dto.fetch(:test)}'" } end response = in_authenticated_session do |headers| RestClient.post(("tests/#{acknowledgement_dto[:tracking_number]}/acknowledge_test_results_receipt", api_version: 'v2'), { test_type: { name: test_concept.test_catalogue_name, nlims_code: test_concept.nlims_code }, date_acknowledged: acknowledgement_dto[:date_acknowledged], recipient_type: acknowledgement_dto[:recipient_type], acknowledged_by: 'emr_at_facility' }, headers) end Rails.logger.info("Acknowledged order ##{acknowledgement_dto} in LIMS. Response: #{response}") JSON.parse(response) rescue StandardError => e Rails.logger.error("Failed to acknowledge order ##{acknowledgement_dto} in LIMS: #{e.class}") { 'status' => 500, 'message' => e. } end |
#consume_orders(*_args, patient_id: nil, start_date: nil, **_kwargs) ⇒ Object
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
# File 'app/services/lab/lims/api/rest_api.rb', line 77 def consume_orders(*_args, patient_id: nil, start_date: nil, **_kwargs) orders_pending_updates(patient_id, start_date: start_date).each do |order| order_dto = Lab::Lims::OrderSerializer.serialize_order(order) # Always fetch the full order from NLIMS to get status trails begin lims_order = find_lims_order(order.accession_number) patch_order_dto_with_lims_order!(order_dto, lims_order) Rails.logger.debug("NLIMS order structure for #{order.accession_number}:") Rails.logger.debug(" Has 'order' key: #{lims_order.key?('order')}") Rails.logger.debug(" Has 'data' key: #{lims_order.key?('data')}") Rails.logger.debug(" Top level keys: #{lims_order.keys.inspect}") # Also extract status trails from the NLIMS order # Note: NLIMS might return order data under 'order' or 'data.order' order_data = lims_order['order'] || lims_order.dig('data', 'order') || lims_order if order_data && order_data['status_trail'] Rails.logger.info("Found #{order_data['status_trail'].size} order status trail entries from NLIMS") order_dto[:sample_statuses] ||= [] # Convert NLIMS status trail to the format expected by PullWorker # Note: sample_statuses must be an array of single-key hashes order_data['status_trail'].each do |trail| # Convert ISO 8601 timestamp to YYYYMMDDHHmmss format = (trail['timestamp']) order_dto[:sample_statuses] << { => { 'status_id' => trail['status_id'], 'status' => trail['status'], 'updated_by' => trail['updated_by'] } } Rails.logger.debug(" Added order status: #{trail['status']} at #{}") end Rails.logger.debug("Final sample_statuses: #{order_dto[:sample_statuses].inspect}") else Rails.logger.warn("No order status_trail found in NLIMS response for #{order.accession_number}") Rails.logger.debug("Order data keys: #{order_data&.keys&.inspect}") end # Extract test status trails from NLIMS tests tests_data = lims_order['tests'] || lims_order.dig('data', 'tests') || [] if tests_data.is_a?(Array) Rails.logger.debug("Processing #{tests_data.size} tests from NLIMS") order_dto['test_statuses'] ||= {} tests_data.each do |test| next unless test['status_trail'].is_a?(Array) test_name = test.dig('test_type', 'name') next unless test_name Rails.logger.debug(" Found #{test['status_trail'].size} status trail entries for test #{test_name}") order_dto['test_statuses'][test_name] ||= {} test['status_trail'].each do |trail| # Convert ISO 8601 timestamp to YYYYMMDDHHmmss format = (trail['timestamp']) order_dto['test_statuses'][test_name][] = { 'status_id' => trail['status_id'], 'status' => trail['status'], 'updated_by' => trail['updated_by'] } end end end rescue RestClient::NotFound Rails.logger.warn("Order ##{order.accession_number} not found in NLIMS, using local data only") end # Try to fetch results if available if order_dto['test_results'].empty? begin patch_order_dto_with_lims_results!(order_dto, find_lims_results(order.accession_number)) rescue InvalidParameters => e Rails.logger.info("No results available for ##{order.accession_number}: #{e.}") # Don't skip - continue processing to save status trails rescue RestClient::NotFound Rails.logger.info("No results found for ##{order.accession_number}") # Don't skip - continue processing to save status trails end end yield order_dto, OpenStruct.new(last_seq: 0) rescue RestClient::NotFound Rails.logger.error("Order ##{order.accession_number} not found in LIMS") next rescue LimsApiError => e Rails.logger.error("Failed to fetch updates for ##{order.accession_number}: #{e.class} - #{e.}") sleep(1) rescue StandardError => e Rails.logger.error("Failed to fetch updates for ##{order.accession_number}: #{e.class} - #{e.}") next end end |
#create_order(order_dto) ⇒ 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/api/rest_api.rb', line 19 def create_order(order_dto) response = in_authenticated_session do |headers| Rails.logger.info("Pushing order ##{order_dto[:tracking_number]} to LIMS") if order_dto['sample_type'].casecmp?('not_specified') RestClient.post(('orders/requests', api_version: 'v2'), make_create_params(order_dto), headers) else RestClient.post(('orders', api_version: 'v2'), make_create_params(order_dto), headers) end end data = JSON.parse(response.body) update_order_results(order_dto) unless data['message'].casecmp?('Order already available') ActiveSupport::HashWithIndifferentAccess.new( id: order_dto.fetch(:_id, order_dto[:tracking_number]), rev: 0, tracking_number: order_dto[:tracking_number] ) end |
#delete_order(_id, order_dto) ⇒ Object
172 173 174 175 176 177 178 179 180 181 182 |
# File 'app/services/lab/lims/api/rest_api.rb', line 172 def delete_order(_id, order_dto) tracking_number = order_dto.fetch('tracking_number') order_dto['tests_map'].each do |test| Rails.logger.info("Voiding test '#{test.name}' (#{tracking_number}) in LIMS") in_authenticated_session do |headers| date_voided, voided_status = find_test_status(order_dto, test.name, 'Voided') params = make_void_test_params(tracking_number, test, voided_status['updated_by'], date_voided) RestClient.put(("tests/#{tracking_number}", api_version: 'v2'), params.to_json, headers) end end end |
#update_order(_id, order_dto) ⇒ Object
66 67 68 69 70 71 72 73 74 75 |
# File 'app/services/lab/lims/api/rest_api.rb', line 66 def update_order(_id, order_dto) in_authenticated_session do |headers| RestClient.put(("orders/#{order_dto[:tracking_number]}", api_version: 'v2'), make_update_params(order_dto), headers) end update_order_results(order_dto) { tracking_number: order_dto[:tracking_number] } end |
#verify_tracking_number(tracking_number) ⇒ Object
184 185 186 187 188 189 |
# File 'app/services/lab/lims/api/rest_api.rb', line 184 def verify_tracking_number(tracking_number) nlims_order_exists?(tracking_number) rescue InvalidParameters => e Rails.logger.error("Failed to verify tracking number #{tracking_number}: #{e.}") false end |