#!/usr/bin/env perl
use Mojolicious::Lite;
use Mojo::JSON;
use Mango;
use Mango::BSON qw( bson_oid );
my $mango = Mango->new;
$mango->default_db( 'jade_kingdom' );
get '/' => 'index';
get '/api/user' => sub {
my ( $self ) = @_;
$self->render(
json => $mango->db->collection('user')->find->all,
);
} => 'user_list';
post '/api/user/:id' => sub {
my ( $self ) = @_;
my $id = $self->stash( 'id' );
my $update = $self->req->json;
$update->{_id} = bson_oid $update->{_id};
$mango->db->collection('user')->save( $update );
return $self->redirect_to( url_for('user', id => $id, method => 'GET' ) );
} => 'user_save';
get '/api/user/:id' => sub {
my ( $self ) = @_;
my $id = bson_oid $self->stash( 'id' );
$self->render(
json => $mango->db->collection('user')->find_one({ _id => $id }) || {},
);
} => 'user';
app->start;
__DATA__
@@ index.html.ep
<!DOCTYPE html>
<html id="ng-app" ng-app="MyApp">
<head>
<link rel="stylesheet" href="/css/bootstrap.min.css" />
</head>
<body ng-controller="UserCtrl" class="container">
<table class="table table-striped">
<tr>
<th>E-mail</th>
<th>Created</th>
<th>Last Seen</th>
<th>Can Play</th>
</tr>
<tr ng-repeat="user in users">
<td>{{user.email}}</td>
<td>{{format_date(user.date_created)}}</td>
<td>{{format_date(user.date_last_seen)}}</td>
<td><input type="checkbox" ng-model="user.can_play" ng-change="user.$save()" /></td>
</tr>
</table>
<script src="/js/jquery.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script src="/js/angular.js"></script>
<script src="/js/angular-resource.js"></script>
<script src="/js/moment.js"></script>
<script>
angular.module( 'MyApp', [ 'ngResource' ] )
.factory( 'User', [ '$resource',
function ( $resource ) {
return $resource( '/api/user/:id', { id: '@_id' } );
}
]
)
.controller( 'UserCtrl', [ '$scope', 'User',
function ( $scope, User ) {
$scope.users = User.query();
$scope.format_date = function ( epoch ) {
if ( !epoch ) return;
return moment( epoch ).calendar();
};
}
]
)
;
</script>
</body>
</html>