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

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