class JSONAPI::Serializable::Resource

Public Class Methods

new(exposures = {}) click to toggle source

rubocop:disable Metrics/AbcSize, Metrics/MethodLength

# File lib/jsonapi/serializable/resource.rb, line 18
def initialize(exposures = {})
  @_exposures = exposures
  @_exposures.each { |k, v| instance_variable_set("@#{k}", v) }

  @_id = instance_eval(&self.class.id_block).to_s
  @_type = if (b = self.class.type_block)
             instance_eval(&b).to_sym
           else
             self.class.type_val || :unknown
           end
  @_relationships = self.class.relationship_blocks
                        .each_with_object({}) do |(k, v), h|
    opts = self.class.relationship_options[k] || {}
    h[k] = Relationship.new(@_exposures, opts, &v)
  end
  @_meta = if (b = self.class.meta_block)
             instance_eval(&b)
           else
             self.class.meta_val
           end

  freeze
end

Public Instance Methods

as_jsonapi(fields: nil, include: []) click to toggle source

rubocop:disable Metrics/AbcSize, Metrics/MethodLength

# File lib/jsonapi/serializable/resource.rb, line 44
def as_jsonapi(fields: nil, include: [])
  attrs = requested_attributes(fields).each_with_object({}) do |(k, v), h|
    h[k] = instance_eval(&v)
  end
  rels = requested_relationships(fields)
         .each_with_object({}) do |(k, v), h|
    h[k] = v.as_jsonapi(include.include?(k))
  end
  links = link_blocks.each_with_object({}) do |(k, v), h|
    h[k] = Link.as_jsonapi(@_exposures, &v)
  end
  {}.tap do |hash|
    hash[:id]   = @_id
    hash[:type] = @_type
    hash[:attributes]    = attrs if attrs.any?
    hash[:relationships] = rels  if rels.any?
    hash[:links] = links if links.any?
    hash[:meta]  = @_meta  unless @_meta.nil?
  end
end
jsonapi_cache_key(options) click to toggle source
# File lib/jsonapi/serializable/resource.rb, line 80
def jsonapi_cache_key(options)
  "#{jsonapi_type} - #{jsonapi_id}" \
  "- #{options[:include].to_a.sort}" \
  "- #{(options[:fields] || Set.new).to_a.sort}"
end
jsonapi_id() click to toggle source
# File lib/jsonapi/serializable/resource.rb, line 70
def jsonapi_id
  @_id
end
jsonapi_type() click to toggle source

rubocop:enable Metrics/AbcSize, Metrics/MethodLength

# File lib/jsonapi/serializable/resource.rb, line 66
def jsonapi_type
  @_type
end

Private Instance Methods

requested_attributes(fields) click to toggle source

@api private

# File lib/jsonapi/serializable/resource.rb, line 89
def requested_attributes(fields)
  self.class.attribute_blocks
      .select { |k, _| fields.nil? || fields.include?(k) }
end
requested_relationships(fields) click to toggle source

@api private

# File lib/jsonapi/serializable/resource.rb, line 95
def requested_relationships(fields)
  @_relationships.select { |k, _| fields.nil? || fields.include?(k) }
end