aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/Open311.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/Open311.pm')
-rw-r--r--perllib/Open311.pm72
1 files changed, 31 insertions, 41 deletions
diff --git a/perllib/Open311.pm b/perllib/Open311.pm
index fb793b027..6434be1fb 100644
--- a/perllib/Open311.pm
+++ b/perllib/Open311.pm
@@ -74,17 +74,10 @@ sub send_service_request {
my $obj = $self->_get_xml_object( $response );
if ( $obj ) {
- if ( $obj->{ request }->{ service_request_id } ) {
- my $request_id = $obj->{request}->{service_request_id};
-
- unless ( ref $request_id ) {
- return $request_id;
- }
- } else {
- my $token = $obj->{ request }->{ token };
- if ( $token ) {
- return $self->get_service_request_id_from_token( $token );
- }
+ if ( my $request_id = $obj->{request}->[0]->{service_request_id} ) {
+ return $request_id unless ref $request_id;
+ } elsif ( my $token = $obj->{request}->[0]->{token} ) {
+ return $self->get_service_request_id_from_token( $token );
}
}
@@ -215,8 +208,8 @@ sub get_service_request_id_from_token {
my $obj = $self->_get_xml_object( $service_token_xml );
- if ( $obj && $obj->{ request }->{ service_request_id } ) {
- return $obj->{ request }->{ service_request_id };
+ if ( $obj && $obj->{request}->[0]->{service_request_id} ) {
+ return $obj->{request}->[0]->{service_request_id};
} else {
return 0;
}
@@ -240,15 +233,7 @@ sub get_service_request_updates {
my $xml = $self->_get( $self->endpoints->{service_request_updates}, $params || undef );
my $service_requests = $self->_get_xml_object( $xml );
- my $requests;
- if ( ref $service_requests->{request_update } eq 'ARRAY' ) {
- $requests = $service_requests->{request_update};
- }
- else {
- $requests = [ $service_requests->{request_update} ];
- }
-
- return $requests;
+ return $service_requests->{request_update};
}
sub post_service_request_update {
@@ -263,16 +248,10 @@ sub post_service_request_update {
my $obj = $self->_get_xml_object( $response );
if ( $obj ) {
- if ( $obj->{ request_update }->{ update_id } ) {
- my $update_id = $obj->{request_update}->{update_id};
-
- # if there's nothing in the update_id element we get a HASHREF back
- unless ( ref $update_id ) {
- return $obj->{ request_update }->{ update_id };
- }
+ if ( my $update_id = $obj->{request_update}->[0]->{update_id} ) {
+ return $update_id unless ref $update_id;
} else {
- my $token = $obj->{ request_update }->{ token };
- if ( $token ) {
+ if ( my $token = $obj->{request_update}->[0]->{token} ) {
return $self->get_service_request_id_from_token( $token );
}
}
@@ -455,7 +434,6 @@ sub _process_error {
my $msg = '';
if ( ref $obj && exists $obj->{error} ) {
my $errors = $obj->{error};
- $errors = [ $errors ] if ref $errors ne 'ARRAY';
$msg .= sprintf( "%s: %s\n", $_->{code}, $_->{description} ) for @{ $errors };
}
@@ -463,16 +441,28 @@ sub _process_error {
}
sub _get_xml_object {
- my $self = shift;
- my $xml= shift;
-
- my $simple = XML::Simple->new();
- my $obj;
-
- eval {
- $obj = $simple ->parse_string( $xml, ForceArray => [ qr/^key$/, qr/^name$/ ] );
+ my ($self, $xml) = @_;
+
+ # Of these, services/service_requests/service_request_updates are root
+ # elements, so GroupTags has no effect, but this is used in ForceArray too.
+ my $group_tags = {
+ services => 'service',
+ attributes => 'attribute',
+ values => 'value',
+ service_requests => 'request',
+ errors => 'error',
+ service_request_updates => 'request_update',
+ };
+ my $simple = XML::Simple->new(
+ ForceArray => [ values %$group_tags ],
+ KeyAttr => {},
+ GroupTags => $group_tags,
+ SuppressEmpty => undef,
+ );
+ my $obj = eval {
+ $simple->parse_string($xml);
};
-
return $obj;
}
+
1;