Skip to content

Instantly share code, notes, and snippets.

@ksiomelo
Last active December 29, 2015 10:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ksiomelo/7656296 to your computer and use it in GitHub Desktop.
Save ksiomelo/7656296 to your computer and use it in GitHub Desktop.
class App
module Helpers
def require_auth
unless session[:user_id]
flash[:error] = "You need to be logged in."
redirect to("/login")
end
end
def current_user
@current_user ||= User.find_by_id(session[:user_id]) if session[:user_id]
end
def partial(name, options={})
haml("_#{name.to_s}".to_sym, options.merge(:layout => false))
end
end
end
class App < Sinatra::Base
register Sinatra::CrossOrigin # cross origin helper (for tracker)
register Sinatra::Flash # Flash messages extensions
register Sinatra::FormKeeper # Form helpers
# SERVER CONFIG
use Rack::MethodOverride
use Rack::Session::Cookie , :secret => (ENV['SESSION_SECRET'] || "82e042cd6fde2bf1764f777236db799e")
set :port, 9292
set :views, Proc.new { File.join(root, "app/views") } # set views directory
enable :sessions # for flash messages
# APPLICATION LOAD
Dir.glob(File.dirname(__FILE__) + '/app/helpers/*', &method(:require)) # load helpers
Dir.glob(File.dirname(__FILE__) + '/app/routes/*', &method(:require)) # load routes
Dir.glob(File.dirname(__FILE__) + '/app/models/*.rb', &method(:require)) # load models
helpers App::Helpers
# ROUTES
register Sinatra::SessionRoutes
register Sinatra::TrackerRoutes
register Sinatra::UserRoutes
register Sinatra::SiteRoutes
######################################################################
# Base
######################################################################
# Homepage
get '/' do
require_auth
redirect to("/user/#{current_user.mongo_id}")
end
end
require 'sinatra/base'
######################################################################
# Session Routes
######################################################################
module Sinatra
module SessionRoutes
def self.registered(app)
######################################################################
# Authentication
######################################################################
# LOGIN
app.get '/login' do
if current_user.nil?
haml :login, :layout => :layout_not_logged
else
redirect to("/home")
end
end
app.post '/login' do
# validate parameters
form do
field :email, :present => true, :email => true
field :password, :present => true
end
if form.failed?
flash[:notice] = "Please enter both e-mail and password"
haml :login, :layout => :layout_not_logged
else
authorized_user = User.authenticate(params[:email],params[:password])
if authorized_user
# update session / redirect
session[:user_id] = authorized_user.mongo_id.to_s
session.options[:expire_after] = 2592000 unless params[:remember].nil? # 30 days
# session[:redirect_url] = nil
# redirect to the wizard
flash[:info] = "Welcome back #{authorized_user.first_name}"
redirect to("/home")
else
flash[:error] = "Invalid Username or Password"
output = haml :login, :layout => :layout_not_logged
fill_in_form(output)
end
end
end
## SIGNUP
# displays the registration page
app.get '/signup' do
if not current_user.nil? # user currently logged in, redirect to his/her page
redirect to("/home")
else
haml :signup, :layout => :layout_not_logged
end
end
# Creates a new user
app.post '/signup' do
# validate parameters
form do
# filters :strip, :my_filter
field :first_name, :present => true
field :last_name, :present => true
# field :birthday, :present => true
field :email, :present => true, :email => true, :bytesize => 10..255
field :password, :present => true, :length => 6..18
field :password_confirmation, :present => true, :length => 6..18
same :same_password, [:password, :password_confirmation]
end
if form.failed?
flash[:error] = "Validation error"
output = haml :signup, :layout => :layout_not_logged
fill_in_form(output)
else
# save user
begin
user = User.create(params)
# update session / redirect
session[:user_id] = user.mongo_id.to_s
session[:redirect_url] = nil
# redirect to the wizard
flash[:info] = "You are registered!"
redirect to("/home")
rescue InvalidParameterException => e
flash[:error] = "Validation error: "+e.data
output = haml :signup, :layout => :layout_not_logged
fill_in_form(output)
end
end
end
app.get '/auth/failure/?' do
raise 'auth error'
end
app.get '/logout/?' do
session.clear
redirect to('/')
end
end
end
end
require 'sinatra/base'
######################################################################
# Users Routes
######################################################################
module Sinatra
module SiteRoutes
def self.registered(app)
# new site
app.get '/site/new' do
haml :'/site/new'
end
# create site
app.post '/site' do
require_auth
# validate parameters
form do
# filters :strip, :my_filter
field :name, :present => true
field :url, :present => true, :uri => [:http, :https], :bytesize => 10..255
end
if form.failed?
flash[:notice] = "Please enter both name and url"
haml :'/users/home'
else
site = Site.create(current_user.mongo_id, params)
site.generate_access_key(current_user.mongo_id)
session[:site_id] = site.mongo_id.to_s
haml :'/site/index', :locals => {:site => site}
end
end
# delete site
app.delete '/site/:id' do
require_auth
Site.delete(current_user.mongo_id, params[:id])
redirect to("home")
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment