Class: Rack::Reducer::Middleware

Inherits:
Object
  • Object
show all
Defined in:
lib/rack/reducer/middleware.rb

Overview

Mount Rack::Reducer as middleware

Examples:

A microservice that filters artists

ArtistService = Rack::Builder.new do
  use(
    Rack::Reducer::Middleware,
    dataset: Artist.all,
    filters: [
      lambda { |name:| where(name: name) },
      lambda { |genre:| where(genre: genre) },
    ]
  )

  run ->(env) {  [200, {}, [env['rack.reduction'].to_json]] }
end

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ Middleware

Returns a new instance of Middleware.



22
23
24
25
26
# File 'lib/rack/reducer/middleware.rb', line 22

def initialize(app, options = {})
  @app = app
  @key = options[:key] || 'rack.reduction'
  @reducer = Rack::Reducer.new(options[:dataset], *options[:filters])
end

Instance Method Details

#call(env) ⇒ Object

Call the next app in the middleware stack, with ‘env` set to the ouput of a reduction



30
31
32
33
34
# File 'lib/rack/reducer/middleware.rb', line 30

def call(env)
  params = Rack::Request.new(env).params
  reduction = @reducer.apply(params)
  @app.call env.merge(@key => reduction)
end