Sha256: f7883b0593ee2159bd3230316cffdec8877675d60b41ed33bde7278a89cbd268

Contents?: true

Size: 1.59 KB

Versions: 1

Compression:

Stored size: 1.59 KB

Contents

# encoding: utf-8

module Hyperdrive
  class Endpoint

    def self.call(env)
      @env = env
      @request = Rack::Request.new(@env)
      @media_type = env['hyperdrive.media_type']
      @params = env['hyperdrive.params']
      @resource = env['hyperdrive.resource']
      @headers = Hyperdrive::Values.default_headers.dup
      @headers.merge!('Allow' => resource.allowed_methods, 'Content-Type' => @media_type)

      response.finish
    end

    private

    class << self
      attr_reader   :env, :request, :media_type, :params, :resource
      attr_accessor :headers
    end

    def self.json?
      media_type =~ /json$/
    end

    def self.xml?
      media_type =~ /xml$/
    end

    def self.page
      env['hyperdrive.page']
    end

    def self.per_page
      env['hyperdrive.per_page']
    end

    def self.render(body)
      case body
      when Array, Hash
        if json?
          MultiJson.dump(body)
        else
          env['rack.errors'] << "ENDPOINT: Can't serialize response automatically"
        end
      when String
        body
      else
        body.to_s
      end
    end

    def self.error(status, message)
      raise Errors::HTTPError.new(message, status)
    end

    def self.status
      case env['REQUEST_METHOD']
      when 'POST'
        201
      when 'DELETE'
        204
      else
        200
      end
    end

    def self.body
      body = instance_eval(&resource.request_handler(env['REQUEST_METHOD']))
      body = '' if env['REQUEST_METHOD'] == 'DELETE'
      body
    end

    def self.response
      ::Rack::Response.new(body, status, headers)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hyperdrive-0.0.8 lib/hyperdrive/endpoint.rb