# frozen_string_literal: true
require "roda"
require "thin"
require "sentry-ruby"
require_relative "lib/cdr"
require_relative "lib/roda_em_promise"
require_relative "lib/rack_fiber"
class Web < Roda
use Rack::Fiber # Must go first!
use Sentry::Rack::CaptureExceptions
plugin :json_parser
plugin :render, engine: "slim"
plugin RodaEMPromise # Must go last!
class << self
attr_reader :customer_repo, :log
end
def customer_repo
Web.customer_repo
end
def log
Web.log
end
def params
request.params
end
def self.run(log, customer_repo)
plugin :common_logger, log, method: :info
@log = log
@customer_repo = customer_repo
Thin::Logging.logger = log
Thin::Server.start(
"::1",
ENV.fetch("PORT", 8080),
freeze.app,
signals: false
)
end
route do |r|
r.on "outbound" do
r.on "calls" do
r.post "status" do
loggable = params.dup.tap { |p| p.delete("to") }
log.info "#{params['eventType']} #{params['callId']}", loggable
if params["eventType"] == "disconnect"
CDR.for_disconnect(params).save.catch do |e|
log.error("Error raised during /outbound/calls/status", e, loggable)
Sentry.capture_exception(e)
end
end
"OK"
end
r.post do
customer_id = params["from"].sub(/^\+/, "")
customer_repo.find(customer_id).then(:registered?).then do |reg|
render :forward, locals: {
from: reg.phone,
to: params["to"]
}
end
end
end
end
end
end