From caea2d01213892c086f2a5e86ca7f71164145b0a Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Mon, 23 May 2022 22:47:08 +0200 Subject: [PATCH] Add kredits API with wallet balance endpoint --- .env.test | 1 + app/controllers/api/base_controller.rb | 5 +++ app/controllers/api/kredits_controller.rb | 12 +++++++ app/services/btc_pay.rb | 8 ++--- config/credentials/test.yml.enc | 2 +- config/routes.rb | 4 +++ spec/requests/api/kredits_spec.rb | 43 +++++++++++++++++++++++ 7 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 app/controllers/api/base_controller.rb create mode 100644 app/controllers/api/kredits_controller.rb create mode 100644 spec/requests/api/kredits_spec.rb diff --git a/.env.test b/.env.test index 4d17742..64e2fd5 100644 --- a/.env.test +++ b/.env.test @@ -1,3 +1,4 @@ EJABBERD_API_URL='http://xmpp.example.com/api' +BTCPAY_API_URL='http://btcpay.example.com' LNDHUB_API_URL='http://localhost:3023' LNDHUB_PUBLIC_URL='https://lndhub.kosmos.org' diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb new file mode 100644 index 0000000..d788c58 --- /dev/null +++ b/app/controllers/api/base_controller.rb @@ -0,0 +1,5 @@ +class Api::BaseController < ApplicationController + + layout false + +end diff --git a/app/controllers/api/kredits_controller.rb b/app/controllers/api/kredits_controller.rb new file mode 100644 index 0000000..3b8768f --- /dev/null +++ b/app/controllers/api/kredits_controller.rb @@ -0,0 +1,12 @@ +class Api::KreditsController < Api::BaseController + + def onchain_btc_balance + btcpay = BtcPay.new + balance = btcpay.onchain_wallet_balance + render json: balance + rescue + render json: { error: 'Failed to fetch wallet balance' }, + status: 500 + end + +end diff --git a/app/services/btc_pay.rb b/app/services/btc_pay.rb index 05c8d82..5abcb4d 100644 --- a/app/services/btc_pay.rb +++ b/app/services/btc_pay.rb @@ -9,12 +9,12 @@ class BtcPay end def onchain_wallet_balance - wallet_info = get "stores/#{@store_id}/payment-methods/onchain/BTC/wallet" + res = get "stores/#{@store_id}/payment-methods/onchain/BTC/wallet" { - balance: wallet_info["balance"].to_f, - unconfirmed_balance: wallet_info["unconfirmedBalance"].to_f, - confirmed_balance: wallet_info["confirmedBalance"].to_f + balance: res["balance"].to_f, + unconfirmed_balance: res["unconfirmedBalance"].to_f, + confirmed_balance: res["confirmedBalance"].to_f } end diff --git a/config/credentials/test.yml.enc b/config/credentials/test.yml.enc index 416ee0e..5a1530a 100644 --- a/config/credentials/test.yml.enc +++ b/config/credentials/test.yml.enc @@ -1 +1 @@ -xgPOFd8315z7lFtTR5/nD6WDBM2M6Grt/pmkCPdaqlw0WAmFKzbiRGFsXoUQ02JNzvT1/FVtBSsAcyK1Pdr1QQztlWC+/ywaflloMBS4//D8IEXvEgCK6uff5gcf1A==--WbFrw9advCJ4mqsK--HTVHZqO0ddG1toFpY0KKgQ== \ No newline at end of file +IIjYiPSeZeMFhH8i8v8akXN4JrtGU+OsMQ8GAao/gVdesggriCBAQ8z+Vd0cmTf1SKYeT3OQDgygEekupr325P4eD9fZ+yi56EA/UMXQXMDVZAvZw7iwvKaOXpqisbWdJnomr1GXrHyR415Ce/Fxft3fgXDwMHJW2u+dDJgpE09uORnB9GXycFwHQmoIdXo=--iQ/Vcm0VcwHgUkwQ--tKHQW/45gM/s/NplqGPaxw== \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 8ecb38b..b0cf70e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -25,6 +25,10 @@ Rails.application.routes.draw do get 'lnurlpay/:address', to: 'lnurlpay#index', constraints: { address: /[^\/]+/} get 'lnurlpay/:address/invoice', to: 'lnurlpay#invoice', constraints: { address: /[^\/]+/} + namespace :api do + get 'kredits/onchain_btc_balance', to: 'kredits#onchain_btc_balance' + end + namespace :admin do root to: 'dashboard#index' get 'invitations', to: 'invitations#index' diff --git a/spec/requests/api/kredits_spec.rb b/spec/requests/api/kredits_spec.rb new file mode 100644 index 0000000..0e1e464 --- /dev/null +++ b/spec/requests/api/kredits_spec.rb @@ -0,0 +1,43 @@ +require 'rails_helper' +require 'webmock/rspec' + +RSpec.describe "/api/kredits", type: :request do + + describe "GET /onchain_btc_balance" do + before do + stub_request(:get, "http://btcpay.example.com/api/v1/stores/123456/payment-methods/onchain/BTC/wallet") + .to_return(status: 200, headers: {}, body: { + balance: 0.91108606, + unconfirmedBalance: 0, + confirmedBalance: 0.91108606 + }.to_json) + end + + it "returns a formatted result for the onchain wallet balance" do + get api_kredits_onchain_btc_balance_path + + expect(response).to have_http_status(:ok) + + res = JSON.parse(response.body) + expect(res["balance"]).to eq(0.91108606) + expect(res["unconfirmed_balance"]).to eq(0) + expect(res["confirmed_balance"]).to eq(0.91108606) + end + + context "upstream request error" do + before do + stub_request(:get, "http://btcpay.example.com/api/v1/stores/123456/payment-methods/onchain/BTC/wallet") + .to_return(status: 500, headers: {}, body: "") + end + + it "returns a formatted error" do + get api_kredits_onchain_btc_balance_path + + expect(response).to have_http_status(:server_error) + + res = JSON.parse(response.body) + expect(res["error"]).not_to be_nil + end + end + end +end