| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- # frozen_string_literal: true
- require 'rack/app'
- require 'rack/app/front_end'
- require 'json'
- class App < Rack::App
- MAX_PK = 10_000
- ID_RANGE = (1..10_000).freeze
- ALL_IDS = ID_RANGE.to_a
- QUERIES_MIN = 1
- QUERIES_MAX = 500
- JSON_TYPE = 'application/json'
- HTML_TYPE = 'text/html; charset=utf-8'
- PLAINTEXT_TYPE = 'text/plain'
- apply_extensions :front_end
- helpers do
- def fortunes
- fortunes = Fortune.all
- fortunes << Fortune.new(
- id: 0,
- message: "Additional fortune added at request time."
- )
- fortunes.sort_by!(&:message)
- end
- end
- get '/json' do
- set_headers(JSON_TYPE)
- { message: 'Hello, World!' }.to_json
- end
- get '/db' do
- set_headers(JSON_TYPE)
- World.with_pk(rand1).values.to_json
- end
- get '/queries' do
- set_headers(JSON_TYPE)
- ids = ALL_IDS.sample(bounded_queries)
- DB.synchronize do
- ids.map do |id|
- World.with_pk(id).values
- end
- end.to_json
- end
- get '/fortunes' do
- set_headers(HTML_TYPE)
- render 'fortunes.html.erb'
- end
- get '/plaintext' do
- set_headers(PLAINTEXT_TYPE)
- 'Hello, World!'
- end
- private
- # Return a random number between 1 and MAX_PK
- def rand1
- rand(MAX_PK).succ
- end
- def bounded_queries
- queries = params['queries'].to_i
- queries.clamp(QUERIES_MIN, QUERIES_MAX)
- end
- def set_headers(content_type)
- response.headers[::Rack::CONTENT_TYPE] = content_type
- response.headers['Server'] = 'rack-app'
- end
- end
|