class HaveAPI::Parameters::Resource

Attributes

choices[R]
desc[R]
label[R]
name[R]
resource[R]
type[R]
value_id[R]
value_label[R]
value_params[R]

Public Class Methods

new(resource, name: nil, label: nil, desc: nil, choices: nil, value_id: :id, value_label: :label, required: nil, db_name: nil, fetch: nil) click to toggle source
# File lib/haveapi/parameters/resource.rb, line 6
def initialize(resource, name: nil, label: nil, desc: nil,
               choices: nil, value_id: :id, value_label: :label, required: nil,
               db_name: nil, fetch: nil)
  @resource = resource
  @resource_path = build_resource_path(resource)
  @name = name || resource.resource_name.underscore.to_sym
  @label = label || (name && name.to_s.capitalize) || resource.resource_name
  @desc = desc
  @choices = choices || @resource::Index
  @value_id = value_id
  @value_label = value_label
  @required = required
  @db_name = db_name
  @extra = {
      fetch:
  }
end

Public Instance Methods

clean(raw) click to toggle source
# File lib/haveapi/parameters/resource.rb, line 94
def clean(raw)
  ::HaveAPI::ModelAdapter.for(
    show_action.input.layout, @resource.model
  ).input_clean(@resource.model, raw, @extra)
end
db_name() click to toggle source
# File lib/haveapi/parameters/resource.rb, line 24
def db_name
  @db_name || @name
end
describe(context) click to toggle source
# File lib/haveapi/parameters/resource.rb, line 44
def describe(context)
  val_path = context.path_for(
    @resource::Show,
    context.endpoint && context.action_prepare && context.layout == :object && context.call_path_params(context.action, context.action_prepare)
  )
  val_method = @resource::Index.http_method.to_s.upcase

  choices_path = context.path_for(
    @choices,
    context.endpoint && context.layout == :object && context.call_path_params(context.action, context.action_prepare)
  )
  choices_method = @choices.http_method.to_s.upcase

  {
    required: required?,
    label: @label,
    description: @desc,
    type: 'Resource',
    resource: @resource_path,
    value_id: @value_id,
    value_label: @value_label,
    value: context.action_prepare && {
      path: val_path,
      method: val_method,
      help: "#{val_path}?method=#{val_method}"
    },
    choices: {
      path: choices_path,
      method: choices_method,
      help: "#{choices_path}?method=#{choices_method}"
    }
  }
end
format_output(v) click to toggle source
# File lib/haveapi/parameters/resource.rb, line 104
def format_output(v)
  v
end
optional?() click to toggle source
# File lib/haveapi/parameters/resource.rb, line 32
def optional?
  !@required
end
patch(attrs) click to toggle source
# File lib/haveapi/parameters/resource.rb, line 90
def patch(attrs)
  attrs.each { |k, v| instance_variable_set("@#{k}", v) }
end
required?() click to toggle source
# File lib/haveapi/parameters/resource.rb, line 28
def required?
  @required
end
show_action() click to toggle source
# File lib/haveapi/parameters/resource.rb, line 36
def show_action
  @resource::Show
end
show_index() click to toggle source
# File lib/haveapi/parameters/resource.rb, line 40
def show_index
  @resource::Index
end
validate(v, params) click to toggle source
# File lib/haveapi/parameters/resource.rb, line 100
def validate(v, params)
  true
end
validate_build_output() click to toggle source
# File lib/haveapi/parameters/resource.rb, line 78
def validate_build_output
  %i[value_id value_label].each do |name|
    v = instance_variable_get("@#{name}")

    [show_action, show_index].each do |klass|
      next unless klass.instance_variable_get('@output')[v].nil?

      raise "association to '#{@resource}': value_label '#{v}' is not an output parameter of '#{klass}'"
    end
  end
end

Private Instance Methods

build_resource_path(r) click to toggle source
# File lib/haveapi/parameters/resource.rb, line 110
def build_resource_path(r)
  path = []
  top_module = Kernel

  r.to_s.split('::').each do |name|
    top_module = top_module.const_get(name)

    begin
      top_module.obj_type
    rescue NoMethodError
      next
    end

    path << name.underscore
  end

  path
end