MT#61805 add API phonebook support for top level inclusion

* /api/customerphonebookentries now support "include" query param
  that can be either "include=all", "include=shared" or
  "include=reseller".
  With "include=all" - shared and reseller entries are included
  and merged as customer > shared > reseller.
  With "include=shared" - shared entries are included
  and merged as customer > shared.
  With "include=reseller" - reseller entries are included
  and merged as customer > reseller.
* /api/subscriberphonebookentries now support "include" query param
  that can be either "include=all", "include=customer"
  or "include=reseller"
  With "include=all" - customer+shared+reseller entries are included,
  and merged as subscriber > customer > shared > reseller.
  With "include=customer" - customer+shared entries are included,
  and merged as subscriber > customer > shared.
  With "include=reseller" - customer+reseller entries are included,
  and merged as subscriber > reseller.
* Shared numbers are considered belonging to the customer so when
  on the customer level the same number is provided, it takes
  precedence.
* It is not possible to edit other level included numbers (they have
  composide ids).
* It is possible to access an included number directly by the id.

Change-Id: Ice06bc0961d42a9b64db59aa93029d7505b4805e
mr13.3
Kirill Solomko 2 months ago
parent 70ec201834
commit ef4442feeb

@ -53,6 +53,11 @@ sub query_params {
description => 'Filter for Phonebook numbers with a specific name',
query_type => 'wildcard',
},
{
param => 'include',
description => 'Include phonebook entries shared by subscribers and/or from reseller. Accepted values: all,shared,reseller',
# only for doc
},
];
}

@ -52,6 +52,11 @@ sub query_params {
description => 'Filter for Phonebook entries that are marked as shared',
query_type => 'string_eq',
},
{
param => 'include',
description => 'Include phonebook entries shared by subscribers, and/or from reseller, and/or from customer. Accepted values: all,reseller,customer',
# only for doc
},
];
}

@ -7,6 +7,8 @@ use parent 'NGCP::Panel::Role::API';
use HTTP::Status qw(:constants);
use NGCP::Panel::Utils::Phonebook;
sub resource_name {
return 'customerphonebookentries';
}
@ -14,9 +16,21 @@ sub resource_name {
sub _item_rs {
my ($self, $c) = @_;
my $params = $c->req->params;
my $item_rs = $c->model('DB')->resultset('contract_phonebook');
if ($c->user->roles eq 'reseller') {
if ($c->req->method eq 'GET' && $params->{include}) {
if ($params->{include} eq 'all') {
$item_rs = $c->model('DB')->resultset('v_contract_phonebook');
} elsif ($params->{include} eq 'shared') {
$item_rs = $c->model('DB')->resultset('v_contract_shared_phonebook');
} elsif ($params->{include} eq 'reseller') {
$item_rs = $c->model('DB')->resultset('v_contract_reseller_phonebook');
}
}
if ($c->user->roles eq 'reseller' || $c->user->roles eq 'ccare') {
$item_rs = $item_rs->search({
'contact.reseller_id' => $c->user->reseller_id,
},{
@ -31,6 +45,24 @@ sub _item_rs {
return $item_rs;
}
sub get_item_id {
my ($self, $c, $item, $resource, $form, $params) = @_;
return blessed $item ? $item->id : $item->{id};
}
sub valid_id {
my ($self, $c, $id) = @_;
return 1 if is_int($id) || $id =~ /^[csr\d]+$/;
$self->error($c, HTTP_BAD_REQUEST, "Invalid id in request URI");
return;
}
sub item_by_id {
my ($self, $c, $id) = @_;
my $item_rs = $self->item_rs($c);
return $item_rs->search({ 'me.id' => $id })->first;
}
sub get_form {
my ($self, $c) = @_;
@ -40,6 +72,7 @@ sub get_form {
sub process_hal_resource {
my($self, $c, $item, $resource, $form) = @_;
$resource->{customer_id} = delete $resource->{contract_id};
$resource->{shared} //= 0;
return $resource;
}

@ -14,9 +14,21 @@ sub resource_name {
sub _item_rs {
my ($self, $c) = @_;
my $params = $c->req->params;
my $item_rs = $c->model('DB')->resultset('subscriber_phonebook');
if ($c->user->roles eq 'reseller') {
if ($c->req->method eq 'GET' && $params->{include}) {
if ($params->{include} eq 'all') {
$item_rs = $c->model('DB')->resultset('v_subscriber_phonebook');
} elsif ($params->{include} eq 'reseller') {
$item_rs = $c->model('DB')->resultset('v_subscriber_reseller_phonebook');
} elsif ($params->{include} eq 'customer') {
$item_rs = $c->model('DB')->resultset('v_subscriber_contract_phonebook');
}
}
if ($c->user->roles eq 'reseller' || $c->user->roles eq 'ccare') {
$item_rs = $item_rs->search({
'contact.reseller_id' => $c->user->reseller_id,
},{
@ -37,6 +49,24 @@ sub _item_rs {
return $item_rs;
}
sub get_item_id {
my ($self, $c, $item, $resource, $form, $params) = @_;
return blessed $item ? $item->id : $item->{id};
}
sub valid_id {
my ($self, $c, $id) = @_;
return 1 if is_int($id) || $id =~ /^[csr\d]+$/;
$self->error($c, HTTP_BAD_REQUEST, "Invalid id in request URI");
return;
}
sub item_by_id {
my ($self, $c, $id) = @_;
my $item_rs = $self->item_rs($c);
return $item_rs->search({ 'me.id' => $id })->first;
}
sub get_form {
my ($self, $c) = @_;

Loading…
Cancel
Save