diff --git a/lib/NGCP/Panel/Controller/API/SubscriberRegistrations.pm b/lib/NGCP/Panel/Controller/API/SubscriberRegistrations.pm index 26c418fe0f..6de8592704 100644 --- a/lib/NGCP/Panel/Controller/API/SubscriberRegistrations.pm +++ b/lib/NGCP/Panel/Controller/API/SubscriberRegistrations.pm @@ -27,6 +27,25 @@ class_has 'query_params' => ( is => 'ro', isa => 'ArrayRef', default => sub {[ + { + param => 'subscriber_id', + description => 'Filter for registrations of a specific subscriber', + query => { + first => sub { + my $q = shift; + my $h = + return { + 'voip_subscriber.id' => $q, + 'domain.id' => { -ident => 'subscriber.domain_id' }, + }; + }, + second => sub { + return { + join => [{ subscriber => 'voip_subscriber' }, 'domain'] + }; + }, + }, + }, ]}, ); @@ -71,7 +90,9 @@ sub GET :Allow { my (@embedded, @links); my $form = $self->get_form($c); for my $item ($items->search({}, {order_by => {-asc => 'me.id'}})->all) { - push @embedded, $self->hal_from_item($c, $item, $form); + my $halitem = $self->hal_from_item($c, $item, $form); + next unless($halitem); + push @embedded, $halitem; push @links, Data::HAL::Link->new( relation => 'ngcp:'.$self->resource_name, href => sprintf('/%s%d', $c->request->path, $item->id), diff --git a/lib/NGCP/Panel/Controller/API/SubscriberRegistrationsItem.pm b/lib/NGCP/Panel/Controller/API/SubscriberRegistrationsItem.pm index 96894fda25..7905391ce7 100644 --- a/lib/NGCP/Panel/Controller/API/SubscriberRegistrationsItem.pm +++ b/lib/NGCP/Panel/Controller/API/SubscriberRegistrationsItem.pm @@ -48,6 +48,10 @@ sub GET :Allow { last unless $self->resource_exists($c, subscriberregistration => $item); my $hal = $self->hal_from_item($c, $item); + unless($hal) { + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid location entry"); + last; + } my $response = HTTP::Response->new(HTTP_OK, undef, HTTP::Headers->new( (map { # XXX Data::HAL must be able to generate links with multiple relations diff --git a/lib/NGCP/Panel/Role/API/SubscriberRegistrations.pm b/lib/NGCP/Panel/Role/API/SubscriberRegistrations.pm index d3ee74939a..03cc07135e 100644 --- a/lib/NGCP/Panel/Role/API/SubscriberRegistrations.pm +++ b/lib/NGCP/Panel/Role/API/SubscriberRegistrations.pm @@ -17,7 +17,15 @@ use NGCP::Panel::Utils::Kamailio; sub item_rs { my ($self, $c) = @_; - my $item_rs = $c->model('DB')->resultset('location'); + my @joins = ('subscriber'); + if($c->config->{features}->{multidomain}) { + push @joins, 'domain'; + } + my $item_rs = $c->model('DB')->resultset('location')->search({ + + },{ + join => \@joins, + }); if($c->user->roles eq "admin") { } elsif($c->user->roles eq "reseller") { $item_rs = $item_rs->search({ @@ -38,6 +46,7 @@ sub hal_from_item { my ($self, $c, $item, $form) = @_; $form //= $self->get_form($c); my $resource = $self->resource_from_item($c, $item, $form); + return unless $resource; my $hal = Data::HAL->new( links => [ @@ -97,14 +106,13 @@ sub subscriber_from_item { }); if($c->config->{features}->{multidomain}) { $sub_rs = $sub_rs->search({ - 'domain.domain' => $item->domain, + 'domain.domain' => $item->domain->domain, }, { join => 'domain', }); } my $sub = $sub_rs->first; unless($sub && $sub->provisioning_voip_subscriber) { - $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "No subscriber for location entry found"); return; } return $sub; diff --git a/lib/NGCP/Panel/Role/API/Subscribers.pm b/lib/NGCP/Panel/Role/API/Subscribers.pm index 659fe663a3..36f95e28e3 100644 --- a/lib/NGCP/Panel/Role/API/Subscribers.pm +++ b/lib/NGCP/Panel/Role/API/Subscribers.pm @@ -108,7 +108,8 @@ sub hal_from_item { ($item->provisioning_voip_subscriber && $item->provisioning_voip_subscriber->profile_id) ? (Data::HAL::Link->new(relation => 'ngcp:subscriberprofiles', href => sprintf("/api/subscriberprofiles/%d", $item->provisioning_voip_subscriber->profile_id))) : (), Data::HAL::Link->new(relation => 'ngcp:calls', href => sprintf("/api/calls/?subscriber_id=%d", $item->id)), Data::HAL::Link->new(relation => 'ngcp:voicemailsettings', href => sprintf("/api/voicemailsettings/%d", $item->id)), - #Data::HAL::Link->new(relation => 'ngcp:registrations', href => sprintf("/api/registrations/%d", $item->contract->id)), + Data::HAL::Link->new(relation => 'ngcp:subscriberregistrations', href => sprintf("/api/subscriberregistrations/?subscriber_id=%d", $item->id)), + Data::HAL::Link->new(relation => 'ngcp:reminders', href => sprintf("/api/reminders/?subscriber_id=%d", $item->id)), #Data::HAL::Link->new(relation => 'ngcp:trustedsources', href => sprintf("/api/trustedsources/%d", $item->contract->id)), ], relation => 'ngcp:'.$self->resource_name,