Files
sure/app/controllers/api/v1/rules_controller.rb
ghost 9cb3b8e05c feat(api): expose rule run history (#1646)
* feat(api): expose rule run history

* fix(api): address rule run review

* fix(api): complete rule run review

* test(api): cover unauthenticated rule run show

* test(api): align rule run api key helper

* Small Sonnet nit-pick

---------

Co-authored-by: Juan José Mata <jjmata@jjmata.com>
2026-05-03 23:33:35 +02:00

74 lines
1.8 KiB
Ruby

# frozen_string_literal: true
class Api::V1::RulesController < Api::V1::BaseController
include Pagy::Backend
BOOLEAN_FILTERS = {
"true" => true,
"1" => true,
"false" => false,
"0" => false
}.freeze
RESOURCE_TYPES = %w[transaction].freeze
before_action :ensure_read_scope
before_action :set_rule, only: :show
def index
return render_invalid_resource_type_filter if invalid_resource_type_filter?
@per_page = safe_per_page_param
rules_query = current_resource_owner.family.rules
.includes(:actions, conditions: :sub_conditions)
.order(:created_at, :id)
rules_query = rules_query.where(resource_type: params[:resource_type]) if params[:resource_type].present?
if params[:active].present?
active = parse_boolean_filter(params[:active])
return if performed?
rules_query = rules_query.where(active: active)
end
@pagy, @rules = pagy(
rules_query,
page: safe_page_param,
limit: @per_page
)
render :index
end
def show
render :show
end
private
def set_rule
@rule = current_resource_owner.family.rules
.includes(:actions, conditions: :sub_conditions)
.find(params[:id])
end
def ensure_read_scope
authorize_scope!(:read)
end
def parse_boolean_filter(value)
normalized = value.to_s.downcase
return BOOLEAN_FILTERS[normalized] if BOOLEAN_FILTERS.key?(normalized)
render_validation_error("active must be one of: true, false, 1, 0")
nil
end
def invalid_resource_type_filter?
params[:resource_type].present? && !params[:resource_type].in?(RESOURCE_TYPES)
end
def render_invalid_resource_type_filter
render_validation_error("resource_type must be one of: #{RESOURCE_TYPES.join(", ")}")
end
end