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 )