Yancy
view release on metacpan or search on metacpan
eg/todo-app/myapp.pl view on Meta::CPAN
#!/usr/bin/env perl
use v5.24;
use experimental qw( signatures postderef );
use Mojolicious::Lite;
use Mojo::SQLite;
use Mojo::Util qw( trim unindent );
use DateTime;
use DateTime::Event::Recurrence;
use Scalar::Util qw( looks_like_number );
helper sqlite => sub {
state $path = $ENV{TEST_YANCY_EXAMPLES} ? ':temp:' : app->home->child( 'data.db' );
state $sqlite = Mojo::SQLite->new( 'sqlite:' . $path );
return $sqlite;
};
app->sqlite->auto_migrate(1)->migrations->from_data;
# Login sessions expire after one week
app->sessions->default_expiration( 60 * 60 * 24 * 7 );
if ( my $path = $ENV{MOJO_REVERSE_PROXY} ) {
app->sessions->cookie_path( $ENV{MOJO_REVERSE_PROXY} );
my @parts = grep { $_ } split m{/}, $path;
app->hook( before_dispatch => sub {
my ( $c ) = @_;
my $url = $c->req->url;
my $base = $url->base;
# Append to the base path
push @{ $base->path }, @parts;
# The base must end with a slash, making http://example.com/todo/
$base->path->trailing_slash(1);
# and the URL must not, so that relative links on the home page work
# correctly
$url->path->leading_slash(0);
});
}
plugin Yancy => {
backend => { Sqlite => app->sqlite },
read_schema => 1,
schema => {
todo_item => {
title => 'To-Do Item',
description => unindent( trim q{
A recurring task to do. Tasks are available during a `period`, and
recur after an `interval`. For example:
* A task with an interval of `1` and a period of `day` should be
completed once every day.
* A task with an interval of `1` and a period of `week` should be
completed once every week.
* A task with an interval of `2` and a period of `day` will show up
once every 2 days and should be completed that day.
* A task with an interval of `2` and a period of `week` will show up
once every 2 weeks and should be completed that week.
}),
example => {
period => "day",
title => "Did you brush your teeth?",
interval => 1,
},
properties => {
period => {
description => 'How long a task is available to do.',
enum => [qw( day week month )],
},
interval => {
description => 'The number of periods each between each instance.',
},
start_date => {
description => 'The date to start using this item. Defaults to today.',
},
},
'x-list-columns' => [qw( title interval period )],
},
todo_log => {
title => 'To-Do Log',
'x-list-columns' => [qw( id start_date end_date complete )],
description => unindent( trim q{
A log of the to-do items that have passed. Items can either be completed
or uncompleted.
} ),
properties => {
( run in 1.746 second using v1.01-cache-2.11-cpan-71847e10f99 )