aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/Open311/Endpoint/Service
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/Open311/Endpoint/Service')
-rw-r--r--perllib/Open311/Endpoint/Service/Request.pm3
-rw-r--r--perllib/Open311/Endpoint/Service/Request/Update.pm57
-rw-r--r--perllib/Open311/Endpoint/Service/Request/mySociety.pm52
3 files changed, 111 insertions, 1 deletions
diff --git a/perllib/Open311/Endpoint/Service/Request.pm b/perllib/Open311/Endpoint/Service/Request.pm
index b56cee393..1d835f2d5 100644
--- a/perllib/Open311/Endpoint/Service/Request.pm
+++ b/perllib/Open311/Endpoint/Service/Request.pm
@@ -1,5 +1,6 @@
package Open311::Endpoint::Service::Request;
use Moo;
+use MooX::HandlesVia;
use Types::Standard ':all';
use namespace::clean;
@@ -57,7 +58,7 @@ has requested_datetime => (
);
has updated_datetime => (
- is => 'ro',
+ is => 'rw',
isa => Maybe[ InstanceOf['DateTime'] ],
);
diff --git a/perllib/Open311/Endpoint/Service/Request/Update.pm b/perllib/Open311/Endpoint/Service/Request/Update.pm
new file mode 100644
index 000000000..b881af9ce
--- /dev/null
+++ b/perllib/Open311/Endpoint/Service/Request/Update.pm
@@ -0,0 +1,57 @@
+package Open311::Endpoint::Service::Request::Update;
+use Moo;
+use Types::Standard ':all';
+use namespace::clean;
+
+sub BUILDARGS {
+ my ($class, %args) = @_;
+ my $service_request = delete $args{service_request};
+
+ if (! $args{status}) {
+ $args{status} = $service_request->status;
+ }
+
+ return \%args;
+}
+
+has update_id => (
+ is => 'ro',
+ isa => Maybe[Str],
+ predicate => 1,
+);
+
+has service_request_id => (
+ is => 'ro',
+ isa => Maybe[Str],
+ predicate => 1,
+);
+
+has token => (
+ is => 'ro',
+ isa => Maybe[Str],
+ predicate => 1,
+);
+
+has status => (
+ is => 'ro',
+ isa => Enum[qw/ open closed /],
+);
+
+has description => (
+ is => 'ro',
+ isa => Maybe[Str],
+);
+
+has media_url => (
+ is => 'ro',
+ isa => Str,
+ default => sub { '' },
+);
+
+has updated_datetime => (
+ is => 'ro',
+ isa => InstanceOf['DateTime'],
+ default => sub { DateTime->now() },
+);
+
+1;
diff --git a/perllib/Open311/Endpoint/Service/Request/mySociety.pm b/perllib/Open311/Endpoint/Service/Request/mySociety.pm
new file mode 100644
index 000000000..748065ad8
--- /dev/null
+++ b/perllib/Open311/Endpoint/Service/Request/mySociety.pm
@@ -0,0 +1,52 @@
+package Open311::Endpoint::Service::Request::mySociety;
+use Moo;
+use MooX::HandlesVia;
+extends 'Open311::Endpoint::Service::Request';
+
+use DateTime;
+use Open311::Endpoint::Service::Request::Update;
+use Types::Standard ':all';
+
+has updates => (
+ is => 'rw',
+ isa => ArrayRef[InstanceOf['Open311::Endpoint::Service::Request::Update']],
+ default => sub { [] },
+ handles_via => 'Array',
+ handles => {
+ _add_update => 'push',
+ get_updates => 'elements',
+ get_update => 'get',
+ has_updates => 'count',
+ filter_updates => 'grep',
+ }
+);
+
+sub add_update {
+ my ($self, %args) = @_;
+ my $update = Open311::Endpoint::Service::Request::Update->new(
+ %args,
+ service_request => $self,
+ service_request_id => $self->service_request_id,
+ );
+ $self->_add_update($update);
+}
+
+
+sub last_update {
+ my $self = shift;
+ return $self->has_updates ? $self->get_update(-1) : undef;
+}
+
+around updated_datetime => sub {
+ my ($orig, $self) = @_;
+ my $last_update = $self->last_update or return;
+ return $last_update->updated_datetime;
+};
+
+around status => sub {
+ my ($orig, $self) = @_;
+ my $last_update = $self->last_update or return 'open';
+ return $last_update->status;
+};
+
+1;