61 lines
2.1 KiB
Ruby
61 lines
2.1 KiB
Ruby
# encoding: UTF-8
|
|
# frozen_string_literal: true
|
|
|
|
module API
|
|
module V2
|
|
module Public
|
|
class Currencies < Grape::API
|
|
|
|
helpers ::API::V2::ParamHelpers
|
|
|
|
desc 'Get a currency' do
|
|
success Entities::Currency
|
|
end
|
|
params do
|
|
requires :id,
|
|
type: String,
|
|
values: { value: -> { Currency.visible.codes(bothcase: true) }, message: 'public.currency.doesnt_exist'},
|
|
desc: -> { API::V2::Entities::Currency.documentation[:id][:desc] }
|
|
end
|
|
get '/currencies/:id', requirements: { id: /[\w\.\-]+/ } do
|
|
present Currency.find(params[:id]), with: API::V2::Entities::Currency
|
|
end
|
|
|
|
desc 'Get list of currencies',
|
|
is_array: true,
|
|
success: Entities::Currency
|
|
params do
|
|
use :pagination
|
|
optional :type,
|
|
type: String,
|
|
values: { value: %w[fiat coin], message: 'public.currency.invalid_type' },
|
|
desc: -> { API::V2::Entities::Currency.documentation[:type][:desc] }
|
|
optional :search, type: JSON, default: {} do
|
|
optional :code,
|
|
type: String,
|
|
desc: 'Search by currency code using SQL LIKE'
|
|
optional :name,
|
|
type: String,
|
|
desc: 'Search by currency name using SQL LIKE'
|
|
end
|
|
end
|
|
get '/currencies' do
|
|
search_attrs = { m: 'or',
|
|
code_cont: params.dig(:search, :code),
|
|
name_cont: params.dig(:search, :name) }
|
|
|
|
|
|
present paginate(Rails.cache.fetch("currencies_#{params}", expires_in: 600) do
|
|
currencies = Currency.visible.ordered
|
|
currencies = currencies.where(type: params[:type]).includes(:blockchain) if params[:type] == 'coin'
|
|
currencies = currencies.where(type: params[:type]) if params[:type] == 'fiat'
|
|
|
|
search = currencies.ransack(search_attrs)
|
|
search.result.load.to_a
|
|
end), with: API::V2::Entities::Currency
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|