class Opi::Context

Attributes

env[R]
error[R]
logger[R]
request[R]
response[R]
route[R]

Public Class Methods

new(env, logger, route, request, response) click to toggle source
# File lib/opi/context.rb, line 6
def initialize(env, logger, route, request, response)
  @env = env
  @logger = logger
  @route = route
  @request = request
  @response = response
  @error = nil
end

Public Instance Methods

error!(message, status) click to toggle source
# File lib/opi/context.rb, line 19
def error!(message, status)
  @error = {:message => message, :status => status}
end
params() click to toggle source
# File lib/opi/context.rb, line 15
def params
  {}.tap {|h| @request.params.each{|x| h[x.first.to_sym] = x.last}}
end
run() click to toggle source
# File lib/opi/context.rb, line 23
def run
  skip = route.options[:skip] || []
  skip = [skip] unless skip.is_a? Array

  route_before = route.options[:before] || []
  route_before = [route_before] unless route_before.is_a? Array

  (route.before + route_before).each do |before|
    next if skip.include? before

    self.send before # execute before filter

    if self.error
      response.body = ["{\"error\":\"#{error[:message]}\"}", "\n"]
      response.status = error[:status]
      return response
    end
  end

  # before filters must have succeeded
  action = instance_eval &route.block

  if action.respond_to? :success?
    if action.success?
      response.status = 200
      response.body = [action.result.to_json, "\n"]
    else
      response.status = 400
      response.body = [action.errors.symbolic.to_json, "\n"]
      logger.error "Reponse: #{action.errors.symbolic.to_json}".red
    end
  else
    response.status = 200
    response.body = [action.to_json, "\n"]
  end

  if self.error
    response.status = error[:status]
    response.body = [error[:message].to_json, "\n"]
  end

  response
end