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 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. require 'dotenv/load'
  2. require 'sequel'
  3. require 'sinatra'
  4. require_relative '../lib/auth'
  5. require_relative '../lib/search'
  6. class VLVSearch < Sinatra::Base
  7. set :sessions,
  8. key: ENV['SESSION_KEY'],
  9. domain: ENV['SESSION_DOMAIN'],
  10. path: '/',
  11. expire_after: 14_400,
  12. secret: ENV['SESSION_SECRET']
  13. get '/' do
  14. redirect '/login' unless signed_in?
  15. params[:type] = 'threads'
  16. erb :index, { locals: params, layout: :layout }
  17. end
  18. get '/search' do
  19. redirect '/login' unless signed_in?
  20. params[:type] = 'threads' unless params[:type]
  21. params[:page] = 1 unless params[:page] && params[:page].match(/\d+/)
  22. params[:page] = params[:page].to_i
  23. params[:q] = String.new unless params[:q]
  24. params[:username] = String.new unless params[:username]
  25. results = search(params)
  26. previous_url, next_url = build_urls(params)
  27. locals =
  28. params.merge(
  29. results: results, previous_url: previous_url, next_url: next_url
  30. )
  31. erb :results, { locals: locals, layout: :layout }
  32. end
  33. get '/login' do
  34. redirect '/' if signed_in?
  35. erb :login, { layout: :layout, locals: { error_message: nil } }
  36. end
  37. post '/login' do
  38. redirect '/' if signed_in?
  39. username = params[:username]
  40. password = params[:password]
  41. cookie = login(username, password)
  42. if cookie.nil?
  43. erb :login,
  44. { layout: :layout, locals: { error_message: 'Invalid credentials' } }
  45. else
  46. session['user_id'] = username
  47. redirect '/'
  48. end
  49. end
  50. post '/logout' do
  51. session['user_id'] = nil
  52. redirect '/'
  53. end
  54. helpers do
  55. def build_urls(params)
  56. current_page = params[:page].to_i
  57. previous_page = current_page > 1 ? current_page - 1 : nil
  58. next_page = current_page + 1
  59. url_params = { q: params[:q], type: params[:type] }
  60. url_params[:username] = params[:username] if params[:username]
  61. [previous_page, next_page].map do |page|
  62. URI::Generic.build(
  63. path: '/search',
  64. query: URI.encode_www_form(url_params.merge(page: page))
  65. )
  66. end
  67. end
  68. def current_user
  69. session['user_id']
  70. end
  71. def signed_in?
  72. !!session['user_id']
  73. end
  74. def external_link(url, text)
  75. "<a href=\"#{url}\" target=\"_blank\">#{text}</a>"
  76. end
  77. end
  78. run! if __FILE__ == $0
  79. end