package Labels; use Dancer2; use Labels::Model; use Data::Dumper; use Data::Printer; our $VERSION = '0.1'; set auto_page => 1; # don't need routes for static tt returns (labels) hook before => sub { my $vars = params; # p settings('environment'); p $vars if setting('environment') eq 'development'; }; get '/' => sub { template 'index', {}, { layout => 'default' } }; post '/labels' => sub { my $src_file = upload('src_file'); # p $src_file; # validate file upload: validate_user_input($src_file) or return error_as_json('file upload error'); my @args = ( content => $src_file->content, config => config() ); # p @args; my $model = Labels::Model->new(@args); # parse xl file - extracts spreadsheet data: parse_xls($model) or return error_as_json('file read failure'); # print labels: print_labels($model) or return error_as_json('print labels error'); # assume print labels succeeded, return list of uploaded labels: my $labels = $model->format_result; # AoA return to_json({ labels => $labels }); }; #------------------------------------------------------------------------------- sub validate_user_input { my $src_file = shift; if (! $src_file ) { var error => 'no data file uploaded!'; return 0; } # check upload is valid data file: unless ( $src_file->filename =~ /\.xls\Z/i ) { var error => $src_file->filename . ' is not a valid data file'; return 0; } return 1; # for success } sub parse_xls { my $model = shift; my $rtn = $model->parse_xls; # returns err or nothing if ($rtn) { var error => $rtn; return 0; } return 1; } sub print_labels { my $model = shift; my $rtn = $model->print_labels; # returns err or nothing if ($rtn) { var error => $rtn; return 0; } return 1; } sub error_as_json { my $err = shift; my $str = sprintf '%s: %s', $err, var 'error'; return to_json( { labels => [ $str ] } ); } true;