marano/bgirlz

View on GitHub
lib/controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
require 'net/http'
require 'openssl'
require_relative 'modules'

class Controller < Sinatra::Base

  set :views, 'views'
  set :public_folder, 'public'

  set :protection, :except => :frame_options
  use Rack::MethodOverride
  include Rack::Utils

  include LinkOpener

  get '/featured_pages' do
    Page.random_featured_pages_links.map { |link| link.to_json_hash(request) }.to_json
  end

  get '/' do
    @name = params[:name]
    @middle_initial = params[:middle_initial]
    @last_name = params[:last_name]
    @event = params[:event]
    @events_list = Event.all.sort_by(&:created_at).reverse
    haml :home
  end

  post '/upload' do
    name = params[:name]
    middle_initial = params[:middle_initial]
    last_name = params[:last_name]
    event = params[:event]
    enable_comments = params[:enable_comments]
    content = content_from(params)

    uploaded_page = Page.publish!(name, middle_initial, last_name, event, enable_comments, content)

    if uploaded_page.nil?
      redirect_home_with_input(name, middle_initial, last_name, event)
    else
      redirect uploaded_page.link_to_self(request) + '?first_time=true'
    end
  end

  get '/favicon.ico' do
  end

  get '/list' do
    @events = Event.all.sort_by(&:created_at).reverse + [ EventMissing.new ]
    haml :list
  end

  get '/featured_pages/embedded' do
    @color = params[:color]
    @height = params[:height] || '600px'
    haml :featured_pages_embedded
  end

  not_found do
    "404 Not found"
  end

  post '/events' do
    @event = Event.create!(:name => params[:name])
    haml :_event, :layout => false, :locals => {:event => @event}
  end

  put '/event/:current_name' do
    @event = Event.find_by_name(params[:current_name])
    @event.update_name!(params[:name])
    @event.to_json
  end

  delete '/event/:name' do
     @event = Event.find_by_name(params[:name])
     @event.destroy
     status 204
  end

  get '/event/:name/featured_pages' do
    @event = Event.find_by_name(params[:name])
    haml :event_featured_pages
  end

  get '/event/:name/featured_pages/links' do
    Event.find_by_name(params[:name]).pages.map(&:original_link_page_link).map { |link| link.to_json_hash(request) }.to_json
  end

  get '/*/content' do
    @page = resolve_page_from_path
    add_to_header = erb :_page_header, :layout => false
    add_to_body = erb :_comments, :layout => false
    @page.content
  end

  get '/*/featured' do
    @page = resolve_page_from_path
    haml :_featured, :layout => false
  end

  put '/*/change_event' do
    page = resolve_page_from_path
    page.event = params[:event]
    page.save!
    status 200
  end

  put '/*/update_name' do
    page = resolve_page_from_path
    page.name = params[:name]
    page.middle_initial = params[:middle_initial]
    page.last_name = params[:last_name]
    page.save!
    status 200
  end

  put '/*/favorite' do
    resolve_page_from_path.favorite!
    status 200
  end

  put '/*/unfavorite' do
    resolve_page_from_path.unfavorite!
    status 200
  end

  delete '/*' do
    resolve_page_from_path.destroy
    redirect '/list'
  end

  get '/*/panel' do
    @page = resolve_page_from_path
    erb :_page_info_panel, :layout => false
  end

  get '/*' do
    @first_time = params[:first_time]
    @page = resolve_page_from_path
    add_to_header = erb :_page_header, :layout => false
    add_to_body = erb :_comments, :layout => false
    @page.patched_html add_to_header, add_to_body
  end

  private

  def redirect_home_with_input(name, middle_initial, last_name, event)
    redirect "/?#{name.blank? ? '' : '&name=' + name }#{middle_initial.blank? ? '' : '&middle_initial=' + middle_initial }#{last_name.blank? ? '' : '&last_name=' + last_name }#{event.blank? ? '' : '&event=' + event }"
  end

  def content_from(params)
    link = params[:link]
    page = params[:page]
    html = params[:html]
    return content_from_link(link) unless link.blank?
    return File.read(page[:tempfile].path) unless page.blank?
    return html unless html.blank?
  end

  def resolve_page_from_path
    link = PageLink.by_link "/#{params[:splat].first}"
    unless link.nil?
      page = link.page
    end
    if page.nil?
      raise Sinatra::NotFound
    else
      return page
    end
  end
end