Files
sure/app/controllers/api/v1/securities_controller.rb
ghost a48f264799 feat(api): expose securities and price history (#1642)
* feat(api): expose securities and prices

* fix(api): stabilize security price filters

* fix(api): cap security pagination limits

* fix(api): preserve security price decimal scale

* fix(api): validate securities boolean filters

* fix(api): reject blank securities boolean filters

* fix(api): trim security exchange filter

* fix(api): tighten security price filters

* fix(api): tighten security resource filters

* fix(api): tighten securities docs fixtures
2026-05-05 01:08:43 +02:00

61 lines
1.7 KiB
Ruby

# frozen_string_literal: true
class Api::V1::SecuritiesController < Api::V1::BaseController
include Pagy::Backend
include Api::V1::SecurityResourceFiltering
before_action :ensure_read_scope
before_action :set_security, only: :show
def index
securities_query = apply_filters(securities_scope).order(:ticker, :exchange_operating_mic, :name)
@per_page = safe_per_page_param
@pagy, @securities = pagy(
securities_query,
page: safe_page_param,
limit: @per_page
)
render :index
rescue Api::V1::SecurityResourceFiltering::InvalidFilterError => e
render_validation_error(e.message)
end
def show
render :show
end
private
def set_security
raise ActiveRecord::RecordNotFound, "Security not found" unless valid_uuid?(params[:id])
@security = securities_scope.find(params[:id])
end
def ensure_read_scope
authorize_scope!(:read)
end
def securities_scope
Security
.where(id: scoped_security_ids)
end
def apply_filters(query)
query = query.where("LOWER(securities.ticker) = ?", params[:ticker].to_s.strip.downcase) if params[:ticker].present?
query = query.where(exchange_operating_mic: params[:exchange_operating_mic].to_s.strip.upcase) if params[:exchange_operating_mic].present?
if params[:kind].present?
invalid_filter!("kind must be one of: #{Security::KINDS.join(', ')}") unless Security::KINDS.include?(params[:kind])
query = query.where(kind: params[:kind])
end
if params.key?(:offline)
offline = parse_boolean_filter_param(:offline)
query = query.where(offline: offline)
end
query
end
end