app.rb 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # frozen_string_literal: true
  2. require 'rack/app'
  3. require 'rack/app/front_end'
  4. require 'json'
  5. class App < Rack::App
  6. MAX_PK = 10_000
  7. ID_RANGE = (1..10_000).freeze
  8. ALL_IDS = ID_RANGE.to_a
  9. QUERIES_MIN = 1
  10. QUERIES_MAX = 500
  11. JSON_TYPE = 'application/json'
  12. HTML_TYPE = 'text/html; charset=utf-8'
  13. PLAINTEXT_TYPE = 'text/plain'
  14. apply_extensions :front_end
  15. helpers do
  16. def fortunes
  17. fortunes = Fortune.all
  18. fortunes << Fortune.new(
  19. id: 0,
  20. message: "Additional fortune added at request time."
  21. )
  22. fortunes.sort_by!(&:message)
  23. end
  24. end
  25. get '/json' do
  26. set_headers(JSON_TYPE)
  27. { message: 'Hello, World!' }.to_json
  28. end
  29. get '/db' do
  30. set_headers(JSON_TYPE)
  31. World.with_pk(rand1).values.to_json
  32. end
  33. get '/queries' do
  34. set_headers(JSON_TYPE)
  35. ids = ALL_IDS.sample(bounded_queries)
  36. DB.synchronize do
  37. ids.map do |id|
  38. World.with_pk(id).values
  39. end
  40. end.to_json
  41. end
  42. get '/fortunes' do
  43. set_headers(HTML_TYPE)
  44. render 'fortunes.html.erb'
  45. end
  46. get '/plaintext' do
  47. set_headers(PLAINTEXT_TYPE)
  48. 'Hello, World!'
  49. end
  50. private
  51. # Return a random number between 1 and MAX_PK
  52. def rand1
  53. rand(MAX_PK).succ
  54. end
  55. def bounded_queries
  56. queries = params['queries'].to_i
  57. queries.clamp(QUERIES_MIN, QUERIES_MAX)
  58. end
  59. def set_headers(content_type)
  60. response.headers[::Rack::CONTENT_TYPE] = content_type
  61. response.headers['Server'] = 'rack-app'
  62. end
  63. end