mirror of
https://github.com/we-promise/sure.git
synced 2026-05-07 12:54:04 +00:00
* 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>
74 lines
1.8 KiB
Ruby
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
|