require 'dotenv/load' require 'sequel' require 'sinatra' require_relative '../db/connect' require_relative '../lib/auth' require_relative '../lib/search' class VLVSearch < Sinatra::Base set :sessions, key: ENV['SESSION_KEY'], domain: ENV['SESSION_DOMAIN'], path: '/', expire_after: 14_400, secret: ENV['SESSION_SECRET'] set :environment, ENV['APP_ENV'] == 'production' ? :production : :development set :show_exceptions, ENV['APP_ENV'] == 'development' error 500 do erb :error, { layout: :layout } end get '/' do redirect '/login' unless signed_in? params[:type] = 'threads' erb :index, { locals: params, layout: :layout } end get '/search' do redirect '/login' unless signed_in? params[:type] = 'threads' unless params[:type] params[:page] = 1 unless params[:page] && params[:page].match(/\d+/) params[:page] = params[:page].to_i params[:q] = String.new unless params[:q] params[:username] = String.new unless params[:username] results = search(params) previous_url, next_url = build_urls(params) locals = params.merge( results: results, previous_url: previous_url, next_url: next_url ) erb :results, { locals: locals, layout: :layout } end get '/login' do redirect '/' if signed_in? erb :login, { layout: :layout, locals: { error_message: nil } } end post '/login' do redirect '/' if signed_in? username = params[:username] password = params[:password] cookie = login(username, password) if cookie.nil? erb :login, { layout: :layout, locals: { error_message: 'Invalid credentials' } } else session['user_id'] = username redirect '/' end end post '/logout' do session['user_id'] = nil redirect '/' end helpers do def build_urls(params) current_page = params[:page].to_i previous_page = current_page > 1 ? current_page - 1 : nil next_page = current_page + 1 url_params = { q: params[:q], type: params[:type] } url_params[:username] = params[:username] if params[:username] [previous_page, next_page].map do |page| URI::Generic.build( path: '/search', query: URI.encode_www_form(url_params.merge(page: page)) ) end end def current_user session['user_id'] end def signed_in? !!session['user_id'] end def external_link(url, text) "#{text}" end end run! if __FILE__ == $0 end