# encoding: UTF-8 # frozen_string_literal: true module API module V2 module Admin class Deposits < Grape::API helpers ::API::V2::Admin::Helpers desc 'Get all deposits, result is paginated.', is_array: true, success: API::V2::Admin::Entities::Deposit params do optional :state, values: { value: -> { ::Deposit.aasm.states.map(&:name).map(&:to_s) }, message: 'admin.deposit.invalid_state' }, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:state][:desc] } optional :id, type: Integer, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:id][:desc] } optional :txid, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:txid][:desc] } optional :address, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:address][:desc] } optional :tid, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:tid][:desc] } optional :email, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:email][:desc] } use :uid use :currency use :currency_type use :date_picker use :pagination use :ordering end get '/deposits' do admin_authorize! :read, Deposit ransack_params = Helpers::RansackBuilder.new(params) .eq(:id, :txid, :tid, :address) .translate(state: :aasm_state, uid: :member_uid, currency: :currency_id, email: :member_email) .with_daterange .merge(type_eq: params[:type].present? ? "Deposits::#{params[:type].capitalize}" : nil) .build search = Deposit.ransack(ransack_params) search.sorts = "#{params[:order_by]} #{params[:ordering]}" present paginate(search.result), with: API::V2::Admin::Entities::Deposit end desc 'Take an action on the deposit.', success: API::V2::Admin::Entities::Deposit params do requires :id, type: Integer, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:id][:desc] } requires :action, type: String, values: { value: -> { ::Deposit.aasm.events.map(&:name).map(&:to_s) }, message: 'admin.deposit.invalid_action' }, desc: "Valid actions are #{::Deposit.aasm.events.map(&:name)}." given action: ->(val) { val == 'process' } do optional :fees, type: Boolean, default: false, desc: 'Process deposit collection with collecting fees or not' end end post '/deposits/actions' do admin_authorize! :update, Deposit deposit = Deposit.find(params[:id]) if deposit.public_send("may_#{params[:action]}?") deposit.public_send("#{params[:action]}!") present deposit, with: API::V2::Admin::Entities::Deposit else body errors: ["admin.depodit.cannot_#{params[:action]}"] status 422 end end desc 'Creates new fiat deposit .', success: API::V2::Admin::Entities::Deposit params do requires :uid, values: { value: -> (v) { Member.exists?(uid: v) }, message: 'admin.deposit.user_doesnt_exist' }, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:uid][:desc] } requires :currency, values: { value: -> { Currency.fiats.codes(bothcase: true) }, message: 'admin.deposit.currency_doesnt_exist' }, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:currency][:desc] } requires :amount, type: { value: BigDecimal, message: 'admin.deposit.non_decimal_amount' }, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:amount][:desc] } optional :tid, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:tid][:desc] } end post '/deposits/new' do admin_authorize! :create, ::Deposits::Fiat declared_params = declared(params, include_missing: false) member = Member.find_by(uid: declared_params[:uid]) currency = Currency.find(declared_params[:currency]) data = { member: member, currency: currency }.merge!(declared_params.slice(:amount, :tid)) deposit = ::Deposits::Fiat.new(data) if deposit.save present deposit, with: API::V2::Admin::Entities::Deposit status 201 else body errors: deposit.errors.full_messages status 422 end end desc 'Creates new crypto refund', success: API::V2::Admin::Entities::Refund params do requires :id, type: { value: Integer, message: 'admin.deposit.non_integer_type' }, desc: -> { 'Deposit id' } requires :address, desc: -> { API::V2::Admin::Entities::Refund.documentation[:address][:desc] } end post '/deposits/:id/refund' do admin_authorize! :wrrie, Deposit deposit = Deposit.find(params[:id]) refund = ::Refund.new(deposit: deposit, address: params[:address]) if refund.save present refund, with: API::V2::Admin::Entities::Refund else body errors: refund.errors.full_messages status 422 end end desc 'Returns deposit address for account you want to deposit to by currency and uid.', success: API::V2::Admin::Entities::Deposit params do requires :uid, values: { value: -> (v) { Member.exists?(uid: v) }, message: 'admin.deposit.user_doesnt_exist' }, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:uid][:desc] } requires :currency, values: { value: -> { Currency.codes }, message: 'admin.deposit.currency_doesnt_exist' }, as: :currency_id, desc: -> { API::V2::Admin::Entities::Deposit.documentation[:currency][:desc] } given :currency_id do optional :address_format, type: String, values: { value: -> { %w[legacy cash] }, message: 'admin.deposit.invalid_address_format' }, validate_currency_address_format: { value: true, prefix: 'admin.deposit' }, desc: 'Address format legacy/cash' end end post '/deposit_address' do admin_authorize! :create, PaymentAddress member = Member.find_by!(uid: params[:uid]) currency = Currency.find_by!(id: params[:currency_id]) wallet = Wallet.deposit_wallet(currency.id) unless wallet.present? error!({ errors: ['admin.deposit.wallet_not_found'] }, 422) end if currency.deposit_enabled payment_address = member.payment_address(wallet.id) present payment_address, with: API::V2::Entities::PaymentAddress, address_format: params[:address_format] status 201 else body errors: ["admin.deposit.deposit_disabled"] status 422 end end end end end end