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, nickname FROM sims WHERE customer_id=$1
30 SQL
31 promise.then { |result|
32 EMPromise.all(result.map { |row|
33 find(row["iccid"]).then { |sim| sim.with(nickname: row["nickname"]) }
34 })
35 }
36 end
37end