You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

server.rb 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. require 'dotenv/load'
  2. require 'sequel'
  3. require 'sinatra'
  4. require 'truncato'
  5. require_relative '../db/connect'
  6. require_relative '../lib/auth'
  7. require_relative '../lib/search'
  8. class VLVSearch < Sinatra::Base
  9. set :sessions,
  10. key: ENV['SESSION_KEY'],
  11. domain: ENV['SESSION_DOMAIN'],
  12. path: '/',
  13. expire_after: 14_400,
  14. secret: ENV['SESSION_SECRET']
  15. set :environment, ENV['APP_ENV'] == 'production' ? :production : :development
  16. set :show_exceptions, ENV['APP_ENV'] == 'development'
  17. error 500 do
  18. erb :error, { layout: :layout }
  19. end
  20. get '/' do
  21. redirect '/login' unless signed_in?
  22. params[:type] = 'threads'
  23. erb :index, { locals: params, layout: :layout }
  24. end
  25. get '/search' do
  26. redirect '/login' unless signed_in?
  27. params[:type] = 'threads' unless params[:type]
  28. params[:page] = 1 unless params[:page] && params[:page].match(/\d+/)
  29. params[:page] = params[:page].to_i
  30. params[:q] = String.new unless params[:q]
  31. params[:username] = String.new unless params[:username]
  32. params[:from_date] = String.new unless params[:from_date]
  33. params[:to_date] = String.new unless params[:to_date]
  34. params[:exact_match] = String.new unless params[:exact_match]
  35. results = search(params)
  36. unless results[:errors].empty?
  37. erb :results, { locals: {errors: results[:errors]}, layout: :layout }
  38. else
  39. params[:current_count] = results[:results].to_a.size
  40. params[:full_count] = results[:results].empty? ? 0 : results[:results].first[:full_count]
  41. previous_url, next_url = build_urls(params)
  42. locals =
  43. params.merge(
  44. results: results[:results],
  45. previous_url: previous_url,
  46. next_url: next_url,
  47. errors: Array.new,
  48. )
  49. erb :results, { locals: locals, layout: :layout }
  50. end
  51. end
  52. get '/login' do
  53. redirect '/' if signed_in?
  54. erb :login, { layout: :layout, locals: { error_message: nil } }
  55. end
  56. post '/login' do
  57. redirect '/' if signed_in?
  58. username = params[:username]
  59. password = params[:password]
  60. cookie = login(username, password)
  61. if cookie.nil?
  62. erb :login,
  63. { layout: :layout, locals: { error_message: 'Invalid credentials' } }
  64. else
  65. session['user_id'] = username
  66. redirect '/'
  67. end
  68. end
  69. post '/logout' do
  70. session['user_id'] = nil
  71. redirect '/'
  72. end
  73. helpers do
  74. def build_urls(params)
  75. current_page = params[:page].to_i
  76. previous_page = current_page > 1 ? current_page - 1 : nil
  77. if (params[:current_count] + ((current_page - 1) * RESULTS_PER_PAGE)) == params[:full_count]
  78. next_page = nil
  79. else
  80. next_page = current_page + 1
  81. end
  82. url_params = { q: params[:q], type: params[:type] }
  83. url_params[:username] = params[:username] if params[:username]
  84. url_params[:from_date] = params[:from_date] if params[:from_date]
  85. url_params[:to_date] = params[:to_date] if params[:to_date]
  86. [
  87. URI::Generic.build(
  88. path: '/search',
  89. query: URI.encode_www_form(url_params.merge(page: previous_page))
  90. ),
  91. next_page.nil? ? nil : URI::Generic.build(
  92. path: '/search',
  93. query: URI.encode_www_form(url_params.merge(page: next_page))
  94. ),
  95. ]
  96. end
  97. def current_user
  98. session['user_id']
  99. end
  100. def signed_in?
  101. !!session['user_id']
  102. end
  103. def external_link(url, text)
  104. "<a href=\"#{url}\" target=\"_blank\">#{text}</a>"
  105. end
  106. def truncate(s)
  107. Truncato.truncate(s, max_length: 500)
  108. end
  109. end
  110. end