forked from openware/peatio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
helpers.rb
98 lines (85 loc) 路 2.73 KB
/
helpers.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# encoding: UTF-8
# frozen_string_literal: true
module APIv2
module Helpers
extend Memoist
def authenticate!
current_user or raise AuthorizationError
end
def deposits_must_be_permitted!
if current_user.level < ENV.fetch('MINIMUM_MEMBER_LEVEL_FOR_DEPOSIT').to_i
raise Error.new(text: 'Please, pass the corresponding verification steps to deposit funds.', status: 401)
end
end
def withdraws_must_be_permitted!
if current_user.level < ENV.fetch('MINIMUM_MEMBER_LEVEL_FOR_WITHDRAW').to_i
raise Error.new(text: 'Please, pass the corresponding verification steps to withdraw funds.', status: 401)
end
end
def trading_must_be_permitted!
if current_user.level < ENV.fetch('MINIMUM_MEMBER_LEVEL_FOR_TRADING').to_i
raise Error.new(text: 'Please, pass the corresponding verification steps to enable trading.', status: 401)
end
end
def current_user
# JWT authentication provides member email.
if env.key?('api_v2.authentic_member_email')
Member.find_by_email(env['api_v2.authentic_member_email'])
end
end
memoize :current_user
def current_market
Market.enabled.find_by_id(params[:market])
end
memoize :current_market
def time_to
params[:timestamp].present? ? Time.at(params[:timestamp]) : nil
end
def build_order(attrs)
(attrs[:side] == 'sell' ? OrderAsk : OrderBid).new \
state: ::Order::WAIT,
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)
order = build_order(attrs)
Ordering.new(order).submit
order
rescue Account::AccountError => e
report_exception_to_screen(e)
raise CreateOrderAccountError, e.inspect
rescue => e
report_exception_to_screen(e)
raise CreateOrderError, e.inspect
end
def create_orders(multi_attrs)
orders = multi_attrs.map(&method(:build_order))
Ordering.new(orders).submit
orders
rescue => e
report_exception_to_screen(e)
raise CreateOrderError, e.inspect
end
def order_param
params[:order_by].downcase == 'asc' ? 'id asc' : 'id desc'
end
def format_ticker(ticker)
{ at: ticker[:at],
ticker: {
buy: ticker[:buy],
sell: ticker[:sell],
low: ticker[:low],
high: ticker[:high],
last: ticker[:last],
vol: ticker[:volume]
}
}
end
end
end