diff options
| author | yo mama <pepper@scannerjammer.com> | 2015-02-02 20:29:31 -0800 |
|---|---|---|
| committer | yo mama <pepper@scannerjammer.com> | 2015-02-02 20:29:31 -0800 |
| commit | d7ebb35b53c2f3e0ae8a609e9c9cc4bb9aa9ccd6 (patch) | |
| tree | fe99a2302f90e071b524b1feb53b0af786d5c0b3 /dancr.pl | |
first
Diffstat (limited to 'dancr.pl')
| -rw-r--r-- | dancr.pl | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/dancr.pl b/dancr.pl new file mode 100644 index 0000000..0d8d501 --- /dev/null +++ b/dancr.pl @@ -0,0 +1,120 @@ +use Dancer; +use DBI; +use File::Spec; +use File::Slurp; +use Template; + +print STDERR "firing up server...\n"; +set 'database' => './database/dancr.db'; +set 'session' => 'Simple'; +set 'template' => 'template_toolkit'; +set 'logger' => 'console'; +set 'log' => 'debug'; +set 'show_errors' => 1; +set 'access_log' => 1; +set 'warnings' => 1; +set 'username' => 'username'; +set 'password' => 'password'; +set 'layout' => 'main'; + +#CONSTANTS +my $SITE_NAME = 'Demo'; +my $SCHEMAFILE = './database/schema.sql'; +my $FORM_CSS = 'css/simple-form.css'; +my $flash; + +sub set_flash { + my $message = shift; + + $flash = $message; +} + +sub get_flash { + + my $msg = $flash; + $flash = ""; + + return $msg; +} + +sub connect_db { + my $dbh = DBI->connect("dbi:SQLite:dbname=".setting('database')) or + die $DBI::errstr; + + return $dbh; +} + +sub init_db { + my $db = connect_db(); + my $schema = read_file($SCHEMAFILE); + $db->do($schema) or die $db->errstr; +} + +before_template sub { + my $tokens = shift; + $tokens->{'site_name'} = $SITE_NAME; + $tokens->{'css_url'} = request->base . $FORM_CSS; + $tokens->{'login_url'} = uri_for('/login'); + $tokens->{'logout_url'} = uri_for('/logout'); +}; + +get '/' => sub { + my $db = connect_db(); + my $sql = 'select id, date, title, text from entries order by id desc'; + my $sth = $db->prepare($sql) or die $db->errstr; + $sth->execute or die $sth->errstr; + template 'show_entries.tt', { + 'msg' => get_flash(), + 'add_entry_url' => uri_for('/add'), + 'entries' => $sth->fetchall_hashref('id'), + }; +}; + +post '/add' => sub { + if ( not session('logged_in') ) { + send_error("Not logged in", 401); + } + + my $db = connect_db(); + my $sql = 'insert into entries (date, title, text) values (?, ?, ?)'; + my $sth = $db->prepare($sql) or die $db->errstr; + $sth->execute(time(), params->{'title'}, params->{'text'}) or die $sth->errstr; + + set_flash('New entry posted!'); + redirect '/'; +}; + +any ['get', 'post'] => '/login' => sub { + my $err; + + if ( request->method() eq "POST" ) { + # process form input + if ( params->{'username'} ne setting('username') ) { + $err = "Invalid username"; + } + elsif ( params->{'password'} ne setting('password') ) { + $err = "Invalid password"; + } + else { + session 'logged_in' => true; + set_flash('You are logged in.'); + redirect '/'; + } + } + + # display login form + template 'login.tt', { + 'err' => $err, + }; + +}; + +get '/logout' => sub { + session->destroy; + set_flash('You are logged out.'); + redirect '/'; +}; + +init_db(); +start; + |
