1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
package Open311::GetUpdates;
use Moo;
use Open311;
use FixMyStreet::Cobrand;
has body_list => ( is => 'ro' );
has system_user => ( is => 'ro' );
sub get_updates {
my $self = shift;
while ( my $body = $self->body_list->next ) {
my $open311 = Open311->new(
endpoint => $body->endpoint,
jurisdiction => $body->jurisdiction,
api_key => $body->api_key
);
my $reports = $body->result_source->schema->resultset('Problem')->to_body($body)->search(
{
state => { 'IN', [qw/confirmed fixed/] },
-and => [
external_id => { '!=', undef },
external_id => { '!=', '' },
],
}
);
my @report_ids = ();
while ( my $report = $reports->next ) {
push @report_ids, $report->external_id;
}
next unless @report_ids;
$self->update_reports( \@report_ids, $open311, $body );
}
}
sub update_reports {
my ( $self, $report_ids, $open311, $body ) = @_;
my $service_requests = $open311->get_service_requests( $report_ids );
my $requests;
# XML::Simple is a bit inconsistent in how it structures
# things depending on the number of children an element has :(
if ( ref $service_requests->{request} eq 'ARRAY' ) {
$requests = $service_requests->{request};
}
else {
$requests = [ $service_requests->{request} ];
}
for my $request (@$requests) {
# if it's a ref that means it's an empty element
# however, if there's no updated date then we can't
# tell if it's newer that what we have so we should skip it
next if ref $request->{updated_datetime} || ! exists $request->{updated_datetime};
my $request_id = $request->{service_request_id};
my $problem = $body->result_source->schema->resultset('Problem')
->search( { external_id => $request_id, } );
if (my $p = $problem->first) {
my $cobrand = FixMyStreet::Cobrand->get_class_for_moniker($p->cobrand)->new();
$cobrand->set_lang_and_domain($p->lang, 1, FixMyStreet->path_to('locale')->stringify );
$p->update_from_open311_service_request( $request, $body, $self->system_user );
}
}
return 1;
}
1;
|