7 use Dancer
::Plugin
::Database
;
10 use Dancer
::Plugin
::FlashMessage
;
14 set
'session' => 'Simple';
15 set
'template' => 'template_toolkit';
16 set
'logger' => 'console';
18 set
'show_errors' => 1;
19 set
'access_log' => 1;
28 $tokens->{'css_url'} = request
->base . 'css/style.css';
29 $tokens->{'login_url'} = uri_for
('/login');
30 $tokens->{'logout_url'} = uri_for
('/logout');
31 $tokens->{'showall_url'} = uri_for
('/showall');
32 $tokens->{'vote_url'} = uri_for
('/vote');
33 $tokens->{'register_url'} = uri_for
('/register');
34 $tokens->{'add_url'} = uri_for
('/add');
35 $tokens->{'changepass_url'} = uri_for
('/changepass');
36 $tokens->{'showpopulardesc_url'} = uri_for
('/showpopular-desc');
37 $tokens->{'showpopularasc_url'} = uri_for
('/showpopular-asc');
42 if (! session
('user') &&
43 request
->path_info !~ m{^/(login|register|showall|showpopular.*)}
45 var requested_path
=> request
->path_info;
46 request
->path_info('/login');
51 template
'login', { path
=> vars
->{requested_path
} };
54 post
'/login' => sub {
55 my $user = database
('users')->prepare(
56 'select * from users where username = ?',
58 $user->execute(params
->{username
});
59 my $userdata = $user->fetchrow_hashref();
61 flash error
=> "Failed login for unrecognised user "
62 . params
->{username
}.'.';
63 redirect uri_for
('/login');
65 if ($userdata->{password
} eq params
->{password
})
67 session user
=> $user;
68 session uid
=> $userdata->{'id'};
69 session username
=> $userdata->{'username'};
70 redirect params
->{path
} || uri_for
('/showall');
72 flash error
=> 'Login failed - password incorrect for <span class="username">' . params
->{username
}.'</span>.';
73 redirect uri_for
('/login');
78 get
'/logout' => sub {
80 flash error
=> 'You are logged out.';
81 redirect uri_for
('/showall');
84 get
'/register' => sub {
85 template
'register', { path
=> params
->{'path'} };
88 post
'/register' => sub {
89 if (params
->{'username'} =~ m/\W/){
90 flash error
=> 'Please use only [A-Za-z0-9] in the username. Thank you.';
91 redirect uri_for
('/register');
94 if (params
->{'username'} eq ''){
95 flash error
=> 'Please set a username when registering. Thank you.';
96 redirect uri_for
('/register');
99 if (params
->{'email'} eq ''){
100 flash error
=> 'Please set an email when registering. This will be used for password recoveries only. Thank you.';
101 redirect uri_for
('/register');
105 # Check if username is taken.
106 my $username = database
('users')->selectall_arrayref(
107 'select * from users where username = ?',{},params
->{'username'});
109 flash error
=> 'Error: username in already in use.';
110 redirect uri_for
('/register');
113 my $user = database
('users')->do(
114 "insert into users values(NULL, ?, ?, ?, ?, ?, ?)",{},
115 (params
->{'username'},
116 params
->{'password'},
120 params
->{'fullname'})
122 flash error
=> 'Registration of user <span class="username">'.
123 params
->{username
}.'</span> successful.';
124 template
'login', { username
=> (params
->{'username'}),
125 password
=> (params
->{'password'}),
126 path
=> (params
->{'path'})
131 get
'/show/:id' => sub {
132 my $hash_ref = database
('questions')->selectrow_hashref
133 ('select id, title, text, type, hits from entries where id = ?', {}, params
->{id
});
134 my $hash_ref2 = database
('questions')->selectall_hashref
135 ('select id,content,qid,hits from answers where qid = ?','id',{},params
->{id
});
136 my $user_hit = database
('users')->selectrow_hashref
137 ('select hit from users where id = ?', {}, session
('uid'));
138 my $hit = $user_hit->{'hit'};
139 my $id = scalar(params
->{'id'});
140 my $matches = $hit =~ /$id/; # voted yet ?
141 template
'show_entry', {
143 title
=> $hash_ref->{'title'},
144 type
=> $hash_ref->{'type'},
145 text
=> $hash_ref->{'text'},
146 hits
=> $hash_ref->{'hits'},
147 answers
=> $hash_ref2,
153 get
'/showall' => sub {
154 my $sql = 'select id, title, text from entries order by id desc';
155 my $sth = database
('questions')->prepare($sql)
156 or die database
('questions')->errstr;
157 $sth->execute or die $sth->errstr;
159 'add_entry_url' => uri_for
('/add'),
160 'entries' => $sth->fetchall_hashref('id'),
164 get
'/showpopular-desc' => sub {
165 my $hash = database
('questions')->selectall_arrayref
166 ('select id, title, text, hits from entries order by hits desc');
167 template
'show-desc', {
173 get
'/showpopular-asc' => sub {
174 my $hash = database
('questions')->selectall_arrayref
175 ('select id, title, text, hits from entries order by hits asc');
176 template
'show-asc', {
181 post
'/vote' => sub {
182 my $answer_type = ref(\
(params
->{'value'}));
183 if ($answer_type eq 'REF') {
184 my @values = @
{params
->{'value'}};
186 foreach $value (@values){
187 database
('questions')->do
188 ("UPDATE answers SET hits = hits + 1 WHERE id = ?",{},$value);
191 if ($answer_type eq 'SCALAR'){
192 database
('questions')->do
193 ("UPDATE answers SET hits = hits + 1 WHERE id = ?",{},params
->{'value'});
195 # User hit this question.
196 database
('questions')->do
197 ("UPDATE entries SET hits = hits + 1 WHERE id = ?",{},params
->{'qid'});
199 database
('users')->do
200 ("UPDATE users SET hit = hit || ' ' || ? WHERE id = ?",{},(
204 redirect uri_for
('/show/'.params
->{'qid'});
212 if (params
->{'title'} eq ""){
213 flash error
=> 'Error: empty title.';
214 redirect uri_for
('/add');
216 if (params
->{'content'} eq ''){
217 flash error
=> 'Error: empty content.';
218 redirect uri_for
('/add');
220 if (params
->{'answers'} eq ''){
221 flash error
=> 'Error: no answers given.';
222 redirect uri_for
('/add');
224 database
('questions')->do
225 ("insert into entries values(NULL, ?, ?, ?, ?, 0)",{},(
232 my $qid = database
('questions')->last_insert_id("",database
('questions'),'entries','id');
233 #my $qid = (database('questions')->selectrow_hashref
234 # ("select id from entries where text = ?",{},params->{'content'}))->{'id'};
236 foreach $answer_choice (split /\n/, params
->{'answers'}){
237 $answer_choice =~ s/\n//;
238 $answer_choice =~ s/\r//;
239 database
('questions')->do
240 ("insert into answers values(NULL,?, ?, 0)",{},(
245 redirect uri_for
("show/$qid");
247 get
'/changepass' => sub {
248 template
'changepass';
251 post
'/changepass' => sub {
252 if (!(params
->{"newpassword"} eq params
->{"newpassword2"})){
253 flash error
=> "New passwords mismatch.";
254 redirect uri_for
('/changepass');
257 database
('users')->do
258 ("update users set password = ? where id = ?",{},
259 (params
->{'newpassword'},session
('uid'))
261 flash error
=> "Password updated successfully.";
262 redirect uri_for
('/changepass');