class ActivePolicyMiddleware

Constants

ENV_KEY_REQUEST_METHOD
ENV_KEY_WARDEN

Public Class Methods

new(app) click to toggle source
# File lib/active_policy/active_policy_middleware.rb, line 6
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source

@param [Hash] env

# File lib/active_policy/active_policy_middleware.rb, line 11
def call(env)
  request = ActionDispatch::Request.new(env)
  params = ActivePolicy::Utilities.route_params(
      request.path,
      env[ENV_KEY_REQUEST_METHOD],
      Rails.application.routes
  )

  return next_middleware(env) unless run_middleware?(params)

  method_name = method_name_from_params(params)
  models = ActivePolicy::Utilities.models_from_route_params(params)
  policy = policy_name(params).new(current_user(env), request, params)

  return next_middleware(env) unless policy.respond_to?(method_name)

  result = policy.send(method_name, *models)

  return next_middleware(env) if result

  response
end

Private Instance Methods

current_user(env) click to toggle source

@param [Hash] env @return [User, nil]

# File lib/active_policy/active_policy_middleware.rb, line 60
def current_user(env)
  if env.key?(ENV_KEY_WARDEN)
    return env[ENV_KEY_WARDEN].user
  end

  nil
end
method_name_from_params(params) click to toggle source

@param [Hash] params @return [String]

# File lib/active_policy/active_policy_middleware.rb, line 38
def method_name_from_params(params)
  return params[:method] if params.key(:method)

  params[:action] + '?'
end
next_middleware(env) click to toggle source

@param [Hash] env

# File lib/active_policy/active_policy_middleware.rb, line 74
def next_middleware(env)
  @app.call(env)
end
policy_name(params) click to toggle source

@param [Hash] params @return [String]

# File lib/active_policy/active_policy_middleware.rb, line 46
def policy_name(params)
  if params[:policy].is_a?(Class)
    return params[:policy]
  end

  if params[:policy].key?(:class)
    return params[:policy][:class]
  end

  params[:policy]
end
response(status_code = 401, headers = {'content_type': 'application/json'}, body = []) click to toggle source

@param [Rack::Response]

# File lib/active_policy/active_policy_middleware.rb, line 69
def response(status_code = 401, headers = {'content_type': 'application/json'}, body = [])
  Rack::Response.new(body, status_code, headers).finish
end
run_middleware?(params) click to toggle source

@param [Hash] params @return [TrueClass, FalseClass]

# File lib/active_policy/active_policy_middleware.rb, line 80
def run_middleware?(params)
  params.key?(:policy)
end