RSS Git Download  Clone
Raw Blame History
package Reporter::Validator;

# called as $app->model->validator->validate( <profile_name> => $params );

use Data::FormValidator;
use Data::FormValidator::Constraints qw(:closures);

use Reporter::Class;

has dfv => (
    is => 'lazy',
    builder => sub { Data::FormValidator->new( {}, _dfv_defaults() ) },
);

has profiles => (
    is => 'ro',
    isa => HashReference,
    builder => 1,
);

#-------------------------------------------------------------------------------
sub _build_profiles { # hashref of dfv profiles
  {
    search => {
        required => 'lab_number',
        constraint_methods => {
            lab_number => constraint_method_for('lab_num'),
        },
        msgs => {
            constraints => {
                lab_num => 'lab number format incorrect: require nnn/yy',
            },
        },
    },
    report => {
        required => [ qw( status specimen_quality diagnosis_id ) ],
        optional => [ qw(
            request_notes clinical_details secondary_diagnosis_id morphology
            comment )
        ],
		dependencies => {
            _require_biopsy_details => 'biopsy_site',
            _require_gross_description => 'gross_description',
        },
        constraint_methods => { },
        msgs => {
            constraints => { },
        },
    },
  }
}

#-------------------------------------------------------------------------------
sub validate {
    my ($self, $profile_name, $params) = @_; # p $profile_name; p $params;

    my $profile = $self->profiles->{$profile_name}; # ddp $profile;
    my $result  = $self->dfv->check($params, $profile); # ddp $result;

    my @dfv_msgs = values %{ $result->msgs }; # array of msgs

    my %h = (
        dfv_errs => $result->msgs, # empty hashref if success
        success  => $result->success   || 0,  # empty if failed
        failed   => ! $result->success || 0,  # empty if failed
        errors   => \@dfv_msgs,
        valid    => $result->valid     || {}, # undef if failed
    ); # p %h;
    return \%h;
}

#-------------------------------------------------------------------------------
sub constraint_method_for {
    my $profile_name = shift;
    my $methods = {
        lab_num => sub {
            my $dfv = shift; # ddp $dfv;
            $dfv->name_this('lab_num'); # to allow custom msg
            my $data = $dfv->get_filtered_data; # ddp $data;
            $data->{lab_number} =~ qr{\d+/\d{2}};
        },
    };
    return $methods->{$profile_name};
}

#-------------------------------------------------------------------------------
sub _dfv_defaults {
    return {
		missing_optional_valid => 1,
		filters => 'trim', # trims white space either side of field param
		msgs => {
			# any_errors => 'dfv_errors', # not needed
			format => '%s', # style goes in .tt not here !!
		},
	};
}

1;