lib/grape/batch.rb in grape-batch-2.2.2 vs lib/grape/batch.rb in grape-batch-2.3.0
- old
+ new
@@ -3,81 +3,13 @@
require 'grape/batch/logger'
require 'grape/batch/request'
require 'grape/batch/response'
require 'grape/batch/validator'
require 'grape/batch/version'
+require 'grape/batch/base'
require 'multi_json'
module Grape
module Batch
- # Gem main class
- class Base
- SESSION_HEADER = 'api.session'.freeze
- TOKEN_HEADER = 'HTTP_X_API_TOKEN'.freeze
- def initialize(app)
- @app = app
- @response_klass = Grape::Batch.configuration.formatter
- @batch_size_limit = Grape::Batch.configuration.limit
- @api_path = Grape::Batch.configuration.path
- @session_proc = Grape::Batch.configuration.session_proc
- @logger = Grape::Batch::Logger.new
- end
-
- def call(env)
- return @app.call(env) unless batch_request?(env)
- @logger.prepare(env).batch_begin
- batch_call(env)
- end
-
- def batch_call(env)
- begin
- status = 200
- batch_requests = Grape::Batch::Validator.parse(env, @batch_size_limit)
- body = MultiJson.encode(dispatch(env, batch_requests))
- rescue Grape::Batch::RequestBodyError, Grape::Batch::TooManyRequestsError => e
- e.class == TooManyRequestsError ? status = 429 : status = 400
- body = e.message
- end
-
- @logger.batch_end
- Rack::Response.new(body, status, 'Content-Type' => 'application/json')
- end
-
- private
-
- def batch_request?(env)
- env['PATH_INFO'].start_with?(@api_path) &&
- env['REQUEST_METHOD'] == 'POST' &&
- env['CONTENT_TYPE'] == 'application/json'
- end
-
- def dispatch(env, batch_requests)
- # Prepare batch request env
- @request_env = env.dup
- # Call session proc
- @request_env[SESSION_HEADER] = @session_proc.call(@request_env)
-
- # Call batch request
- batch_requests.map do |batch_request|
- batch_env = Grape::Batch::Request.new(@request_env, batch_request).build
- status, headers, response = @app.call(batch_env)
-
- update_request_env_session_from_headers(headers)
- update_request_env_token_from_headers(headers)
-
- @response_klass.format(status, headers, response)
- end
- end
-
- def update_request_env_session_from_headers(headers)
- return if !headers[SESSION_HEADER] || @request_env[SESSION_HEADER]
- @request_env[SESSION_HEADER] = headers[SESSION_HEADER]
- end
-
- def update_request_env_token_from_headers(headers)
- return if !headers[TOKEN_HEADER] || @request_env[TOKEN_HEADER]
- @request_env[TOKEN_HEADER] = headers[TOKEN_HEADER].dup
- end
- end
end
end