diff --git a/app/controllers/services/lightning_controller.rb b/app/controllers/services/lightning_controller.rb index 573d155..44a4589 100644 --- a/app/controllers/services/lightning_controller.rb +++ b/app/controllers/services/lightning_controller.rb @@ -37,8 +37,8 @@ class Services::LightningController < ApplicationController session[:ln_auth_token] = auth_token @ln_auth_token = auth_token end - rescue - # TODO add exception tracking + rescue => e + Sentry.capture_exception(e) if Setting.sentry_enabled? end def set_current_section @@ -49,9 +49,9 @@ class Services::LightningController < ApplicationController lndhub = Lndhub.new data = lndhub.balance @ln_auth_token @balance = data["BTC"]["AvailableBalance"] rescue nil - rescue + rescue AuthError authenticate_with_lndhub(force_reauth: true) - return nil if @fetch_balance_retried + raise if @fetch_balance_retried @fetch_balance_retried = true fetch_balance end @@ -61,9 +61,9 @@ class Services::LightningController < ApplicationController txs = lndhub.gettxs @ln_auth_token invoices = lndhub.getuserinvoices(@ln_auth_token).select{|i| i["ispaid"]} process_transactions(txs + invoices) - rescue + rescue AuthError authenticate_with_lndhub(force_reauth: true) - return [] if @fetch_transactions_retried + raise if @fetch_transactions_retried @fetch_transactions_retried = true fetch_transactions end diff --git a/app/errors/auth_error.rb b/app/errors/auth_error.rb new file mode 100644 index 0000000..4d55106 --- /dev/null +++ b/app/errors/auth_error.rb @@ -0,0 +1 @@ +class AuthError < StandardError; end diff --git a/app/services/lndhub.rb b/app/services/lndhub.rb index 9febebf..44b7880 100644 --- a/app/services/lndhub.rb +++ b/app/services/lndhub.rb @@ -12,12 +12,7 @@ class Lndhub end res = Faraday.post "#{@base_url}/#{endpoint}", payload.to_json, headers - - if res.status != 200 - Rails.logger.error "[lndhub] API request failed:" - Rails.logger.error res.body - #TODO add some kind of exception tracking/notifications - end + log_error(res) if res.status != 200 JSON.parse(res.body) end @@ -31,7 +26,7 @@ class Lndhub data = JSON.parse(res.body) if data.is_a?(Hash) && data["error"] && data["message"] == "bad auth" - raise "BAD_AUTH" + raise AuthError else data end @@ -68,4 +63,13 @@ class Lndhub invoice["payment_request"] end + + def log_error(res) + Rails.logger.error "[lndhub] API request failed:" + Rails.logger.error res.body + + if Setting.sentry_enabled? + Sentry.capture_message("Lndhub API request failed: #{res.body}") + end + end end diff --git a/app/services/lndhub_v2.rb b/app/services/lndhub_v2.rb index 693f812..e0a84dd 100644 --- a/app/services/lndhub_v2.rb +++ b/app/services/lndhub_v2.rb @@ -1,9 +1,4 @@ -class LndhubV2 - attr_accessor :auth_token - - def initialize - @base_url = ENV["LNDHUB_API_URL"] - end +class LndhubV2 < Lndhub def post(endpoint, payload, options={}) headers = { "Content-Type" => "application/json" } @@ -12,64 +7,12 @@ class LndhubV2 elsif options[:admin_token] headers.merge!({ "Authorization" => "Bearer #{options[:admin_token]}" }) end - res = Faraday.post "#{@base_url}/#{endpoint}", payload.to_json, headers - - if res.status != 200 - Rails.logger.error "[lndhub] API request failed:" - Rails.logger.error res.body - #TODO add some kind of exception tracking/notifications - end + log_error(res) if res.status != 200 JSON.parse(res.body) end - def get(endpoint, auth_token) - res = Faraday.get("#{@base_url}/#{endpoint}", {}, { - "Content-Type" => "application/json", - "Accept" => "application/json", - "Authorization" => "Bearer #{auth_token}" - }) - - JSON.parse(res.body) - end - - def create(payload) - post "create", payload - end - - def authenticate(user) - credentials = post "auth?type=auth", { login: user.ln_account, password: user.ln_password } - self.auth_token = credentials["access_token"] - self.auth_token - end - - def balance(user_token=nil) - get "balance", user_token || auth_token - end - - def gettxs(user_token) - get "gettxs", user_token || auth_token - end - - def getuserinvoices(user_token) - get "getuserinvoices", user_token || auth_token - end - - def addinvoice(payload) - invoice = post "addinvoice", { - amt: payload[:amount], - memo: payload[:memo], - description_hash: payload[:description_hash] - } - - invoice["payment_request"] - end - - # - # V2 - # - def create_account(payload={}) post "v2/users", payload, admin_token: Rails.application.credentials.lndhub[:admin_token] end @@ -78,4 +21,5 @@ class LndhubV2 # Payload: { amount: 1000, description: "", description_hash: "" } post "v2/invoices", payload end + end