diff --git a/lib/Pear/LocalLoop/Controller/Api/Upload.pm b/lib/Pear/LocalLoop/Controller/Api/Upload.pm index e7f7e29..a1880b8 100644 --- a/lib/Pear/LocalLoop/Controller/Api/Upload.pm +++ b/lib/Pear/LocalLoop/Controller/Api/Upload.pm @@ -99,8 +99,8 @@ sub post_upload { $validation->required('transaction_value')->number->gt_num(0); $validation->required('transaction_type')->in( 1, 2, 3 ); - #Check a purchase time was submitted - $validation->required('purchase_time'); + #Check a proper purchase time was submitted + $validation->required('purchase_time')->is_full_iso_datetime; # First pass of required items return $c->api_validation_error if $validation->has_error; diff --git a/lib/Pear/LocalLoop/Plugin/Validators.pm b/lib/Pear/LocalLoop/Plugin/Validators.pm index cc07414..33aeca2 100644 --- a/lib/Pear/LocalLoop/Plugin/Validators.pm +++ b/lib/Pear/LocalLoop/Plugin/Validators.pm @@ -58,6 +58,12 @@ sub register { $value = $app->datetime_formatter->parse_datetime( $value ); return defined $value ? undef : 1; }); + + $app->validator->add_check( is_full_iso_datetime => sub { + my ( $validation, $name, $value ) = @_; + $value = $app->parse_iso_datetime( $value ); + return defined $value ? undef : 1; + }); } 1; diff --git a/t/plugins/validators.t b/t/plugins/validators.t index 81c2f02..1bfc5b8 100644 --- a/t/plugins/validators.t +++ b/t/plugins/validators.t @@ -4,6 +4,7 @@ use warnings; use Mojolicious::Lite; use Test::More; +plugin 'Pear::LocalLoop::Plugin::Datetime'; plugin 'Pear::LocalLoop::Plugin::Validators'; my $validator = app->validator; @@ -16,6 +17,8 @@ my $valid_postcode = 'WC1H 9EB'; my $invalid_postcode = 'AB1 2CD'; my $not_a_postcode = 'a'; my $not_a_whole_postcode = 'LA1'; +my $valid_purchase_time = '2017-08-14T11:29:07.965+01:00'; +my $invalid_purchase_time = '2017081411:29:07'; $validation->input({ valid_email => $valid_email, @@ -24,6 +27,8 @@ $validation->input({ invalid_postcode => $invalid_postcode, not_a_postcode => $not_a_postcode, not_a_whole_postcode => $not_a_whole_postcode, + valid_purchase_time => $valid_purchase_time, + invalid_purchase_time => $invalid_purchase_time, }); $validation->required('valid_email')->email; @@ -32,8 +37,10 @@ $validation->required('valid_postcode')->postcode; $validation->required('invalid_postcode')->postcode; $validation->required('not_a_postcode')->postcode; $validation->required('not_a_whole_postcode')->postcode; +$validation->required('valid_purchase_time')->is_full_iso_datetime; +$validation->required('invalid_purchase_time')->is_full_iso_datetime; ok $validation->has_error, 'Have Errors'; -is_deeply $validation->failed, [ qw/ invalid_email invalid_postcode not_a_postcode not_a_whole_postcode / ], 'Correct Errors'; +is_deeply $validation->failed, [ qw/ invalid_email invalid_postcode invalid_purchase_time not_a_postcode not_a_whole_postcode / ], 'Correct Errors'; done_testing;