diff options
Diffstat (limited to 'perllib/Open311/Endpoint/Service')
-rw-r--r-- | perllib/Open311/Endpoint/Service/Request.pm | 3 | ||||
-rw-r--r-- | perllib/Open311/Endpoint/Service/Request/Update.pm | 57 | ||||
-rw-r--r-- | perllib/Open311/Endpoint/Service/Request/mySociety.pm | 52 |
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; |