package Routes::Moongate; use Dancer2 appname => 'DocsLib'; use v5.34.0; use Data::Printer; use App::Model; # D2 plugin, provides 'model' keyword use Dancer2::Plugin::Deferred; use Dancer2::Plugin::Auth::Tiny; my $PREFIX = 'moongate'; prefix "/$PREFIX"; my $docs_path = path( config->{appdir}, 'documents', $PREFIX ); # debug $docs_path; # set path to documents folder: model->moongate->set_docs_path($docs_path); hook before_template_render => sub { my $tokens = shift; # need to have unique token name across all route files my %h = ( home => '/', new => '/new_document', edit => '/edit', create => '/create', search => '/search', update => '/update', summary => '/summary', all_docs => '/all_docs', document => '/id', download => '/download', ); $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) get 'moongate_home' => '/' => needs login => \&home; post 'edit_moongate_entry_post' => '/edit/:id[Int]' => needs login => \&edit_document; get 'edit_moongate_entry_get' => '/edit/:id[Int]' # required for GET request, needs unique route name => needs login => \&edit_document; post 'new_moongate_entry' => '/service_record' => needs login => \&service_record; post 'update_moongate_entry' => '/update/:id[Int]' => needs login => \&update_document; post '/new_moongate_entry' => needs login => \&service_record; get '/new_document' => \&new_document; get 'moongate_summary' => '/summary' => \&summary; get 'download_moongate_document' => '/download/:id[Str]' => \&download; get 'get_moongate_entry' => '/id/:id[Int]' => \&get_document; get 'all_moongate_entries' => '/all_docs' => \&all_documents; post 'find_moongate_entries' => '/search' => \&search; # ============================================================================== sub flash { deferred @_ } sub home { template home => { title => 'Moongate' } }; sub new_document { var next_route => 'create'; template $PREFIX.'/record.tt', { prefix => $PREFIX }; }; sub get_document { my $id = route_parameters->get('id'); my $rec = model->moongate->get_document($id); # p $rec; # AoH vars->{next_route} ||= 'edit/'.$id; # may already be set by edit_document() template $PREFIX.'/record.tt', { entry => $rec }; }; sub edit_document { my $id = route_parameters->get('id'); var next_route => 'update/'.$id; my $route = '/'.$PREFIX.'/id/'.$id; forward $route, {}, { method => 'GET' }; }; sub service_record { my $params = request->parameters->as_hashref; # p $params; # get upload data - new entry only, passed as param if edit: my $data_file = upload('filename'); # p $data_file; my $res = model->moongate->save_document($params, $data_file); # p $res; if ( $res->{error} ) { var input_error => $res->{error}; forward '/'.$PREFIX.'/', { records => [$params] }, { method => 'GET' }; } else { flash ( input_success => 1 ); # doesn't need message if ($data_file) { # upload file to docs dir if uploaded: my $filepath = path($docs_path, $params->{filename}); $data_file->copy_to( $filepath ); } redirect uri_for_route( 'get_moongate_entry', { id => $res->{id} } ); } }; sub update_document { # just captures document_id & forwards: forward '/'.$PREFIX.'/service_record', { id => route_parameters->get('id') }; }; sub summary { my $rec = model->moongate->get_all_documents; # p $rec; # AoH template $PREFIX.'/summary.tt', { records => $rec }; }; sub search { my $str = body_parameters->get('search') =~ s{\s+}{}gr; my $rec = model->moongate->find_documents($str); # p $rec; # AoH template $PREFIX.'/summary.tt', { records => $rec }; }; sub download { my $document = route_parameters->get('id'); my $file = join '/', $docs_path, $document; # debug $file; send_file $file, system_path => 1; }; =begin # not in use sub all_documents { my $rec = model->moongate->get_all_documents; # p $rec; # AoH template $PREFIX.'/home.tt', { records => $rec }; }; =cut true;