require 'dotenv/load' require 'sequel' require 'sinatra' require 'truncato' 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] params[:from_date] = String.new unless params[:from_date] params[:to_date] = String.new unless params[:to_date] params[:exact_match] = String.new unless params[:exact_match] results = search(params) unless results[:errors].empty? erb :results, { locals: {errors: results[:errors]}, layout: :layout } else params[:current_count] = results[:results].to_a.size params[:full_count] = results[:results].empty? ? 0 : results[:results].first[:full_count] previous_url, next_url = build_urls(params) locals = params.merge( results: results[:results], previous_url: previous_url, next_url: next_url, errors: Array.new, ) erb :results, { locals: locals, layout: :layout } end 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 if (params[:current_count] + ((current_page - 1) * RESULTS_PER_PAGE)) == params[:full_count] next_page = nil else next_page = current_page + 1 end url_params = { q: params[:q], type: params[:type] } url_params[:username] = params[:username] if params[:username] url_params[:from_date] = params[:from_date] if params[:from_date] url_params[:to_date] = params[:to_date] if params[:to_date] [ URI::Generic.build( path: '/search', query: URI.encode_www_form(url_params.merge(page: previous_page)) ), next_page.nil? ? nil : URI::Generic.build( path: '/search', query: URI.encode_www_form(url_params.merge(page: next_page)) ), ] end def current_user session['user_id'] end def signed_in? !!session['user_id'] end def external_link(url, text) "#{text}" end def truncate(s) Truncato.truncate(s, max_length: 500) end end end