1# frozen_string_literal: true
2
3require "json"
4
5require_relative "geo_code_repo"
6
7class AreaCodeRepo
8 def initialize(db: DB, geo_code_repo: GeoCodeRepo.new)
9 @db = db
10 @geo_code_repo = geo_code_repo
11 end
12
13 def find(q, limit: 3)
14 @geo_code_repo.find(q).then { |geo|
15 log.error "AreaCodeRepo#find(#{q.inspect})" unless geo.valid?
16 next [] unless geo.valid?
17
18 @db.query_defer(<<~SQL, [geo.country, geo.sql_point, limit])
19 SELECT area_code FROM area_codes
20 WHERE country=$1
21 ORDER BY location <-> $2
22 LIMIT $3
23 SQL
24 }.then { |rows| rows.map { |row| row["area_code"] } }
25 end
26end