Nephia-Setup-Plugin-Relax

 view release on metacpan or  search on metacpan

lib/Nephia/Setup/Plugin/Relax.pm  view on Meta::CPAN

use File::Basename 'dirname';
use File::Spec;
my $common = require(File::Spec->catfile(dirname(__FILE__), 'common.pl'));
my $conf = {
    %$common,
    'Cache' => { 
        servers   => ['127.0.0.1:11211'],
        namespace => '{{ $self->appname }}',
    },
    'DBI' => {
        connect_info => [
            'dbi:SQLite:dbname={{ $self->{dbfile} }}', 
            '', 
            '',
        ],
    },
    
};
$conf;

@@ MyClass.pm
package {{ $self->appname }};
use strict;
use warnings;
use Data::Dumper ();
use URI;
use Nephia::Incognito;
use Nephia plugins => [
    'FillInForm',
    'FormValidator::Lite',
    'JSON' => {
        enable_api_status_header => 1,
    },
    'View::Xslate' => {
        syntax => 'TTerse',
        path   => [ qw/view/ ],
        function => {
            c    => \&c,
            dump => sub {
                local $Data::Dumper::Terse = 1;
                Data::Dumper::Dumper(shift);
            },
            uri_for => sub {
                my $path = shift;
                my $env = c()->req->env;
                my $uri = URI->new(sprintf(
                    '%s://%s%s',
                    $env->{'psgi.url_scheme'},
                    $env->{'HTTP_HOST'},
                    $path
                ));
                $uri->as_string;
            },
        },
    },
    'ErrorPage',
    'ResponseHandler',
    'Dispatch',
];

sub c () {Nephia::Incognito->unmask(__PACKAGE__)}

### To avoid to create duplicate cookies.
c->action_chain->delete('Nephia::Action::CookieImprinter');

app {
    get  '/' => Nephia->call('C::Root#index');
    get  '/api/member/create' => Nephia->call('C::API::Member#create');
    get  '/api/member/:id' => Nephia->call('C::API::Member#fetch');
};

1;

@@ C::Root
package {{ $self->{tmpclass} }};
use strict;
use warnings;
use utf8;

sub index {
    my $c = shift;
    { template => 'index.tt' };
}

1;

@@ C::API::Member
package {{ $self->{tmpclass} }};
use strict;
use warnings;
use utf8;
use {{ $self->appname }}::M::DB::Member;
use {{ $self->appname }}::M::Cache;

sub create {
    my $c = shift;
    my $valid = $c->form(
        name  => ['NOT_NULL', ['LENGTH', 1, 16]],
        email => ['NOT_NULL', 'EMAIL_LOOSE'],
    );

    return {status => 400, message => $valid->get_error_messages} if $valid->has_error;

    my $member = {{ $self->appname }}::M::DB::Member->create(
        name  => $c->param('name'),
        email => $c->param('email'),
    );
    return {member => $member};
}

sub fetch {
    my $c = shift;
    my $id = $c->path_param('id');

    return {status => 403, message => 'id is required'} unless $id;

    my $member = {{ $self->appname }}::M::Cache->get("member:$id") || {{ $self->appname }}::M::DB::Member->fetch($id);
    {{ $self->appname }}::M::Cache->set("member:$id", $member, 300) if $member;
    return $member ? {member => $member} : {status => 404, message => 'member not found'};
}



( run in 0.441 second using v1.01-cache-2.11-cpan-524268b4103 )