/
main.rb
176 lines (149 loc) · 3.32 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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
require 'sinatra'
require 'active_record'
if ENV['RACK_ENV'] != 'production'
require 'sinatra/reloader'
end
require_relative 'db_config'
require_relative 'models/user'
require_relative 'models/item'
require_relative 'models/purchase'
require 'pg'
enable :sessions
helpers do
def current_user
User.find_by(id: session[:user_id])
end
def logged_in?
!!current_user
end
end
# chronological order
get '/' do
@items = Item.where(sold: false).order(created_at: :desc)
erb :items
end
# closest to me
get '/items' do
@items = Item.where(sold: false).order(created_at: :desc)
erb :items
end
post '/items' do
redirect '/' unless logged_in?
item = Item.new
item.user_id = current_user.id
item.add_params params
item.save
redirect '/items'
end
get '/items/new' do
redirect '/' unless logged_in?
erb :new
end
get '/items/:id' do
@item = Item.find(params[:id])
erb :item
end
delete '/items/:id' do
item = Item.find(params[:id])
if item.user.id == current_user.id
item.destroy
end
redirect '/'
end
get '/items/:id/edit' do
@item = Item.find(params[:id])
redirect '/' unless logged_in? && @item.user.id == current_user.id
erb :edit
end
get '/items/:id/buy' do
redirect '/login' unless logged_in?
@item = Item.find(params[:id])
erb:confirmbuy
end
get '/items/:id/collect' do
redirect '/login' unless logged_in?
item = Item.find(params[:id])
item.collected = true
item.save
redirect '/me'
end
post '/items/:id/buy' do
redirect '/' unless logged_in?
@item = Item.find(params[:id])
@item.sold = true
@item.save
purchase = Purchase.new
purchase.item_id = @item.id
purchase.user_id = current_user.id
purchase.save
# do the purchase
redirect '/'
end
put '/items/:id' do
item = Item.find(params[:id])
item.title = params[:title]
item.description = params[:description]
item.condition = params[:condition]
price = params[:price]
if price.start_with? "$"
price.slice!(0)
end
item.price = price
item.life_span = params[:life_span]
item.latitude = params[:latitude]
item.longitude = params[:longitude]
item.save
redirect '/items'
end
# current user's page
get '/me' do
redirect '/' unless logged_in?
# but not sold
@selling = Item.where(user_id: current_user.id, sold: false)
@sold = Item.where(user_id: current_user.id, sold: true)
@bought = Purchase.where(user_id: current_user.id)
erb :me
end
# logging in
get '/login' do
erb :login
end
get '/signup' do
@user = User.new
@message = ""
erb :signup
end
post '/signup' do
# form validation here, go back to signup with
# message if there's a problem
@user = User.new
name = params[:name].downcase
@user.name = name
@user.email = params[:email]
@user.phone_number = params[:phone_number]
if User.find_by(name: name)
@message = "That username is already taken, please choose another."
erb :signup
else
@user.password = params[:password]
@user.save
session[:user_id] = @user.id
redirect '/items'
end
end
post '/session' do
user = User.find_by(name: params[:username].downcase)
if user && user.authenticate(params[:password])
# authenticated
session[:user_id] = user.id
redirect '/'
else
@message = 'Incorrect username or password'
erb :login
end
end
# logging out
delete '/session' do
session[:user_id] = nil
redirect '/'
end