class Toast::SingleRequest

Public Class Methods

new(config, base_config, auth, request) click to toggle source
# File lib/toast/single_request.rb, line 7
def initialize  config, base_config, auth, request
  @config      = config
  @base_config = base_config
  @selected_attributes = request.query_parameters[:toast_select].try(:split,/ *, */)
  @uri_params  = request.query_parameters
  @base_uri    = base_uri(request)
  @verb        = request.request_method.downcase
  @auth        = auth
  @path        = request.path_parameters[:toast_path]#.split('/')
  @request     = request
end

Public Instance Methods

respond() click to toggle source
# File lib/toast/single_request.rb, line 19
def respond

  if @config.via_get.nil?
    # not declared
    response :method_not_allowed,
             headers: {'Allow' => allowed_methods(@config)},
             msg: "GET not configured"
  else
    begin
      model = call_handler(@config.via_get.handler, @uri_params)
      call_allow(@config.via_get.permissions, @auth, model, @uri_params)

      case model
      when @base_config.model_class
        response :ok,
                 headers: {"Content-Type" => @base_config.media_type},
                 body:    represent(model, @base_config)
      when nil
        response :not_found, msg: "resource not found at /#{@path}"
      else
        # wrong class/model_class
        response :internal_server_error,
                 msg: "single method returned `#{model.class}', expected `#{@base_config.model_class}'"
      end

    rescue ActiveRecord::RecordNotFound => error
      response :not_found, msg: error.message

    rescue AllowError => error
      return response :internal_server_error,
                      msg: "exception raised in allow block: `#{error.orig_error.message}' in #{error.source_location}"

    rescue BadRequest => error
      response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
                headers: {'X-Toast-Error' => error.code}

    rescue HandlerError => error
      return response :internal_server_error,
                      msg: "exception raised in handler: `#{error.orig_error.message}' in #{error.source_location}"
    rescue NotAllowed => error
      return response :unauthorized, msg: "not authorized by allow block in: #{error.source_location}"

    rescue => error
      return response :internal_server_error,
                      msg: "exception raised: #{error} \n#{error.backtrace[0..5].join("\n")}"
    end
  end
end