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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. redirect '/' if signed_in?
  33. erb :login, { layout: :layout, locals: { error_message: nil } }
  34. end
  35. post '/login' do
  36. redirect '/' if signed_in?
  37. username = params[:username]
  38. password = params[:password]
  39. cookie = login(username, password)
  40. if cookie.nil?
  41. erb :login,
  42. { layout: :layout, locals: { error_message: 'Invalid credentials' } }
  43. else
  44. session['user_id'] = username
  45. redirect '/'
  46. end
  47. end
  48. post '/logout' do
  49. session['user_id'] = nil
  50. redirect '/'
  51. end
  52. helpers do
  53. def build_urls(params)
  54. current_page = params[:page].to_i
  55. previous_page = current_page > 1 ? current_page - 1 : nil
  56. next_page = current_page + 1
  57. url_params = { q: params[:q], type: params[:type] }
  58. url_params[:username] = params[:username] if params[:username]
  59. [previous_page, next_page].map do |page|
  60. URI::Generic.build(
  61. path: '/search',
  62. query: URI.encode_www_form(url_params.merge(page: page))
  63. )
  64. end
  65. end
  66. def current_user
  67. session['user_id']
  68. end
  69. def signed_in?
  70. !!session['user_id']
  71. end
  72. def external_link(url, text)
  73. "<a href=\"#{url}\" target=\"_blank\">#{text}</a>"
  74. end
  75. end
  76. run! if __FILE__ == $0
  77. end