RSS Git Download  Clone
Raw Blame History
package Routes::InfoLibrary;
use Dancer2 appname => 'DocsLib';

use v5.34.0;
use Data::Printer;
use Data::Dumper;

use App::Model; # D2 plugin, provides 'model' keyword
use Dancer2::Plugin::Deferred;
use Dancer2::Plugin::Auth::Tiny;

my $PREFIX = 'infolib'; 
prefix "/$PREFIX";

hook before_template_render => sub { 
    my $tokens = shift;
    my %h = (
        home     => '/',
        new      => '/new_document',
        edit     => '/edit',
        create   => '/create',
        search   => '/search',
        update   => '/update',
        summary  => '/summary',
        all_docs => '/all_docs',
        document => '/id',
    ); # need to have unique token name across all route files, so using prefix as a key
    $tokens->{uri_for_section}->{$PREFIX}->{$_}
        = uri_for('/'. $PREFIX . $h{$_}) for keys %h; # p $tokens;
}; 

# cannot use method 'any' with route names: "Route with this name ($name) already exists"
#   probably when route name is registered for GET, then for POST/HEAD/etc
# cannot use uri_for_route in any template loaded after forward (data is deleted)
# these routes need route-names (for redirect):
get  'infolib_home' =>
     '/' => needs login => \&home;
get  'get_infolib_document' =>
     '/id/:id[Int]' => \&get_document;
# these routes need permissions:
post '/create'          => needs login => \&create_document;
post '/edit/:id[Int]'   => needs admin => \&edit_document;
post '/update/:id[Int]' => needs login => \&update_document;
# these routes don't need names or permissions
get '/new_document' => \&new_document;                           
get '/summary'      => \&summary;
get '/all_docs'     => \&all_documents;
post '/search'      => \&search;

#===============================================================================

sub flash { deferred @_ }

sub home {
    template $PREFIX.'/home.tt', { records => query_parameters->get('records') };
};

sub new_document { template $PREFIX.'/record.tt', { prefix => $PREFIX } };

sub get_document {
    my $id = route_parameters->get('id');
    my $rec = model->infolib->get_document_by_id($id); # p $rec; # AoH
    template $PREFIX.'/record.tt', { entry => $rec }; # href, not aref
};

sub edit_document {
	var is_edit => 1;
    my $route = '/'.$PREFIX.'/id/'.route_parameters->get('id');
	forward $route, {}, { method => 'GET' };
};

sub create_document {
    my $params = request->parameters->as_hashref; # p $params;
    my $res    = model->infolib->save_document($params); # p $res;
	if ( $res->{error} ) {
		var input_error => $res->{error};
        template $PREFIX.'/record.tt', { entry => $params };
    }
	else {
		flash ( input_success => 1 ); # doesn't need message
		redirect uri_for_route( 'get_infolib_document', { id => $res->{id} } );
	}
};

sub update_document { # just captures document_id & forwards:
	forward '/'.$PREFIX.'/create', { id => route_parameters->get('id') };
};
    
sub all_documents {
	my $rec = model->infolib->get_all_documents; # p $rec; # AoH
	template $PREFIX.'/home.tt', { records => $rec };
};

sub search {
	my $str = body_parameters->get('search'); # =~ s{\s+}{}gr; # sometimes need space
	my $rec = model->infolib->find_documents($str); # p $rec; # AoH
	template $PREFIX.'/summary.tt', { records => $rec };
};

sub summary {
    my $rec = model->infolib->get_all_documents; # p $rec; # AoH
    template $PREFIX.'/summary.tt',  => { records => $rec };
};

true;