Skip to content

Commit

Permalink
Add filter by date in market/trades
Browse files Browse the repository at this point in the history
  • Loading branch information
mnaichuk committed Apr 4, 2019
1 parent 40a9012 commit 7a5ab75
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 12 deletions.
4 changes: 0 additions & 4 deletions app/api/v2/helpers.rb
Expand Up @@ -48,10 +48,6 @@ def current_market
end
memoize :current_market

def time_to
params[:timestamp].present? ? Time.at(params[:timestamp]) : nil
end

def format_ticker(ticker)
permitted_keys = %i[buy sell low high open last volume
avg_price price_change_percent]
Expand Down
13 changes: 9 additions & 4 deletions app/api/v2/market/named_params.rb
Expand Up @@ -54,11 +54,16 @@ module NamedParams
allow_blank: false,
default: 1,
desc: 'Specify the page of paginated results.'
optional :timestamp,
type: { value: Integer, message: 'market.trade.non_integer_timestamp' },
allow_blank: false,
optional :time_from,
type: { value: Integer, message: 'market.trade.non_integer_time_from' },
allow_blank: { value: false, message: 'market.trade.empty_time_from' },
desc: "An integer represents the seconds elapsed since Unix epoch."\
"If set, only trades executed after the time will be returned."
optional :time_to,
type: { value: Integer, message: 'market.trade.non_integer_time_to' },
allow_blank: { value: false, message: 'market.trade.empty_time_to' },
desc: "An integer represents the seconds elapsed since Unix epoch."\
"If set, only trades executed before the time will be returned."
"If set, only trades executed before the time will be returned."
optional :order_by,
type: String,
values: { value: %w(asc desc), message: 'market.trade.invalid_order_by' },
Expand Down
2 changes: 2 additions & 0 deletions app/api/v2/market/trades.rb
Expand Up @@ -22,6 +22,8 @@ class Trades < Grape::API
.trades
.order(order_param)
.tap { |q| q.where!(market: params[:market]) if params[:market] }
.tap { |q| q.where!('created_at >= ?', Time.at(params[:time_from])) if params[:time_from] }
.tap { |q| q.where!('created_at < ?', Time.at(params[:time_to])) if params[:time_to] }
.tap { |q| present paginate(q), with: API::V2::Entities::Trade, current_user: current_user }
end
end
Expand Down
6 changes: 4 additions & 2 deletions docs/api/errors.md
Expand Up @@ -75,8 +75,10 @@
| `market.trade.non_integer_limit` | Parameter **limit** should be integer |
| `market.trade.invalid_limit` | Parameter **limit** is not valid |
| `market.trade.empty_page` | Parameter **page** is empty |
| `market.trade.non_integer_timestamp` | Parameter **timestamp** should be integer |
| `market.trade.empty_timestamp` | Parameter **timestamp** is empty |
| `market.trade.non_integer_time_from` | Parameter **time_from** should be integer |
| `market.trade.empty_time_from` | Parameter **time_from** is empty |
| `market.trade.non_integer_time_to` | Parameter **time_to** should be integer |
| `market.trade.empty_time_to_` | Parameter **time_to** is empty |
| `market.trade.invalid_order_by` | Parameter **order_by** is not valid |
| `market.trade.not_permitted` | Pass the corresponding verification steps to **enable trading** |

Expand Down
33 changes: 31 additions & 2 deletions spec/api/v2/market/trades_spec.rb
Expand Up @@ -56,8 +56,8 @@

let!(:btcusd_ask_trade) { create(:trade, :btcusd, ask: btcusd_ask, created_at: 2.days.ago) }
let!(:dashbtc_ask_trade) { create(:trade, :dashbtc, ask: dashbtc_ask, created_at: 2.days.ago) }
let!(:btcusd_bid_trade) { create(:trade, :btcusd, bid: btcusd_bid, created_at: 1.day.ago) }
let!(:dashbtc_bid_trade) { create(:trade, :dashbtc, bid: dashbtc_bid, created_at: 1.day.ago) }
let!(:btcusd_bid_trade) { create(:trade, :btcusd, bid: btcusd_bid, created_at: 23.hours.ago) }
let!(:dashbtc_bid_trade) { create(:trade, :dashbtc, bid: dashbtc_bid, created_at: 23.hours.ago) }

describe 'GET /api/v2/market/trades' do
it 'requires authentication' do
Expand Down Expand Up @@ -106,6 +106,35 @@
expect(response.headers.fetch('Total')).to eq '2'
end

it 'returns trades for last 24h' do
create(:trade, :btcusd, ask_member: member, created_at: 6.hours.ago)
api_get '/api/v2/market/trades', params: { time_from: 1.day.ago.to_i }, token: token
result = JSON.parse(response.body)

expect(response).to be_success
expect(result.size).to eq 3
expect(response.headers.fetch('Total')).to eq '3'
end

it 'returns trades older than 1 day' do
api_get '/api/v2/market/trades', params: { time_to: 1.day.ago.to_i }, token: token
result = JSON.parse(response.body)

expect(response).to be_success
expect(result.size).to eq 2
expect(response.headers.fetch('Total')).to eq '2'
end

it 'returns trades for specific hour' do
create(:trade, :btcusd, ask_member: member, created_at: 6.hours.ago)
api_get '/api/v2/market/trades', params: { time_from: 7.hours.ago.to_i, time_to: 5.hours.ago.to_i }, token: token
result = JSON.parse(response.body)

expect(response).to be_success
expect(result.size).to eq 1
expect(response.headers.fetch('Total')).to eq '1'
end

it 'returns limit out of range error' do
api_get '/api/v2/market/trades', params: { market: 'btcusd', limit: 1024 }, token: token

Expand Down

0 comments on commit 7a5ab75

Please sign in to comment.