Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Simple Dancer app that just allows users to register, log in and log …

…out.
  • Loading branch information...
commit de0198bcf5eb3f7cd55e7934c566da6e084d3cd3 1 parent f750bc6
@davorg authored
View
1  Build.PL
@@ -9,6 +9,7 @@ my $build = Module::Build->new(
Moose => 0,
YAML => 0,
Dancer => 1,
+ Dancer::Plugin::DBIC => 0,
MooseX::MarkAsMethods => 0,
MooseX::NonMoose => 0,
DBIx::Class::EncodedColumn => 0,
View
19 config.yml
@@ -18,11 +18,18 @@ charset: "UTF-8"
# simple: default and very basic template engine
# template_toolkit: TT
-template: "simple"
+# template: "simple"
-# template: "template_toolkit"
-# engines:
-# template_toolkit:
-# start_tag: '[%'
-# end_tag: '%]'
+template: "template_toolkit"
+engines:
+ template_toolkit:
+ start_tag: '[%'
+ end_tag: '%]'
+session: "simple"
+
+plugins:
+ DBIC:
+ default:
+ dsn: dbi:mysql:dbname=lystyng
+ schema_class: Lystyng::Schema
View
1  db/lystyng.sql
@@ -1,6 +1,7 @@
create table `user` (
id integer primary key auto_increment,
username varchar(20) not null,
+ name varchar(100) not null,
email varchar(200) not null,
password char(64) not null
) ENGINE=INNODB CHARSET=utf8;
View
66 lib/Lystyng.pm
@@ -8,9 +8,73 @@ package Lystyng;
use Dancer ':syntax';
our $VERSION = '0.0.1';
+use Dancer::Plugin::DBIC qw[schema resultset];
+
+$ENV{LYSTYNG_DB_USER} && $ENV{LYSTYNG_DB_PASS}
+ or die 'Must set LYSTYNG_DB_USER and LYSTYNG_DB_PASS';
+
+my $cfg = setting('plugins');
+$cfg->{DBIC}{default}{user} = $ENV{LYSTYNG_DB_USER};
+$cfg->{DBIC}{default}{pass} = $ENV{LYSTYNG_DB_PASS};
+
get '/' => sub {
- template 'index';
+ template 'index';
+};
+
+get '/register' => sub {
+ template 'register';
+};
+
+post '/register' => sub {
+ my $user_rs = resultset('User');
+ my @errors;
+ if (param('password') ne param('password2')) {
+ push @errors, 'Your passwords do not match.';
+ }
+ my ($user) = $user_rs->find({ username => param('username') });
+ if ($user) {
+ push @errors, 'Username ' . $user->username . ' is already in use.';
+ };
+
+ if (@errors) {
+ template 'register', {
+ errors => \@errors,
+ };
+ } else {
+ $user = $user_rs->create({
+ username => param('username'),
+ name => param('name'),
+ email => param('email'),
+ password => param('password'),
+ });
+
+ session user => $user;
+
+ redirect '/';
+ }
+};
+
+get '/login' => sub {
+ template 'login';
+};
+
+post '/login' => sub {
+ my $user_rs = resultset('User');
+ my ($user) = $user_rs->find({ username => param('username') });
+ if ($user && $user->check_password(param('password'))) {
+ session user => $user;
+ redirect '/';
+ } else {
+ template 'login', {
+ error => 1,
+ };
+ }
+};
+
+get '/logout' => sub {
+ session user => undef;
+ redirect '/';
};
true;
View
12 lib/Lystyng/Schema/Result/User.pm
@@ -50,6 +50,12 @@ __PACKAGE__->table("user");
is_nullable: 0
size: 20
+=head2 name
+
+ data_type: 'varchar'
+ is_nullable: 0
+ size: 100
+
=head2 email
data_type: 'varchar'
@@ -73,6 +79,8 @@ __PACKAGE__->add_columns(
{ data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
"username",
{ data_type => "varchar", is_nullable => 0, size => 20 },
+ "name",
+ { data_type => "varchar", is_nullable => 0, size => 100 },
"email",
{ data_type => "varchar", is_nullable => 0, size => 200 },
"password",
@@ -117,8 +125,8 @@ __PACKAGE__->has_many(
);
-# Created by DBIx::Class::Schema::Loader v0.07039 @ 2014-01-30 20:20:50
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:dOskylIQblron+9s87lFpw
+# Created by DBIx::Class::Schema::Loader v0.07039 @ 2014-01-31 21:09:46
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:hqwt5y89b3BUVwXtE8rwag
# You can replace this text with custom code or comments, and it will be preserved on regeneration
View
153 views/index.tt
@@ -1,148 +1,5 @@
-
-<!--
- Credit goes to the Ruby on Rails team for this page
- has been heavily based on the default Rails page that is
- built with a scaffolded application.
-
- Thanks a lot to them for their work.
-
- See Ruby on Rails if you want a kickass framework in Ruby:
- http://www.rubyonrails.org/
--->
-
-<div id="page">
- <div id="sidebar">
- <ul id="sidebar-items">
- <li>
- <h3>Join the community</h3>
- <ul class="links">
-
- <li><a href="http://perldancer.org/">PerlDancer</a></li>
- <li><a href="http://twitter.com/PerlDancer/">Official Twitter</a></li>
- <li><a href="https://github.com/PerlDancer/Dancer/">GitHub Community</a></li>
- </ul>
- </li>
-
- <li>
- <h3>Browse the documentation</h3>
-
- <ul class="links">
- <li><a
- href="http://search.cpan.org/dist/Dancer/lib/Dancer/Introduction.pod">Introduction</a></li>
- <li><a href="http://search.cpan.org/dist/Dancer/lib/Dancer/Cookbook.pod">Cookbook</a></li>
- <li><a href="http://search.cpan.org/dist/Dancer/lib/Dancer/Deployment.pod">Deployment Guide</a></li>
- <li><a
- href="http://search.cpan.org/dist/Dancer/lib/Dancer/Tutorial.pod"
- title="a tutorial to build a small blog engine with Dancer">Tutorial</a></li>
- </ul>
- </li>
-
- <li>
- <h3>Your application's environment</h3>
-
- <ul>
- <li>Location: <code>/home/dcross/dev/github/lystyng/Lystyng</code></li>
- <li>Template engine: <code><% settings.template %></code></li>
- <li>Logger: <code><% settings.logger %></code></li>
- <li>Environment: <code><% settings.environment %></code></li>
- </ul>
-
- </li>
- </ul>
-
- </div>
-
- <div id="content">
- <div id="header">
- <h1>Perl is dancing</h1>
- <h2>You&rsquo;ve joined the dance floor!</h2>
- </div>
-
- <div id="getting-started">
- <h1>Getting started</h1>
- <h2>Here&rsquo;s how to get dancing:</h2>
-
- <h3><a href="#" id="about_env_link">About your application's environment</a></h3>
-
- <div id="about-content" style="display: none;">
- <table>
- <tbody>
- <tr>
- <td>Perl version</td>
- <td><tt><% perl_version %></tt></td>
- </tr>
- <tr>
- <td>Dancer version</td>
- <td><tt><% dancer_version %></tt></td>
- </tr>
- <tr>
- <td>Backend</td>
- <td><tt><% settings.apphandler %></tt></td>
- </tr>
- <tr>
- <td>Appdir</td>
- <td><tt>/home/dcross/dev/github/lystyng/Lystyng</tt></td>
- </tr>
- <tr>
- <td>Template engine</td>
- <td><tt><% settings.template %></tt></td>
- </tr>
- <tr>
- <td>Logger engine</td>
- <td><tt><% settings.logger %></tt></td>
- </tr>
- <tr>
- <td>Running environment</td>
- <td><tt><% settings.environment %></tt></td>
- </tr>
- </tbody>
- </table>
- </div>
-
- <script type="text/javascript">
- $('#about_env_link').click(function() {
- $('#about-content').slideToggle('fast', function() {
- // ok
- });
- return( false );
- });
- </script>
-
-
- <ol>
- <li>
- <h2>Tune your application</h2>
-
- <p>
- Your application is configured via a global configuration file,
- <tt>config.yml</tt> and an "environment" configuration file,
- <tt>environments/development.yml</tt>. Edit those files if you
- want to change the settings of your application.
- </p>
- </li>
-
- <li>
- <h2>Add your own routes</h2>
-
- <p>
- The default route that displays this page can be removed,
- it's just here to help you get started. The template used to
- generate this content is located in
- <code>views/index.tt</code>.
- You can add some routes to <tt>lib/Lystyng.pm</tt>.
- </p>
- </li>
-
- <li>
- <h2>Enjoy web development again</h2>
-
- <p>
- Once you've made your changes, restart your standalone server
- (bin/app.pl) and you're ready to test your web application.
- </p>
- </li>
-
- </ol>
- </div>
- </div>
- </div>
+[% IF session.user -%]
+ <p>Welcome [% session.user.name %] [<a href="/logout">Log out</a>]</p>
+[% ELSE %]
+ <p><a href="/login">Log in</a> or <a href="/register">Register</a></p>
+[% END -%]
View
10 views/layouts/main.tt
@@ -2,19 +2,19 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<meta http-equiv="Content-type" content="text/html; charset=<% settings.charset %>" />
+<meta http-equiv="Content-type" content="text/html; charset=[% settings.charset %]" />
<title>Lystyng</title>
-<link rel="stylesheet" href="<% request.uri_base %>/css/style.css" />
+<link rel="stylesheet" href="[% request.uri_base %]/css/style.css" />
<script type="text/javascript">/* <![CDATA[ */
- !window.jQuery && document.write('<script type="text/javascript" src="<% request.uri_base %>/javascripts/jquery.js"><\/script>')
+ !window.jQuery && document.write('<script type="text/javascript" src="[% request.uri_base %]/javascripts/jquery.js"><\/script>')
/* ]]> */</script>
</head>
<body>
-<% content %>
+[% content %]
<div id="footer">
-Powered by <a href="http://perldancer.org/">Dancer</a> <% dancer_version %>
+Powered by <a href="http://perldancer.org/">Dancer</a> [% dancer_version %]
</div>
</body>
</html>
View
10 views/login.tt
@@ -0,0 +1,10 @@
+[% IF error -%]
+<p>That username and/or password is incorrect.</p>
+[% END -%]
+<form method="post" action="/login">
+<table>
+ <tr><th>Username:</th><td><input name="username" value="[% params.username %]"></td></tr>
+ <tr><th>Password:</th><td><input name="password" value="[% params.password %]"></td></tr>
+ <tr><td colspan="2"><input type="submit"></td></tr>
+</table>
+</form>
View
16 views/register.tt
@@ -0,0 +1,16 @@
+[% IF errors -%]
+<ul>
+[% FOREACH error IN errors -%]
+<li>[% error %]</li>
+[% END -%]
+[% END -%]
+<form method="post" action="/register">
+<table>
+ <tr><th>Username:</th><td><input name="username" value="[% params.username %]"></td></tr>
+ <tr><th>Email:</th><td><input name="email" value="[% params.email %]"></td></tr>
+ <tr><th>Name:</th><td><input name="name" value="[% params.name %]"></td></tr>
+ <tr><th>Password:</th><td><input name="password" value="[% params.password %]"></td></tr>
+ <tr><th>Confirm Password:</th><td><input name="password2" value="[% params.password2 %]"></td></tr>
+ <tr><td colspan="2"><input type="submit"></td></tr>
+</table>
+</form>
Please sign in to comment.
Something went wrong with that request. Please try again.