-
Notifications
You must be signed in to change notification settings - Fork 95
/
main.rb
125 lines (101 loc) · 2.74 KB
/
main.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
require 'rubygems'
require 'sinatra'
$LOAD_PATH.unshift File.dirname(__FILE__) + '/vendor/sequel'
require 'sequel'
configure do
Sequel.connect(ENV['DATABASE_URL'] || 'sqlite://blog.db')
require 'ostruct'
Blog = OpenStruct.new(
:title => 'a scanty blog',
:author => 'John Doe',
:url_base => 'http://localhost:4567/',
:admin_password => 'changeme',
:admin_cookie_key => 'scanty_admin',
:admin_cookie_value => '51d6d976913ace58',
:disqus_shortname => nil
)
end
error do
e = request.env['sinatra.error']
puts e.to_s
puts e.backtrace.join("\n")
"Application error"
end
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/lib')
require 'post'
helpers do
def admin?
request.cookies[Blog.admin_cookie_key] == Blog.admin_cookie_value
end
def auth
stop [ 401, 'Not authorized' ] unless admin?
end
end
layout 'layout'
### Public
get '/' do
posts = Post.reverse_order(:created_at).limit(10)
erb :index, :locals => { :posts => posts }, :layout => false
end
get '/past/:year/:month/:day/:slug/' do
post = Post.filter(:slug => params[:slug]).first
stop [ 404, "Page not found" ] unless post
@title = post.title
erb :post, :locals => { :post => post }
end
get '/past/:year/:month/:day/:slug' do
redirect "/past/#{params[:year]}/#{params[:month]}/#{params[:day]}/#{params[:slug]}/", 301
end
get '/past' do
posts = Post.reverse_order(:created_at)
@title = "Archive"
erb :archive, :locals => { :posts => posts }
end
get '/past/tags/:tag' do
tag = params[:tag]
posts = Post.filter(:tags.like("%#{tag}%")).reverse_order(:created_at).limit(30)
@title = "Posts tagged #{tag}"
erb :tagged, :locals => { :posts => posts, :tag => tag }
end
get '/feed' do
@posts = Post.reverse_order(:created_at).limit(20)
content_type 'application/atom+xml', :charset => 'utf-8'
builder :feed
end
get '/rss' do
redirect '/feed', 301
end
### Admin
get '/auth' do
erb :auth
end
post '/auth' do
set_cookie(Blog.admin_cookie_key, Blog.admin_cookie_value) if params[:password] == Blog.admin_password
redirect '/'
end
get '/posts/new' do
auth
erb :edit, :locals => { :post => Post.new, :url => '/posts' }
end
post '/posts' do
auth
post = Post.new :title => params[:title], :tags => params[:tags], :body => params[:body], :created_at => Time.now, :slug => Post.make_slug(params[:title])
post.save
redirect post.url
end
get '/past/:year/:month/:day/:slug/edit' do
auth
post = Post.filter(:slug => params[:slug]).first
stop [ 404, "Page not found" ] unless post
erb :edit, :locals => { :post => post, :url => post.url }
end
post '/past/:year/:month/:day/:slug/' do
auth
post = Post.filter(:slug => params[:slug]).first
stop [ 404, "Page not found" ] unless post
post.title = params[:title]
post.tags = params[:tags]
post.body = params[:body]
post.save
redirect post.url
end