package Reporter::Model;
use Reporter::Validation; # HTML::FormHandler class
use Reporter::Class; # provides Moo, Modern::Perl, Local::MooX::Types & Data::Printer::p
use Reporter::DB;
has dbname => ( is => 'ro', isa => String, required => 1 ); # hilis4, test, etc
has db => (
is => 'lazy',
builder => sub { Reporter::DB->new( dbname => shift->dbname ) },
);
has validator => (
is => 'lazy',
builder => sub { Reporter::Validation->new },
);
use Digest::SHA1;
use Lingua::EN::Numbers qw(num2en_ordinal);
sub authenticate_user {
my ($self, $params) = @_; # p $params;
my $userid = $params->{userid}; # username or email addr
my $passwd = $params->{password};
my $digest = _sha1_digest($passwd); # p $digest;
if ( my $user = $self->db->get_user_data($userid) ) { # p $user; p $digest;
return $user if $user->{password} eq $digest;
}
# either no user retrieved by username or passwd, or passwd incorrect:
return 0;
}
sub validate {
my ($self, $params) = @_; # p $params;
my $validator = $self->validator;
my $result = $validator->run( params => $params ); # p $result;
my %h = (
errors => $result->errors, # empty if validation passed
failed => $result->has_errors, # true or false
success => ! $result->has_errors, # ie $ref->{success} or $ref->{failed}
); # p %h;
return \%h;
}
sub load_request {
my ($self, $lab_number) = @_; # p $lab_number;
# split lab_number into request_number & yr:
my ($request_number, $yr) = $lab_number =~ m!(\d+)/(\d{2})!;
my $data = $self->db->get_request_data($request_number, $yr);
return $data;
}
sub num2ordinal { num2en_ordinal($_[1]) }
sub _sha1_digest {
my $str = shift; # warn $str;
my $sha1 = Digest::SHA1->new;
$sha1->add($str);
return $sha1->b64digest;
}
1;