Sha256: 875f498c1f8bcb437656a691f5d1b09d16052e08b3a3fe2901981f9d367d3474

Contents?: true

Size: 2 KB

Versions: 9

Compression:

Stored size: 2 KB

Contents

module ApiRegulator
  module ControllerMixin
    def validate_params!
      validator_class = Validator.get(params[:controller], params[:action])

      unless validator_class
        raise "No validator found for HTTP method #{request.method} and API path #{api_definition.path}"
      end

      validator = validator_class.new(api_params)
      unless validator.valid?
        raise ApiRegulator::ValidationError.new(validator.errors)
      end
    end

    def api_definition
      return @api_definition if defined?(@api_definition)

      @api_definition ||= self.class.api_definitions.find do |d|
        d.controller_path == params[:controller] && d.action_name == params[:action]
      end

      raise "API definition not found for #{params[:controller]}##{params[:action]}" unless @api_definition

      @api_definition
    end

    def api_params
      path_params = api_definition.params.select(&:path?).each_with_object({}) do |param, hash|
        hash[param.name.to_sym] = params[param.name] if params.key?(param.name)
      end.symbolize_keys

      query_params = api_definition.params.select(&:query?).each_with_object({}) do |param, hash|
        hash[param.name.to_sym] = params[param.name] if params.key?(param.name)
      end.symbolize_keys

      body_params = api_definition.params.select(&:body?)
      permitted_body = body_params.each_with_object({}) do |param, hash|
        if params.key?(param.name)
          params.require(param.name).permit(*build_permitted_keys(param.children)).to_h.symbolize_keys
          hash[param.name.to_sym] = params.require(param.name).permit(*build_permitted_keys(param.children)).to_h.symbolize_keys
        end
      end.symbolize_keys

      path_params.merge(query_params).merge(permitted_body).symbolize_keys
    end

    private

    def build_permitted_keys(params)
      params.map do |param|
        if param.children.any?
          { param.name.to_sym => build_permitted_keys(param.children) }
        else
          param.name.to_sym
        end
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
api-regulator-0.1.8 lib/api_regulator/controller_mixin.rb
api-regulator-0.1.7 lib/api_regulator/controller_mixin.rb
api-regulator-0.1.6 lib/api_regulator/controller_mixin.rb
api-regulator-0.1.5 lib/api_regulator/controller_mixin.rb
api-regulator-0.1.4 lib/api_regulator/controller_mixin.rb
api-regulator-0.1.3 lib/api_regulator/controller_mixin.rb
api-regulator-0.1.2 lib/api_regulator/controller_mixin.rb
api-regulator-0.1.1 lib/api_regulator/controller_mixin.rb
api-regulator-0.1.0 lib/api_regulator/controller_mixin.rb