Merge pull request #5 from Pear-Trading/finnk/fixes
Did test and routing fixes and dependency fix
This commit is contained in:
commit
f3ec371388
12 changed files with 116 additions and 116 deletions
2
cpanfile
2
cpanfile
|
@ -14,5 +14,5 @@ requires 'DBIx::Class::TimeStamp';
|
||||||
requires 'DBIx::Class::Schema::Loader';
|
requires 'DBIx::Class::Schema::Loader';
|
||||||
requires 'SQL::Translator';
|
requires 'SQL::Translator';
|
||||||
requires 'DateTime';
|
requires 'DateTime';
|
||||||
requires 'DateTime::Format::Strptime';
|
requires 'DateTime::Format::Strptime', "1.73";
|
||||||
requires 'DateTime::Format::SQLite';
|
requires 'DateTime::Format::SQLite';
|
||||||
|
|
|
@ -104,10 +104,11 @@ sub startup {
|
||||||
|
|
||||||
my $r = $self->routes;
|
my $r = $self->routes;
|
||||||
$r->get('/')->to('root#index');
|
$r->get('/')->to('root#index');
|
||||||
$r->post('/')->to('root#auth_login');
|
$r->get('/admin')->to('admin#index');
|
||||||
$r->get('/register')->to('register#index');
|
$r->post('/admin')->to('admin#auth_login');
|
||||||
$r->post('/register')->to('register#register');
|
# $r->get('/register')->to('register#index');
|
||||||
$r->any('/logout')->to('root#auth_logout');
|
# $r->post('/register')->to('register#register');
|
||||||
|
$r->any('/admin/logout')->to('admin#auth_logout');
|
||||||
|
|
||||||
my $api_public_get = $r->under('/api');
|
my $api_public_get = $r->under('/api');
|
||||||
$api_public_get->get('/info/ages')->to('api-info#get_ages');
|
$api_public_get->get('/info/ages')->to('api-info#get_ages');
|
||||||
|
@ -142,7 +143,7 @@ sub startup {
|
||||||
|
|
||||||
my $admin_routes = $r->under('/admin')->to('admin#under');
|
my $admin_routes = $r->under('/admin')->to('admin#under');
|
||||||
|
|
||||||
$admin_routes->get('/')->to('admin#home');
|
$admin_routes->get('/home')->to('admin#home');
|
||||||
|
|
||||||
$admin_routes->get('/tokens')->to('admin-tokens#index');
|
$admin_routes->get('/tokens')->to('admin-tokens#index');
|
||||||
$admin_routes->post('/tokens')->to('admin-tokens#create');
|
$admin_routes->post('/tokens')->to('admin-tokens#create');
|
||||||
|
@ -160,14 +161,14 @@ sub startup {
|
||||||
$admin_routes->get('/organisations/pending/:id')->to('admin-organisations#pending_read');
|
$admin_routes->get('/organisations/pending/:id')->to('admin-organisations#pending_read');
|
||||||
$admin_routes->get('/organisations/pending/:id/approve')->to('admin-organisations#pending_approve');
|
$admin_routes->get('/organisations/pending/:id/approve')->to('admin-organisations#pending_approve');
|
||||||
|
|
||||||
my $user_routes = $r->under('/')->to('root#under');
|
# my $user_routes = $r->under('/')->to('root#under');
|
||||||
|
|
||||||
$user_routes->get('/home')->to('root#home');
|
# $user_routes->get('/home')->to('root#home');
|
||||||
|
|
||||||
my $portal_api = $r->under('/portal')->to('api-auth#check_json')->under('/')->to('portal#under');
|
# my $portal_api = $r->under('/portal')->to('api-auth#check_json')->under('/')->to('portal#under');
|
||||||
|
|
||||||
$portal_api->post('/upload')->to('api-upload#post_upload');
|
# $portal_api->post('/upload')->to('api-upload#post_upload');
|
||||||
$portal_api->post('/search')->to('api-upload#post_search');
|
# $portal_api->post('/search')->to('api-upload#post_search');
|
||||||
|
|
||||||
$self->hook( before_dispatch => sub {
|
$self->hook( before_dispatch => sub {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
|
@ -6,10 +6,8 @@ sub under {
|
||||||
|
|
||||||
if ( $c->is_user_authenticated ) {
|
if ( $c->is_user_authenticated ) {
|
||||||
return 1 if defined $c->current_user->administrator;
|
return 1 if defined $c->current_user->administrator;
|
||||||
$c->redirect_to('/home');
|
|
||||||
} else {
|
|
||||||
$c->redirect_to('/');
|
|
||||||
}
|
}
|
||||||
|
$c->redirect_to('/');
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,4 +29,21 @@ sub home {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub auth_login {
|
||||||
|
my $c = shift;
|
||||||
|
|
||||||
|
if ( $c->authenticate($c->param('email'), $c->param('password')) ) {
|
||||||
|
$c->redirect_to('/admin/home');
|
||||||
|
} else {
|
||||||
|
$c->redirect_to('/admin');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub auth_logout {
|
||||||
|
my $c = shift;
|
||||||
|
|
||||||
|
$c->logout;
|
||||||
|
$c->redirect_to('/admin');
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
|
@ -4,9 +4,9 @@ use Mojo::Base 'Mojolicious::Controller';
|
||||||
sub index {
|
sub index {
|
||||||
my $c = shift;
|
my $c = shift;
|
||||||
|
|
||||||
if ( $c->is_user_authenticated ) {
|
# if ( $c->is_user_authenticated ) {
|
||||||
$c->redirect_to('/home');
|
# $c->redirect_to('/home');
|
||||||
}
|
# }
|
||||||
}
|
}
|
||||||
|
|
||||||
sub under {
|
sub under {
|
||||||
|
|
|
@ -21,7 +21,7 @@ $schema->resultset('AgeRange')->populate([
|
||||||
[ '50+' ],
|
[ '50+' ],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if ( $ENV{MOJO_MODE} eq 'development' ) {
|
if (defined $ENV{MOJO_MODE} && $ENV{MOJO_MODE} eq 'development' ) {
|
||||||
|
|
||||||
$schema->resultset('User')->create({
|
$schema->resultset('User')->create({
|
||||||
email => 'test@example.com',
|
email => 'test@example.com',
|
||||||
|
|
|
@ -1,29 +1,12 @@
|
||||||
use strict;
|
use Mojo::Base -strict;
|
||||||
use warnings;
|
|
||||||
|
|
||||||
use FindBin qw/ $Bin /;
|
|
||||||
use lib "$Bin/../../lib";
|
|
||||||
|
|
||||||
use File::Temp;
|
|
||||||
use Test::More;
|
use Test::More;
|
||||||
use Test::Mojo;
|
use Mojo::JSON;
|
||||||
use DateTime;
|
use Test::Pear::LocalLoop;
|
||||||
my $file = File::Temp->new;
|
|
||||||
|
|
||||||
print $file <<'END';
|
my $framework = Test::Pear::LocalLoop->new;
|
||||||
{
|
my $t = $framework->framework;
|
||||||
dsn => "dbi:SQLite::memory:",
|
|
||||||
user => undef,
|
|
||||||
pass => undef,
|
|
||||||
}
|
|
||||||
END
|
|
||||||
$file->seek( 0, SEEK_END );
|
|
||||||
|
|
||||||
$ENV{MOJO_CONFIG} = $file->filename;
|
|
||||||
|
|
||||||
my $t = Test::Mojo->new('Pear::LocalLoop');
|
|
||||||
my $schema = $t->app->schema;
|
my $schema = $t->app->schema;
|
||||||
$schema->deploy;
|
|
||||||
|
|
||||||
$schema->resultset('User')->create({
|
$schema->resultset('User')->create({
|
||||||
email => 'admin@example.com',
|
email => 'admin@example.com',
|
||||||
|
@ -47,46 +30,42 @@ my $location_is = sub {
|
||||||
};
|
};
|
||||||
|
|
||||||
$t->get_ok('/admin')
|
$t->get_ok('/admin')
|
||||||
->status_is(302)
|
->status_is(200)->or($framework->dump_error);
|
||||||
->$location_is('/');
|
|
||||||
|
|
||||||
$t->ua->max_redirects(10);
|
$t->ua->max_redirects(10);
|
||||||
$t->post_ok('/', form => {
|
$t->post_ok('/admin', form => {
|
||||||
email => 'user@example.com',
|
email => 'user@example.com',
|
||||||
password => 'abc123',
|
password => 'abc123',
|
||||||
})->status_is(200);
|
})->status_is(200);
|
||||||
|
|
||||||
$t->ua->max_redirects(0);
|
$t->ua->max_redirects(0);
|
||||||
$t->get_ok('/admin')
|
$t->get_ok('/admin')
|
||||||
->status_is(302)
|
->status_is(200);
|
||||||
->$location_is('/home');
|
|
||||||
|
|
||||||
$t->get_ok('/logout')
|
$t->get_ok('/admin/logout')
|
||||||
->status_is(302)
|
->status_is(302)
|
||||||
->$location_is('/');
|
->$location_is('/admin');
|
||||||
|
|
||||||
$t->get_ok('/admin')
|
$t->get_ok('/admin')
|
||||||
->status_is(302)
|
->status_is(200);
|
||||||
->$location_is('/', 'Logged out');
|
|
||||||
|
|
||||||
$t->ua->max_redirects(10);
|
$t->ua->max_redirects(10);
|
||||||
$t->post_ok('/', form => {
|
$t->post_ok('/admin', form => {
|
||||||
email => 'admin@example.com',
|
email => 'admin@example.com',
|
||||||
password => 'abc123',
|
password => 'abc123',
|
||||||
})->status_is(200);
|
})->status_is(200);
|
||||||
|
|
||||||
$t->ua->max_redirects(0);
|
$t->ua->max_redirects(0);
|
||||||
$t->get_ok('/admin')
|
$t->get_ok('/admin/home')
|
||||||
->status_is(200)
|
->status_is(200)
|
||||||
->content_like(qr/Admin/);
|
->content_like(qr/Admin/);
|
||||||
|
|
||||||
$t->get_ok('/logout')
|
$t->get_ok('/admin/logout')
|
||||||
->status_is(302)
|
->status_is(302)
|
||||||
->$location_is('/');
|
->$location_is('/admin');
|
||||||
|
|
||||||
$t->get_ok('/admin')
|
$t->get_ok('/admin')
|
||||||
->status_is(302)
|
->status_is(200);
|
||||||
->$location_is('/', 'Logged out');
|
|
||||||
|
|
||||||
done_testing;
|
done_testing;
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,6 @@ BEGIN {
|
||||||
}
|
}
|
||||||
|
|
||||||
my $t = Test::Mojo->new("Pear::LocalLoop");
|
my $t = Test::Mojo->new("Pear::LocalLoop");
|
||||||
$t->get_ok('/')->status_is(200)->content_like(qr/login/i);
|
$t->get_ok('/')->status_is(200);
|
||||||
|
|
||||||
done_testing();
|
done_testing();
|
||||||
|
|
|
@ -38,7 +38,7 @@ my $testJson = {
|
||||||
'age_range' => 1
|
'age_range' => 1
|
||||||
};
|
};
|
||||||
$t->post_ok('/api/register' => json => $testJson)
|
$t->post_ok('/api/register' => json => $testJson)
|
||||||
->status_is(200)->or($dump_error)
|
->status_is(200)->or($framework->dump_error)
|
||||||
->json_is('/success', Mojo::JSON->true);
|
->json_is('/success', Mojo::JSON->true);
|
||||||
|
|
||||||
#test with an organisation.
|
#test with an organisation.
|
||||||
|
|
55
templates/admin/index.html.ep
Normal file
55
templates/admin/index.html.ep
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
% layout 'default';
|
||||||
|
% title 'Login';
|
||||||
|
% content_for css => begin
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: whitesmoke;
|
||||||
|
padding-top: 54px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel {
|
||||||
|
background: white;
|
||||||
|
padding: 16px;
|
||||||
|
-webkit-box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.2);
|
||||||
|
-moz-box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.2);
|
||||||
|
box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-form {
|
||||||
|
margin-top: 20%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
% end
|
||||||
|
% content_for javascript => begin
|
||||||
|
% end
|
||||||
|
<div class="container">
|
||||||
|
% if ( my $error = flash 'error' ) {
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
<strong>Error!</strong> <%= $error %>
|
||||||
|
</div>
|
||||||
|
% } elsif ( my $success = flash 'success' ) {
|
||||||
|
<div class="alert alert-success" role="alert">
|
||||||
|
<strong>Success!</strong> <%= $success %>
|
||||||
|
</div>
|
||||||
|
% }
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<!-- Fluid Gird, this login box stay in the middle of screen -->
|
||||||
|
<div class="col-5">
|
||||||
|
|
||||||
|
<div class="login-form panel">
|
||||||
|
<form action="<%= url_for %>" method="post">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="login-email">Email Address</label>
|
||||||
|
<input type="email" id="login-email" class="form-control" name="email" required>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="login-password">Password</label>
|
||||||
|
<input type="password" id="login-password" class="form-control" name="password" required>
|
||||||
|
</div>
|
||||||
|
<input type="submit" class="btn btn-block btn-primary" value="Sign In">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div><!-- Container fluid-->
|
||||||
|
|
|
@ -25,14 +25,14 @@
|
||||||
<span class="navbar-toggler-icon"></span>
|
<span class="navbar-toggler-icon"></span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<a class="navbar-brand" href="<%= url_for '/admin' %>">LocalLoop Admin</a>
|
<a class="navbar-brand" href="<%= url_for '/admin/home' %>">LocalLoop Admin</a>
|
||||||
<div class="collapse navbar-collapse" id="navbarNav">
|
<div class="collapse navbar-collapse" id="navbarNav">
|
||||||
<div class="navbar-nav ml-auto">
|
<div class="navbar-nav ml-auto">
|
||||||
<a class="nav-item nav-link" href="<%= url_for '/home' %>">User Section</a>
|
<a class="nav-item nav-link" href="<%= url_for '/' %>">User Section</a>
|
||||||
<a class="nav-item nav-link<%= title eq 'Tokens' ? ' active' : '' %>" href="<%= url_for '/admin/tokens' %>">Tokens</a>
|
<a class="nav-item nav-link<%= title eq 'Tokens' ? ' active' : '' %>" href="<%= url_for '/admin/tokens' %>">Tokens</a>
|
||||||
<a class="nav-item nav-link<%= title eq 'Users' ? ' active' : '' %>" href="<%= url_for '/admin/users' %>">Users</a>
|
<a class="nav-item nav-link<%= title eq 'Users' ? ' active' : '' %>" href="<%= url_for '/admin/users' %>">Users</a>
|
||||||
<a class="nav-item nav-link<%= title eq 'Organisations' ? ' active' : '' %>" href="<%= url_for '/admin/organisations' %>">Organisations</a>
|
<a class="nav-item nav-link<%= title eq 'Organisations' ? ' active' : '' %>" href="<%= url_for '/admin/organisations' %>">Organisations</a>
|
||||||
<a class="nav-item nav-link" href="<%= url_for '/logout' %>">Logout</a>
|
<a class="nav-item nav-link" href="<%= url_for '/admin/logout' %>">Logout</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
|
@ -28,9 +28,6 @@
|
||||||
<a class="navbar-brand" href="<%= url_for '/home' %>">LocalLoop</a>
|
<a class="navbar-brand" href="<%= url_for '/home' %>">LocalLoop</a>
|
||||||
<div class="collapse navbar-collapse" id="navbarNav">
|
<div class="collapse navbar-collapse" id="navbarNav">
|
||||||
<div class="navbar-nav ml-auto">
|
<div class="navbar-nav ml-auto">
|
||||||
% if ( defined $c->current_user->administrator ) {
|
|
||||||
<a class="nav-item nav-link" href="<%= url_for '/admin' %>">Admin Section</a>
|
|
||||||
% }
|
|
||||||
<a class="nav-item nav-link<%= title eq 'Receipts' ? ' active' : '' %>" href="#">Receipts</a>
|
<a class="nav-item nav-link<%= title eq 'Receipts' ? ' active' : '' %>" href="#">Receipts</a>
|
||||||
<a class="nav-item nav-link<%= title eq 'Settings' ? ' active' : '' %>" href="#">Settings</a>
|
<a class="nav-item nav-link<%= title eq 'Settings' ? ' active' : '' %>" href="#">Settings</a>
|
||||||
<a class="nav-item nav-link" href="<%= url_for '/logout' %>">Logout</a>
|
<a class="nav-item nav-link" href="<%= url_for '/logout' %>">Logout</a>
|
||||||
|
|
|
@ -1,55 +1,8 @@
|
||||||
% layout 'default';
|
% layout 'user';
|
||||||
% title 'Login';
|
% title 'Home';
|
||||||
% content_for css => begin
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
background: whitesmoke;
|
|
||||||
padding-top: 54px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel {
|
|
||||||
background: white;
|
|
||||||
padding: 16px;
|
|
||||||
-webkit-box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.2);
|
|
||||||
-moz-box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.2);
|
|
||||||
box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-form {
|
|
||||||
margin-top: 20%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
% end
|
|
||||||
% content_for javascript => begin
|
% content_for javascript => begin
|
||||||
|
%= javascript '/static/user/js/home.js';
|
||||||
% end
|
% end
|
||||||
<div class="container">
|
<div class="card">
|
||||||
% if ( my $error = flash 'error' ) {
|
<h3 class="card-header">User Home</h3>
|
||||||
<div class="alert alert-danger" role="alert">
|
</div>
|
||||||
<strong>Error!</strong> <%= $error %>
|
|
||||||
</div>
|
|
||||||
% } elsif ( my $success = flash 'success' ) {
|
|
||||||
<div class="alert alert-success" role="alert">
|
|
||||||
<strong>Success!</strong> <%= $success %>
|
|
||||||
</div>
|
|
||||||
% }
|
|
||||||
<div class="row justify-content-center">
|
|
||||||
<!-- Fluid Gird, this login box stay in the middle of screen -->
|
|
||||||
<div class="col-5">
|
|
||||||
|
|
||||||
<div class="login-form panel">
|
|
||||||
<form action="<%= url_for %>" method="post">
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="login-email">Email Address</label>
|
|
||||||
<input type="email" id="login-email" class="form-control" name="email" required>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="login-password">Password</label>
|
|
||||||
<input type="password" id="login-password" class="form-control" name="password" required>
|
|
||||||
</div>
|
|
||||||
<input type="submit" class="btn btn-block btn-primary" value="Sign In">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div><!-- Container fluid-->
|
|
||||||
|
|
||||||
|
|
Reference in a new issue