Class: RealTimeDb
- Inherits:
-
Object
- Object
- RealTimeDb
- Defined in:
- lib/publisher/real_time_db.rb
Constant Summary collapse
- SITE_URL =
ENV["FIREBASE_SITE"]
- SECRET =
ENV["FIREBASE_SECRET"]
- ENDPOINT =
"pathofast"- ACCESSION_DONE =
"ACCESSION_DONE"- PROCESSING =
"PROCESSING"- WORK_TYPES =
{ "IMMUNO" => "", "BIOCHEM" => "", "BIOCHEM-EXL" => "", "BIOCHEM-ELECTROLYTE" => "", "HEMAT" => "", "URINE" => "", "OUTSOURCE" => "" }
Instance Attribute Summary collapse
-
#connection ⇒ Object
Returns the value of attribute connection.
-
#private_key_hash ⇒ Object
Returns the value of attribute private_key_hash.
-
#work_allotment_hash ⇒ Object
Returns the value of attribute work_allotment_hash.
Instance Method Summary collapse
-
#assign_test(barcode, tests, mappings) ⇒ Object
we pass the real_time_data instance into the.
-
#barcode_exists?(barcode) ⇒ Boolean
if the barcode exists, otherwise create it.
- #generate_access_token ⇒ Object
- #get_jwt ⇒ Object
-
#initialize(work_allotment_hash, private_key_hash) ⇒ RealTimeDb
constructor
@param work_allotment_hash : key => one of the work types value => name of a worker.
- #open_event_stream ⇒ Object
Constructor Details
#initialize(work_allotment_hash, private_key_hash) ⇒ RealTimeDb
@param work_allotment_hash : key => one of the work types value => name of a worker
74 75 76 77 78 79 80 81 |
# File 'lib/publisher/real_time_db.rb', line 74 def initialize(work_allotment_hash,private_key_hash) self.private_key_hash = private_key_hash raise "please provide the private key hash, from firebase service account -> create private key " if private_key_hash.blank? self.connection = RestFirebase.new :site => SITE_URL, :secret => SECRET, :auth =>generate_access_token puts "initialized" self.work_allotment_hash = work_allotment_hash || WORK_TYPES end |
Instance Attribute Details
#connection ⇒ Object
Returns the value of attribute connection.
21 22 23 |
# File 'lib/publisher/real_time_db.rb', line 21 def connection @connection end |
#private_key_hash ⇒ Object
Returns the value of attribute private_key_hash.
23 24 25 |
# File 'lib/publisher/real_time_db.rb', line 23 def private_key_hash @private_key_hash end |
#work_allotment_hash ⇒ Object
Returns the value of attribute work_allotment_hash.
22 23 24 |
# File 'lib/publisher/real_time_db.rb', line 22 def work_allotment_hash @work_allotment_hash end |
Instance Method Details
#assign_test(barcode, tests, mappings) ⇒ Object
we pass the real_time_data instance into the
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 |
# File 'lib/publisher/real_time_db.rb', line 121 def assign_test(,tests,mappings) ## so do we get the name of the worker. if ([0]).blank? worker_hash = {} tests.each do |machine_code| worker_name = "NO_ONE" unless mappings[machine_code].blank? test_type = mappings[machine_code]["TYPE"] worker_name = self.work_allotment_hash[test_type] worker_hash[worker_name] ||= [] #puts "worker name: #{worker_name}" #puts "lis code: #{machine_code}" #puts mappings[machine_code].to_s worker_hash[worker_name] << mappings[machine_code]["REPORT_NAME"] else worker_hash[worker_name] ||= [] worker_hash[worker_name] << machine_code end end #puts "this is the workers hash" #puts worker_hash.to_s worker_hash.keys.each do |worker_name| k = self.connection.post(ENDPOINT, :tests => worker_hash[worker_name].uniq, :barcode => [0], :timestamp => Time.now.strftime("%b %-d %Y %I:%M %P"), :worker_name => worker_name, :status => ACCESSION_DONE, :next_step => PROCESSING, :combi_key => worker_name + "_pending") #puts k.to_s end else puts "this barcode: #{barcode[0]} already exists." end end |
#barcode_exists?(barcode) ⇒ Boolean
if the barcode exists, otherwise create it.
102 103 104 105 106 107 108 109 110 111 |
# File 'lib/publisher/real_time_db.rb', line 102 def () begin self.connection.get(ENDPOINT, :orderBy => 'barcode', :equalTo => ) rescue ## reestablish the connection self.connection = RestFirebase.new :site => SITE_URL, :secret => SECRET, :auth =>generate_access_token true end end |
#generate_access_token ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/publisher/real_time_db.rb', line 54 def generate_access_token uri = URI.parse(self.private_key_hash["token_uri"]) https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true req = Net::HTTP::Post.new(uri.path) req['Cache-Control'] = "no-store" req.set_form_data({ grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer", assertion: get_jwt }) resp = JSON.parse(https.request(req).body) puts "response is:" puts resp.to_s resp["access_token"] end |
#get_jwt ⇒ Object
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/publisher/real_time_db.rb', line 36 def get_jwt puts Base64.encode64(JSON.generate(self.private_key_hash)) # Get your service account's email address and private key from the JSON key file $service_account_email = self.private_key_hash["client_email"] $private_key = OpenSSL::PKey::RSA.new self.private_key_hash["private_key"] now_seconds = Time.now.to_i payload = {:iss => $service_account_email, :sub => $service_account_email, :aud => self.private_key_hash["token_uri"], :iat => now_seconds, :exp => now_seconds+(60*60), # Maximum expiration time is one hour :scope => 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/firebase.database' } JWT.encode payload, $private_key, "RS256" end |
#open_event_stream ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/publisher/real_time_db.rb', line 83 def open_event_stream es = self.connection.event_source('users/tom') es.onopen { |sock| p sock } # Called when connected es.{ |event, data, sock| p event, data } # Called for each message es.onerror { |error, sock| p error } # Called whenever there's an error # Extra: If we return true in onreconnect callback, it would automatically # reconnect the node for us if disconnected. @reconnect = true es.onreconnect{ |error, sock| p error; @reconnect } # Start making the request es.start self.connection.wait end |