package Open311::Endpoint::Role::mySociety;
=head1 NAME
Open311::Endpoint::Role::mySociety - mySociety's proposed Open311 extensions
=head1 SYNOPSIS
See mySociety's
L
and
L
for a full explanation of the spec extension.
You can use the extensions as follows:
package My::Open311::Endpoint;
use Web::Simple;
extends 'Open311::Endpoint';
with 'Open311::Endpoint::Role::mySociety';
You will have to provide implementations of
get_service_request_updates
post_service_request_update
You will need to return L
objects. However, the root L is not
aware of updates, so you may may find it easier to ensure that the ::Service
objects you create (with get_service_request etc.) return
L objects.
=cut
use Moo::Role;
no warnings 'illegalproto';
use Open311::Endpoint::Service::Request::mySociety;
has '+request_class' => (
is => 'ro',
default => 'Open311::Endpoint::Service::Request::mySociety',
);
around dispatch_request => sub {
my ($orig, $self, @args) = @_;
my @dispatch = $self->$orig(@args);
return (
@dispatch,
sub (GET + /servicerequestupdates + ?*) {
my ($self, $args) = @_;
$self->call_api( GET_Service_Request_Updates => $args );
},
sub (POST + /servicerequestupdates + ?*) {
my ($self, $args) = @_;
$self->call_api( POST_Service_Request_Update => $args );
},
);
};
sub GET_Service_Request_Updates_input_schema {
my $self = shift;
return {
type => '//rec',
required => {
$self->get_jurisdiction_id_required_clause,
},
optional => {
$self->get_jurisdiction_id_optional_clause,
api_key => $self->get_identifier_type('api_key'),
start_date => '/open311/datetime',
end_date => '/open311/datetime',
}
};
}
sub GET_Service_Request_Updates_output_schema {
my $self = shift;
return {
type => '//rec',
required => {
service_request_updates => {
type => '//arr',
contents => '/open311/service_request_update',
},
},
};
}
sub GET_Service_Request_Updates {
my ($self, $args) = @_;
my @updates = $self->get_service_request_updates({
jurisdiction_id => $args->{jurisdiction_id},
start_date => $args->{start_date},
end_date => $args->{end_date},
});
$self->format_updates(@updates);
}
sub format_updates {
my ($self, @updates) = @_;
return {
service_request_updates => [
map {
my $update = $_;
+{
(
map {
$_ => $update->$_,
}
qw/
update_id
service_request_id
status
description
media_url
/
),
(
map {
$_ => $self->w3_dt->format_datetime( $update->$_ ),
}
qw/
updated_datetime
/
),
}
} @updates
]
};
}
sub get_service_request_updates {
my ($self, $args) = @_;
die "abstract method get_service_request_updates not overridden";
}
sub learn_additional_types {
my ($self, $schema) = @_;
$schema->learn_type( 'tag:wiki.open311.org,GeoReport_v2:rx/service_request_update',
{
type => '//rec',
required => {
service_request_id => $self->get_identifier_type('service_request_id'),
update_id => $self->get_identifier_type('update_id'),
status => '/open311/status',
updated_datetime => '/open311/datetime',
description => '//str',
media_url => '//str',
},
}
);
}
1;