aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/Open311/GetUpdates.pm
blob: 5d5291d478eea5967db5949feb0b15b0310cf8ed (plain)
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
79
80
81
82
package Open311::GetUpdates;

use Moose;
use Open311;
use FixMyStreet::App;

has council_list => ( is => 'ro' );
has system_user => ( is => 'ro' );

sub get_updates {
    my $self = shift;

    while ( my $council = $self->council_list->next ) {
        my $open311 = Open311->new(
            endpoint     => $council->endpoint,
            jurisdiction => $council->jurisdiction,
            api_key      => $council->api_key
        );

        my $area_id = $council->area_id;

        my $council_details = mySociety::MaPit::call( 'area', $area_id );

        my $reports = FixMyStreet::App->model('DB::Problem')->search(
            {
                council => { like => "\%$area_id\%" },
                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, $council_details );
    }
}

sub update_reports {
    my ( $self, $report_ids, $open311, $council_details ) = @_;

    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 =
          FixMyStreet::App->model('DB::Problem')
          ->search( { external_id => $request_id, } );

        if (my $p = $problem->first) {
            $p->update_from_open311_service_request( $request, $council_details, $self->system_user );
        }
    }

    return 1;
}

1;