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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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]
  22. params[:page] = params[:page].to_i
  23. results = search(params)
  24. previous_url, next_url = build_urls(params)
  25. locals =
  26. params.merge(
  27. results: results, previous_url: previous_url, next_url: next_url
  28. )
  29. erb :results, { locals: locals, layout: :layout }
  30. end
  31. get '/login' do
  32. erb :login, { layout: :layout, locals: { error_message: nil } }
  33. end
  34. post '/login' do
  35. username = params[:username]
  36. password = params[:password]
  37. cookie = login(username, password)
  38. if cookie.nil?
  39. erb :login,
  40. { layout: :layout, locals: { error_message: 'Invalid credentials' } }
  41. else
  42. session['user_id'] = username
  43. redirect '/'
  44. end
  45. end
  46. post '/logout' do
  47. session['user_id'] = nil
  48. redirect '/'
  49. end
  50. helpers do
  51. def build_urls(params)
  52. current_page = params[:page].to_i
  53. previous_page = current_page > 1 ? current_page - 1 : nil
  54. next_page = current_page + 1
  55. url_params = { q: params[:q], type: params[:type] }
  56. url_params[:username] = params[:username] if params[:username]
  57. [previous_page, next_page].map do |page|
  58. URI::Generic.build(
  59. path: '/search',
  60. query: URI.encode_www_form(url_params.merge(page: page))
  61. )
  62. end
  63. end
  64. def current_user
  65. session['user_id']
  66. end
  67. def signed_in?
  68. !!session['user_id']
  69. end
  70. end
  71. run! if __FILE__ == $0
  72. end