-
Notifications
You must be signed in to change notification settings - Fork 0
/
adserver.rb
123 lines (107 loc) · 2.47 KB
/
adserver.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
require 'sinatra'
require 'dm-core'
require 'dm-timestamps'
require 'dm-migrations'
require_relative 'lib/authorization'
DataMapper::setup(:default,"sqlite3://#{Dir.pwd}/db/adserver.db")
DataMapper::Model.raise_on_save_failure = true
DataMapper.auto_upgrade!
# helpers keep the namespace clean
helpers do
include Sinatra::Authorization
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
end
class Click
include DataMapper::Resource
property :id, Serial
property :ip_address, String
property :created_at, DateTime
belongs_to :ad
end
get "/" do
@page_title="default page"
erb :landing_page
end
get "/new" do
require_admin
@page_title="Create a New Ad"
erb :new
end
post "/create" do
require_admin
@page_title = "create new ad"
ad = Ad.new(params[:ad])
ad.content_type = params[:image][:type]
ad.size = File.size(params[:image][:tempfile])
ad.filename = params[:image][:filename]
if ad.save
upload_file = params[:image][:tempfile];
path_to_save = File.join(Dir.pwd, "/public/ads",ad.filename);
File.open(path_to_save,"wb") do |f|
f.write(upload_file.read)
end
redirect("/show/#{ad.id}");
else
redirect('/list');
end
end
get "/show/:id" do
require_admin
@page_title = "show Ad"
@ad = Ad.get(params[:id])
if @ad
erb :show
else
redirect('/list')
end
end
get "/list" do
require_admin
@page_title = "List Ads"
@ads = Ad.all(:order=>[:created_at.desc])
erb :list
end
get "/delete/:id" do
require_admin
ad = Ad.get(params[:id])
unless ad.nil?
path = File.join(Dir.pwd,"/public/ads",ad.filename)
begin
File.delete(path)
puts "ad deleted at "+path
rescue
puts "file at "+path+" not found"
ensure
ad.destroy
puts "record deleted "+ad.to_s
end
end
redirect('/list')
end
get "/ad" do
id = repository(:default).adapter.query(
'select id from ads order by random() limit 1;'
)
@ad = Ad.get(id)
erb :ad , :layout => false
end
get "/click/:id" do
ad = Ad.get(params[:id])
ad.clicks.create(:ip_address=>env["REMOTE_ADDR"])
redirect(ad.url)
end