sim_repo.rb

 1# frozen_string_literal: true
 2
 3require "lazy_object"
 4require "value_semantics/monkey_patched"
 5
 6require_relative "sim"
 7
 8class SIMRepo
 9	value_semantics do
10		db Anything(), default: LazyObject.new { DB }
11	end
12
13	def find(iccid)
14		EM::HttpRequest.new(
15			"https://myaccount.keepgo.com/api/v2/line/#{iccid}/get_details",
16			tls: { verify_peer: true }
17		).aget(
18			head: {
19				"Accept" => "application/json",
20				"apiKey" => CONFIG[:keepgo][:api_key],
21				"accessToken" => CONFIG[:keepgo][:access_token]
22			}
23		).then { |req| SIM.extract(JSON.parse(req.response)&.dig("sim_card")) }
24	end
25
26	def owned_by(customer)
27		customer = customer.customer_id if customer.respond_to?(:customer_id)
28		promise = db.query_defer(<<~SQL, [customer])
29			SELECT iccid FROM sims WHERE customer_id=$1
30		SQL
31		promise.then { |result|
32			EMPromise.all(result.map { |row| find(row["iccid"]) })
33		}
34	end
35end