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)["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