module Shaf::Payload

Constants

NO_VALUE

Private Instance Methods

add_cache_headers(payload, kwargs) click to toggle source
# File lib/shaf/helpers/payload.rb, line 83
def add_cache_headers(payload, kwargs)
  return unless kwargs.delete(:http_cache) { Settings.http_cache }

  chksum, kind = etag_for(payload)
  etag(chksum, kind: kind) if chksum
end
etag_for(payload) click to toggle source
# File lib/shaf/helpers/payload.rb, line 90
def etag_for(payload)
  return if payload.nil? || payload.empty?

  sha1 = Digest::SHA1.hexdigest payload
 [sha1, :weak] # Weak or Strong??
end
parse_payload() click to toggle source
# File lib/shaf/helpers/payload.rb, line 19
def parse_payload
  return unless Parser.input? request

  parser = Parser.for(request)
  raise Errors::UnsupportedMediaTypeError.new(request: request) unless parser

  log.debug "Parsing input using: #{parser.class}"
  parser.call
rescue Parser::Error => e
  raise Errors::BadRequestError, "Failed to parse input payload: #{e.message}"
end
payload() click to toggle source
# File lib/shaf/helpers/payload.rb, line 14
def payload
  return @payload if defined? @payload
  @payload = parse_payload
end
profile(value = NO_VALUE) click to toggle source
# File lib/shaf/helpers/payload.rb, line 43
def profile(value = NO_VALUE)
  return @profile if value == NO_VALUE
  @profile = value
end
respond_with(resource, status: nil, serializer: nil, collection: false, preload: [], **kwargs) click to toggle source
# File lib/shaf/helpers/payload.rb, line 59
def respond_with(resource, status: nil, serializer: nil, collection: false, preload: [], **kwargs)
  status ||= resource.respond_to?(:http_status) ? resource.http_status : 200
  status(status)

  kwargs.merge!(serializer: serializer, collection: collection)
  kwargs[:profile] ||= profile

  log.info "#{request.request_method} #{request.path_info} => #{status}"
  responder = Responder.for(request, resource)
  payload = responder.call(self, resource, preload: preload, **kwargs)
  add_cache_headers(payload, kwargs)
  payload
rescue StandardError => err
  log.error "Failure: #{err.message}\n#{err.backtrace}"
  if status == 500
    content_type mime_type(:json)
    body JSON.generate(failure: err.message)
  elsif err.is_a? Errors::ServerError
    respond_with(err)
  else
    respond_with(Errors::ServerError.new(err.message))
  end
end
respond_with_collection(resource, status: nil, serializer: nil, preload: [], **kwargs) click to toggle source
# File lib/shaf/helpers/payload.rb, line 48
def respond_with_collection(resource, status: nil, serializer: nil, preload: [], **kwargs)
  respond_with(
    resource,
    status: status,
    serializer: serializer,
    collection: true,
    preload: preload,
    **kwargs
  )
end
safe_params(*fields) click to toggle source
# File lib/shaf/helpers/payload.rb, line 31
def safe_params(*fields)
  return {} unless payload

  fields = fields.map { |f| f.to_sym.downcase }.to_set
  fields << :id

  fields.each_with_object({}) do |f, allowed|
    allowed[f] = payload[f] if payload.key? f
    allowed[f] ||= payload[f.to_s] if payload.key? f.to_s
  end
end