From d7ebb35b53c2f3e0ae8a609e9c9cc4bb9aa9ccd6 Mon Sep 17 00:00:00 2001 From: yo mama Date: Mon, 2 Feb 2015 20:29:31 -0800 Subject: first --- dancr.pl | 120 +++++++++++++++++++++++++++++++++++++++++++++ database/dancr.db | Bin 0 -> 3072 bytes database/schema.sql | 6 +++ logs/development.log | 0 public/css/simple-form.css | 57 +++++++++++++++++++++ views/layouts/main.tt | 23 +++++++++ views/login.tt | 11 +++++ views/show_entries.tt | 23 +++++++++ 8 files changed, 240 insertions(+) create mode 100644 dancr.pl create mode 100644 database/dancr.db create mode 100644 database/schema.sql create mode 100644 logs/development.log create mode 100644 public/css/simple-form.css create mode 100644 views/layouts/main.tt create mode 100644 views/login.tt create mode 100644 views/show_entries.tt 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; + diff --git a/database/dancr.db b/database/dancr.db new file mode 100644 index 0000000..dc977eb Binary files /dev/null and b/database/dancr.db differ diff --git a/database/schema.sql b/database/schema.sql new file mode 100644 index 0000000..2bd7916 --- /dev/null +++ b/database/schema.sql @@ -0,0 +1,6 @@ +create table if not exists entries ( + id integer primary key autoincrement, + date date not null, + title string not null, + text string not null +); diff --git a/logs/development.log b/logs/development.log new file mode 100644 index 0000000..e69de29 diff --git a/public/css/simple-form.css b/public/css/simple-form.css new file mode 100644 index 0000000..0cc6218 --- /dev/null +++ b/public/css/simple-form.css @@ -0,0 +1,57 @@ +body { +font-family: sans-serif; +} +a, h1, h2 { +color: gray; +} +h1, h2 { +font-family: 'Georgia', serif; +margin: 0; +} +h1 { +border-bottom: 1px solid black; +} +h2 { +font-size: 1.2em; +} +.page { +margin: 2em auto; +width: 35em; +border: 1px solid black; +padding: 0.8em; +background: white; +} +.entries { +list-style: none; +margin: 0; +padding: 0; +border-bottom: 1px solid black; +} +.entries li { +margin: 0.8em 1.2em; +} +.entries li h2 { +margin-left: -1em; +} +.add-entry { +font-size: 0.9em; +border-bottom: 1px solid black; +} +.add-entry dl { +font-weight: bold; +} +.login_logout { +text-align: right; +font-size: 0.8em; +padding: 0.3em; +margin-bottom: 1em; +} +.flash { +background: whitesmoke; +padding: 0.5em; +border: 1px solid black; +} +.error { +background: indianred; +padding: 0.5em; +} diff --git a/views/layouts/main.tt b/views/layouts/main.tt new file mode 100644 index 0000000..2bc5ad8 --- /dev/null +++ b/views/layouts/main.tt @@ -0,0 +1,23 @@ + + + +<% site_name %> + + + +
+<% IF not session.logged_in %> + log in +<% ELSE %> + log out +<% END %> +
+
+

<% site_name %>

+ <% IF msg %> +
<% msg %>
+ <% END %> + <% content %> +
+ + diff --git a/views/login.tt b/views/login.tt new file mode 100644 index 0000000..617687a --- /dev/null +++ b/views/login.tt @@ -0,0 +1,11 @@ +

Login

+ <% IF err %>

Error: <% err %><% END %> +

+
+
Username: +
+
Password: +
+
+
+
diff --git a/views/show_entries.tt b/views/show_entries.tt new file mode 100644 index 0000000..9de4fae --- /dev/null +++ b/views/show_entries.tt @@ -0,0 +1,23 @@ + <% IF session.logged_in %> +
+
+
Title: +
+
Text: +
+
+
+
+ <% END %> + -- cgit v1.2.3-70-g09d2