-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathadserver.rb
More file actions
127 lines (104 loc) · 2.35 KB
/
adserver.rb
File metadata and controls
127 lines (104 loc) · 2.35 KB
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
125
126
127
require 'rubygems'
require 'sinatra'
require 'sqlite3'
require 'dm-core'
require 'dm-timestamps'
require 'dm-aggregates'
require './lib/authorization'
configure :development do
DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/adserver.db")
end
class Ad
include DataMapper::Resource
property :id, Serial
property :title, String
property :content, Text
property :width, Integer
property :height, Integer
property :filename, String
property :url, String
property :is_active, Boolean
property :created_at, DateTime
property :updated_at, DateTime
property :size, Integer
property :content_type, String
has n, :clicks
def handle_upload( file )
self.content_type = file[:type]
self.size = File.size(file[:tempfile])
path = File.join(Dir.pwd, "/public/ads", self.filename)
File.open(path, "wb") do |f|
f.write(file[:tempfile].read)
end
end
end
class Click
include DataMapper::Resource
property :id, Serial
property :ip_address, String
property :created_at, DateTime
belongs_to :ad
end
configure :development do
# Create or upgrade all tables at once, like magic
DataMapper.auto_upgrade!
end
# set utf-8 for outgoing
before do
headers "Content-Type" => "text/html; charset=utf-8"
end
helpers do
include Sinatra::Authorization
end
get '/' do
erb :index
end
get '/ad' do
id = repository(:default).adapter.select(
'SELECT id FROM ads ORDER BY random() LIMIT 1;'
)
@ad = Ad.get(id)
erb :ad
end
get '/click/:id' do
ad = Ad.get(params[:id])
ad.clicks.create(:ip_address => env["REMOTE_ADDR"])
redirect(ad.url)
end
get '/show/:id' do
@ad = Ad.get(params[:id])
if @ad
erb :show
else
redirect('/list')
end
end
get '/new' do
require_admin
@page_title = "New Ad"
erb :new
end
post '/create' do
require_admin
@ad = Ad.new(params[:ad])
@ad.handle_upload(params[:image])
if @ad.save
redirect "/show/#{@ad.id}"
else
redirect('/list')
end
end
get '/delete/:id' do
require_admin
ad = Ad.get(params[:id])
path = File.join(Dir.pwd, "/public/ads", ad.filename)
File.delete(path)
ad.delete unless ad.nil?
redirect('/list')
end
get '/list' do
require_admin
@page_title = "List Ads"
@ads = Ad.all(:order => [:created_at.desc])
erb :list
end