require 'dotenv/load' require 'sequel' require 'sinatra' require_relative '../lib/auth' require_relative '../lib/search' class VLVSearch < Sinatra::Base enable :sessions 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] = params[:page].to_i 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 erb :login, { layout: :layout, locals: { error_message: nil } } end post '/login' do 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 run! end end