Mojolicious-Command-generate-bootstrap_app
view release on metacpan or search on metacpan
lib/Mojolicious/Command/generate/bootstrap_app.pm view on Meta::CPAN
my $user = $self->model('User')->find({ login => $login });
my $salt = (split '\$', $user->password)[2] if $user;
# no salt, no user
return 0 unless $salt;
if ($user) {
return $user if Crypt::Passwd::XS::unix_sha512_crypt($password, $salt) eq $user->password;
}
else {
return 0;
}
}
1;
@@ example_controller
% my $controller = shift;
% my $class = shift;
package <%= $controller . '::' . $class %>;
use Mojo::Base '<%= $controller %>';
# This action will render a template
sub welcome {
my $self = shift;
$self->render();
}
1;
@@ users_controller
% my $controller = shift;
% my $class = shift;
package <%= $controller . '::' . $class %>;
use Mojo::Base '<%= $controller %>';
use Email::Valid;
use Try::Tiny;
use String::Random;
use Crypt::Passwd::XS 'unix_sha512_crypt';
sub list {
my $self = shift;
$self->render( userlist => [$self->model('User')->all] );
}
sub add {
my $self = shift;
$self->render();
}
sub create {
my $self = shift;
my $record = {};
if ($self->_validate_form){
$record->{login} = $self->_trim($self->param('login'));
$record->{email} = $self->_trim($self->param('email'));
$record->{password} = $self->_encrypt_password($self->param('password'));
$record->{admin} = $self->param('admin') ? 1 : 0;
try {
$self->model('User')->create($record);
}
catch {
$self->flash(class => 'alert alert-danger', message => $_);
$self->redirect_to($self->req->headers->referrer);
};
$self->redirect_to('/users/list');
}
else {
$self->redirect_to($self->req->headers->referrer);
}
}
sub delete {
my $self = shift;
my $user = $self->model('User')->find( $self->stash('id') );
my $login = $user->login;
if ($user->id != $self->session->{user}->{id}){
$user->delete;
$self->flash( class => 'alert alert-info', message => "$login deleted." );
}
else {
$self->flash( class => 'alert alert-danger', message => "You can not delete $login." );
}
$self->redirect_to('/users/list');
}
sub edit {
my $self = shift;
if (defined $self->stash('id')) {
my $user = $self->model('User')->find($self->stash('id'));
if ($user->id == $self->session->{user}->{id} || $self->session->{user}->{admin}) {
$self->render( user => $user );
}
else {
$self->flash( class => 'alert alert-danger', message => 'Not authorized.' );
$self->redirect_to($self->req->headers->referrer);
}
}
else {
$self->flash( class => 'alert alert-danger', message => 'No user given.' );
$self->redirect_to($self->req->headers->referrer);
}
}
sub update {
my $self = shift;
my $record = {};
if ($self->_validate_form){
$record->{login} = $self->_trim($self->param('login'));
$record->{email} = $self->_trim($self->param('email'));
$record->{password} = $self->_encrypt_password($self->param('password'));
$record->{admin} = $self->param('admin') ? 1 : 0;
if (defined $self->param('id')) {
my $user = $self->model('User')->find($self->param('id'));
if ($user->id == $self->session->{user}->{id} || $self->session->{user}->{admin}) {
$record->{id} = $self->param('id');
try {
$self->model('User')->update_or_create($record);
$self->flash(class => 'alert alert-notice', message => 'Updated ' . $user->login);
}
catch {
$self->flash(class => 'alert alert-danger', message => $_);
};
$self->redirect_to($self->session->{user}->{admin} ? '/users/list' : '/');
}
}
else {
$self->flash(class => 'alert alert-danger', message => 'No user given.');
$self->redirect_to($self->session->{user}->{admin} ? '/users/list' : '/');
}
}
else {
$self->redirect_to($self->req->headers->referrer);
}
}
sub _trim {
my ($self, $string) = @_;
$string =~ s/^\s*(.*)\s*$/$1/gmx if defined $string;
return $string
}
sub _validate_form {
my $self = shift;
if ($self->_trim($self->param('login')) !~ /[a-zA-Z]{3,10}/){
$self->flash(class => 'alert alert-danger', message => $self->param('login') . ' does not match /[a-zA-Z]{3,10}/');
return 0;
}
elsif ($self->param('password') ne $self->param('password_verify')){
$self->flash(class => 'alert alert-danger', message => 'Passwords do not match.');
return 0;
}
elsif ($self->param('password') eq ''){
$self->flash(class => 'alert alert-danger', message => 'Password is empty.');
return 0;
}
elsif (!Email::Valid->address($self->_trim($self->param('email')))){
$self->flash(class => 'alert alert-danger', message => 'You have to provide a valid email address.');
return 0;
}
elsif ($self->param('admin')){
unless ($self->session('user')->{admin}){
$self->flash(class => 'alert alert-danger', message => 'Only admins can create admins.');
return 0;
}
}
return 1;
}
sub _encrypt_password {
my ($self, $plaintext) = @_;
my $salt = String::Random::random_string('s' x 16);
return Crypt::Passwd::XS::unix_sha512_crypt($plaintext, $salt);
}
1;
@@ user_list_template
%% layout 'bootstrap';
%% title 'Users';
%%= include 'elements/topnav'
%%= include 'elements/flash'
<table class="table table-striped">
<thead>
<th>User ID</th>
<th>Login</th>
<th>Email</th>
<th>Admin</th>
<th></th>
<th></th>
</thead>
%% if (my $userlist = stash 'userlist'){
<tbody>
%% for my $user (@$userlist){
<tr>
<td><%%= $user->id %></td>
<td><%%= $user->login %></td>
<td><%%= $user->email %></td>
<td><%%= $user->admin %></td>
( run in 2.433 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )