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.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. set :environment, ENV['APP_ENV'] == 'production' ? :production : :development
  14. get '/' do
  15. redirect '/login' unless signed_in?
  16. params[:type] = 'threads'
  17. erb :index, { locals: params, layout: :layout }
  18. end
  19. get '/search' do
  20. redirect '/login' unless signed_in?
  21. params[:type] = 'threads' unless params[:type]
  22. params[:page] = 1 unless params[:page] && params[:page].match(/\d+/)
  23. params[:page] = params[:page].to_i
  24. params[:q] = String.new unless params[:q]
  25. params[:username] = String.new unless params[:username]
  26. results = search(params)
  27. previous_url, next_url = build_urls(params)
  28. locals =
  29. params.merge(
  30. results: results, previous_url: previous_url, next_url: next_url
  31. )
  32. erb :results, { locals: locals, layout: :layout }
  33. end
  34. get '/login' do
  35. redirect '/' if signed_in?
  36. erb :login, { layout: :layout, locals: { error_message: nil } }
  37. end
  38. post '/login' do
  39. redirect '/' if signed_in?
  40. username = params[:username]
  41. password = params[:password]
  42. cookie = login(username, password)
  43. if cookie.nil?
  44. erb :login,
  45. { layout: :layout, locals: { error_message: 'Invalid credentials' } }
  46. else
  47. session['user_id'] = username
  48. redirect '/'
  49. end
  50. end
  51. post '/logout' do
  52. session['user_id'] = nil
  53. redirect '/'
  54. end
  55. helpers do
  56. def build_urls(params)
  57. current_page = params[:page].to_i
  58. previous_page = current_page > 1 ? current_page - 1 : nil
  59. next_page = current_page + 1
  60. url_params = { q: params[:q], type: params[:type] }
  61. url_params[:username] = params[:username] if params[:username]
  62. [previous_page, next_page].map do |page|
  63. URI::Generic.build(
  64. path: '/search',
  65. query: URI.encode_www_form(url_params.merge(page: page))
  66. )
  67. end
  68. end
  69. def current_user
  70. session['user_id']
  71. end
  72. def signed_in?
  73. !!session['user_id']
  74. end
  75. def external_link(url, text)
  76. "<a href=\"#{url}\" target=\"_blank\">#{text}</a>"
  77. end
  78. end
  79. run! if __FILE__ == $0
  80. end