Files
Dena/app/api/v2/helpers.rb
2026-08-13 19:50:53 +03:30

122 lines
3.9 KiB
Ruby

# frozen_string_literal: true
module API
module V2
module Helpers
extend Memoist
def admin_authorize!(action, model, attributes = {})
if attributes.present?
attributes.each do |k, _|
AdminAbility.new(current_user).authorize!(action, model, k)
end
else
AdminAbility.new(current_user).authorize!(action, model)
end
rescue StandardError
error!({ errors: ['admin.ability.not_permitted'] }, 403)
end
def user_authorize!(action, model, attributes = {})
if attributes.present?
attributes.each do |k, _|
UserAbility.new(current_user).authorize!(action, model, k)
end
else
UserAbility.new(current_user).authorize!(action, model)
end
rescue StandardError
error!({ errors: ['user.ability.not_permitted'] }, 403)
end
def authenticate!
current_user || raise(Peatio::Auth::Error)
end
def set_ets_context!
return unless defined?(Raven)
if current_user
Raven.user_context(
email: current_user.email,
uid: current_user.uid,
role: current_user.role
)
end
Raven.tags_context(
peatio_version: Peatio::Application::VERSION
)
end
def deposits_must_be_permitted!
if current_user.level < ENV.fetch('MINIMUM_MEMBER_LEVEL_FOR_DEPOSIT').to_i
error!({ errors: ['account.deposit.not_permitted'] }, 403)
end
end
def withdraws_must_be_permitted!
if current_user.level < ENV.fetch('MINIMUM_MEMBER_LEVEL_FOR_WITHDRAW').to_i
error!({ errors: ['account.withdraw.not_permitted'] }, 403)
end
end
def trading_must_be_permitted!
if current_user.level < ENV.fetch('MINIMUM_MEMBER_LEVEL_FOR_TRADING').to_i
error!({ errors: ['market.trade.not_permitted'] }, 403)
end
end
def withdraw_api_must_be_enabled!
error!({ errors: ['account.withdraw.disabled_api'] }, 422) if ENV.false?('ENABLE_ACCOUNT_WITHDRAWAL_API')
end
def current_user
# jwt.payload provided by rack-jwt
if request.env.key?('jwt.payload')
begin
Member.from_payload(request.env['jwt.payload'].symbolize_keys)
# Handle race conditions when creating member record.
# We do not handle race condition for update operations.
# http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-find_or_create_by
rescue ActiveRecord::RecordNotUnique
retry
end
end
end
memoize :current_user
def current_market
::Market.active.find_by_id(params[:market])
end
memoize :current_market
def format_ticker(ticker)
permitted_keys = %i[low high open last volume amount
avg_price price_change_percent]
# Add vol for compatibility with old API.
formatted_ticker = ticker.slice(*permitted_keys)
.merge(vol: ticker[:volume])
{ at: ticker[:at],
ticker: formatted_ticker }
end
def paginate(collection, include_total = true)
per_page = params[:limit] || Kaminari.config.default_per_page
per_page = [per_page.to_i, Kaminari.config.max_per_page].compact.min
result = if collection.is_a?(::ActiveRecord::Relation)
collection.page(params[:page].to_i).per(per_page)
elsif collection.is_a?(Array)
Kaminari.paginate_array(collection).page(params[:page].to_i).per(per_page)
end
result.tap do |data|
header 'Total', data.total_count.to_s if include_total
header 'Per-Page', data.limit_value.to_s
header 'Page', data.current_page.to_s
end
end
end
end
end