123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- 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
- full_count, records = results[:results]
- params[:current_count] = records.to_a.size
- params[:full_count] = full_count
- previous_url, next_url = build_urls(params)
-
- locals =
- params.merge(
- results: records,
- 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]
- url_params[:exact_match] = params[:exact_match] if params[:exact_match]
-
- [
- 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)
- "<a href=\"#{url}\" target=\"_blank\">#{text}</a>"
- end
-
- def truncate(s)
- Truncato.truncate(s, max_length: 500)
- end
- end
- end
|