Module: JSONAPIonify::Api::Resource::Definitions::Params

Defined in:
lib/jsonapionify/api/resource/definitions/params.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(klass) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/jsonapionify/api/resource/definitions/params.rb', line 4

def self.extended(klass)
  klass.class_eval do
    extend JSONAPIonify::InheritedAttributes
    inherited_hash_attribute :param_definitions

    context(:params, readonly: true, persisted: true) do |request:, action_name:|
      defined_params = self.class.param_definitions.select do |_, v|
        v.actions.blank? || v.actions.include?(action_name)
      end
      param_defaults = defined_params.values.select(&:has_default?).map(&:default)
      [*param_defaults, request.params].reduce(:deep_merge)
    end

    # Validate params before request
    before do |params:, action_name:, request:, nested_request: false|
      defined_params = self.class.param_definitions.select do |_, v|
        v.actions.blank? || v.actions.include?(action_name)
      end

      required_params = defined_params.select do |_, v|
        v.required
      end

      # Check for validity
      params.each do |k, v|
        keypath  = ParamOptions.hash_to_keypaths(k => v)[0]
        reserved = ParamOptions.reserved?(k)
        allowed  = defined_params.keys.include? keypath
        valid    = ParamOptions.valid?(k) || v.is_a?(Hash)
        unless reserved || (allowed && valid) || nested_request
          error :parameter_invalid, ParamOptions.keypath_to_string(*keypath)
        end
      end unless request.options?

      # Check for requirement
      missing_params = ParamOptions.missing_parameters(
        request.params, required_params.values.map(&:keypath)
      )
      error :parameters_missing, missing_params if !nested_request && missing_params.present?
    end

  end
end

Instance Method Details

#param(*keypath, **options) ⇒ Object



48
49
50
# File 'lib/jsonapionify/api/resource/definitions/params.rb', line 48

def param(*keypath, **options)
  param_definitions[keypath] = ParamOptions.new(*keypath, **options)
end

#sticky_params(params) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/jsonapionify/api/resource/definitions/params.rb', line 52

def sticky_params(params)
  sticky_param_definitions = param_definitions.values.select(&:sticky)
  ParamOptions.hash_to_keypaths(params).map do |keypath|
    definition = sticky_param_definitions.find do |d|
      d.keypath == keypath
    end
    next {} unless definition
    value = definition.extract_value(params)
    if definition.default_value?(value)
      {}
    else
      definition.with_value(value)
    end
  end.reduce(:deep_merge)
end