48 lines
1.5 KiB
Ruby
48 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module API
|
|
module V2
|
|
module OrderHelpers
|
|
|
|
def build_order(attrs)
|
|
(attrs[:side] == 'sell' ? OrderAsk : OrderBid).new \
|
|
state: ::Order::PENDING,
|
|
member: current_user,
|
|
ask: current_market&.base_unit,
|
|
bid: current_market&.quote_unit,
|
|
market: current_market,
|
|
ord_type: attrs[:ord_type] || 'limit',
|
|
price: attrs[:price],
|
|
volume: attrs[:volume],
|
|
origin_volume: attrs[:volume]
|
|
end
|
|
|
|
def create_order(attrs)
|
|
create_order_errors = {
|
|
::Account::AccountError => 'market.account.insufficient_balance',
|
|
::Order::InsufficientMarketLiquidity => 'market.order.insufficient_market_liquidity',
|
|
ActiveRecord::RecordInvalid => 'market.order.invalid_volume_or_price'
|
|
}
|
|
|
|
order = build_order(attrs)
|
|
order.submit_order
|
|
order
|
|
# TODO: Make more specific error message for ActiveRecord::RecordInvalid.
|
|
rescue StandardError => e
|
|
if create_order_errors.include?(e.class)
|
|
report_api_error(e, request)
|
|
else
|
|
report_exception(e)
|
|
end
|
|
|
|
message = create_order_errors.fetch(e.class, 'market.order.create_error')
|
|
error!({ errors: [message] }, 422)
|
|
end
|
|
|
|
def order_param
|
|
params[:order_by].downcase == 'asc' ? 'id asc' : 'id desc'
|
|
end
|
|
end
|
|
end
|
|
end
|