Filename | /home/mickey/git_tree/PONAPI/Server/lib/PONAPI/DAO/Request/Role/HasDataMethods.pm |
Statements | Executed 5 statements in 444µs |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 19µs | 7.42ms | BEGIN@4 | PONAPI::DAO::Request::Role::HasDataMethods::
1 | 1 | 1 | 10µs | 86µs | BEGIN@90 | PONAPI::DAO::Request::Role::HasDataMethods::
0 | 0 | 0 | 0s | 0s | _get_data_elements | PONAPI::DAO::Request::Role::HasDataMethods::
0 | 0 | 0 | 0s | 0s | _validate_data | PONAPI::DAO::Request::Role::HasDataMethods::
0 | 0 | 0 | 0s | 0s | check_data_attributes | PONAPI::DAO::Request::Role::HasDataMethods::
0 | 0 | 0 | 0s | 0s | check_data_has_type | PONAPI::DAO::Request::Role::HasDataMethods::
0 | 0 | 0 | 0s | 0s | check_data_relationships | PONAPI::DAO::Request::Role::HasDataMethods::
0 | 0 | 0 | 0s | 0s | check_data_type_match | PONAPI::DAO::Request::Role::HasDataMethods::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | # ABSTRACT: DAO request role - `data` methods | ||||
2 | package PONAPI::DAO::Request::Role::HasDataMethods; | ||||
3 | |||||
4 | 2 | 411µs | 2 | 14.8ms | # spent 7.42ms (19µs+7.40) within PONAPI::DAO::Request::Role::HasDataMethods::BEGIN@4 which was called:
# once (19µs+7.40ms) by Module::Runtime::require_module at line 4 # spent 7.42ms making 1 call to PONAPI::DAO::Request::Role::HasDataMethods::BEGIN@4
# spent 7.40ms making 1 call to Moose::Role::import |
5 | |||||
6 | sub _validate_data { | ||||
7 | my $self = shift; | ||||
8 | |||||
9 | # these are chained to avoid multiple errors on the same issue | ||||
10 | $self->check_data_has_type | ||||
11 | and $self->check_data_type_match | ||||
12 | and $self->check_data_attributes | ||||
13 | and $self->check_data_relationships; | ||||
14 | } | ||||
15 | |||||
16 | sub check_data_has_type { | ||||
17 | my $self = shift; | ||||
18 | |||||
19 | for ( $self->_get_data_elements ) { | ||||
20 | next if ref($_||'') ne 'HASH'; | ||||
21 | |||||
22 | return $self->_bad_request( "request data has no `type` key" ) | ||||
23 | if !exists $_->{'type'}; | ||||
24 | } | ||||
25 | |||||
26 | return 1; | ||||
27 | } | ||||
28 | |||||
29 | sub check_data_type_match { | ||||
30 | my $self = shift; | ||||
31 | |||||
32 | for ( $self->_get_data_elements ) { | ||||
33 | return $self->_bad_request( "conflict between the request type and the data type", 409 ) | ||||
34 | unless $_->{'type'} eq $self->type; | ||||
35 | } | ||||
36 | |||||
37 | return 1; | ||||
38 | } | ||||
39 | |||||
40 | sub check_data_attributes { | ||||
41 | my $self = shift; | ||||
42 | my $type = $self->type; | ||||
43 | |||||
44 | for my $e ( $self->_get_data_elements ) { | ||||
45 | next unless $e and exists $e->{attributes}; | ||||
46 | $self->repository->type_has_fields( $type, [ keys %{ $e->{'attributes'} } ] ) | ||||
47 | or return $self->_bad_request( | ||||
48 | "Type `$type` does not have at least one of the attributes in data" | ||||
49 | ); | ||||
50 | } | ||||
51 | |||||
52 | return 1; | ||||
53 | } | ||||
54 | |||||
55 | sub check_data_relationships { | ||||
56 | my $self = shift; | ||||
57 | my $type = $self->type; | ||||
58 | |||||
59 | for my $e ( $self->_get_data_elements ) { | ||||
60 | next unless $e and exists $e->{relationships}; | ||||
61 | |||||
62 | if ( %{ $e->{relationships} } ) { | ||||
63 | for my $rel_type ( keys %{ $e->{relationships} } ) { | ||||
64 | if ( !$self->repository->has_relationship( $type, $rel_type ) ) { | ||||
65 | return $self->_bad_request( | ||||
66 | "Types `$type` and `$rel_type` are not related", | ||||
67 | 404 | ||||
68 | ); | ||||
69 | } | ||||
70 | elsif ( !$self->repository->has_one_to_many_relationship( $type, $rel_type ) | ||||
71 | and ref $e->{relationships}{$rel_type} eq 'ARRAY' | ||||
72 | and @{ $e->{relationships}{$rel_type} } > 1 | ||||
73 | ) { | ||||
74 | return $self->_bad_request( | ||||
75 | "Types `$type` and `$rel_type` are one-to-one, but got multiple values" | ||||
76 | ); | ||||
77 | } | ||||
78 | } | ||||
79 | } | ||||
80 | } | ||||
81 | |||||
82 | return 1; | ||||
83 | } | ||||
84 | |||||
85 | sub _get_data_elements { | ||||
86 | my $self = shift; | ||||
87 | return ( ref $self->data eq 'ARRAY' ? @{ $self->data } : $self->data ); | ||||
88 | } | ||||
89 | |||||
90 | 3 | 33µs | 2 | 162µs | # spent 86µs (10+76) within PONAPI::DAO::Request::Role::HasDataMethods::BEGIN@90 which was called:
# once (10µs+76µs) by Module::Runtime::require_module at line 90 # spent 86µs making 1 call to PONAPI::DAO::Request::Role::HasDataMethods::BEGIN@90
# spent 76µs making 1 call to Moose::Role::unimport |
91 | |||||
92 | __END__ |