71 lines
2.8 KiB
Ruby
71 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module API
|
|
module V2
|
|
module Management
|
|
class PaymentAddress < Grape::API
|
|
desc 'Create payment address' do
|
|
@settings[:scope] = :write_payment_addresses
|
|
success API::V2::Management::Entities::PaymentAddress
|
|
end
|
|
|
|
params do
|
|
requires :uid,
|
|
type: String,
|
|
values: { value: ->(v) { Member.exists?(uid: v) }, message: 'management.payment_address.uid_doesnt_exist' },
|
|
desc: API::V2::Management::Entities::PaymentAddress.documentation[:uid][:desc]
|
|
requires :currency,
|
|
type: String,
|
|
values: { value: -> { Currency.codes(bothcase: true) }, message: 'management.payment_address.currency_doesnt_exist' },
|
|
desc: -> { API::V2::Management::Entities::Currency.documentation[:code][:desc] }
|
|
optional :remote,
|
|
type: { value: Boolean, message: 'management.payment_address.non_boolean_remote' },
|
|
desc: API::V2::Management::Entities::PaymentAddress.documentation[:remote][:desc]
|
|
end
|
|
|
|
post '/deposit_address/new' do
|
|
member = Member.find_by(uid: params[:uid]) if params[:uid].present?
|
|
|
|
currency = Currency.find(params[:currency])
|
|
unless currency.deposit_enabled?
|
|
error!({ errors: ['account.currency.deposit_disabled'] }, 422)
|
|
end
|
|
|
|
wallet = Wallet.deposit_wallet(currency.id)
|
|
unless wallet.present?
|
|
error!({ errors: ['account.wallet.not_found'] }, 422)
|
|
end
|
|
|
|
unless params[:remote].nil?
|
|
pa = member.payment_address!(wallet.id, params[:remote])
|
|
else
|
|
pa = member.payment_address!(wallet.id)
|
|
end
|
|
|
|
wallet_service = WalletService.new(wallet)
|
|
|
|
begin
|
|
pa.with_lock do
|
|
next if pa.address.present?
|
|
|
|
# Supply address ID in case of BitGo address generation if it exists.
|
|
result = wallet_service.create_address!(member.uid, pa.details.merge(updated_at: pa.updated_at))
|
|
if result.present?
|
|
pa.update!(address: result[:address],
|
|
secret: result[:secret],
|
|
details: result.fetch(:details, {}).merge(pa.details))
|
|
end
|
|
end
|
|
|
|
present pa, with: API::V2::Management::Entities::PaymentAddress
|
|
status 200
|
|
rescue StandardError => e
|
|
::Rails.logger.error { "Error: #{e} while generating payment address for #{params[:currency]} for user: #{params[:uid]}" }
|
|
error!({ errors: ['management.payment_address.failed_to_generate'] }, 422)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|