package Labels;
# setting('environment') does NOT work for production, but does for dev
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; # warn dancer_app->environment;
debug $vars; # ie only for development env, production set to warnings
};
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; # for success
}
sub print_labels {
my $model = shift;
my $rtn = $model->print_labels; # returns err or nothing
if ($rtn) {
var error => $rtn;
return 0;
}
return 1; # for success
}
sub error_as_json {
my $err = shift;
my $str = sprintf '%s: %s', $err, var 'error';
return to_json( { labels => [ $str ] } );
}
true;