* /api/phonebookentries is used for the
phonebook_reseller
phonebook_contract
phonebook_subscriber data storage interaction
Change-Id: If45390fd3080886e03602216cfbacc33296f1558
changes/70/19870/16
parent
2252eff81a
commit
60e209ca84
@ -0,0 +1,100 @@
|
||||
package NGCP::Panel::Controller::API::PhonebookEntries;
|
||||
use NGCP::Panel::Utils::Generic qw(:all);
|
||||
|
||||
use Sipwise::Base;
|
||||
|
||||
use boolean qw(true);
|
||||
use Data::HAL qw();
|
||||
use Data::HAL::Link qw();
|
||||
use HTTP::Headers qw();
|
||||
use HTTP::Status qw(:constants);
|
||||
|
||||
use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::PhonebookEntries/;
|
||||
|
||||
__PACKAGE__->set_config({
|
||||
POST => {
|
||||
'ContentType' => ['text/csv', 'application/json'],
|
||||
},
|
||||
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
|
||||
});
|
||||
|
||||
sub allowed_methods{
|
||||
return [qw/GET POST OPTIONS HEAD/];
|
||||
}
|
||||
|
||||
sub api_description {
|
||||
return 'Defines Phonebook number entries. You can POST numbers individually one-by-one using json. To bulk-upload numbers, specify the Content-Type as "text/csv" and POST the CSV in the request body to the collection with an optional parameter "purge_existing=true", like "/api/phonebookentries/?purge_existing=true"';
|
||||
};
|
||||
|
||||
sub query_params {
|
||||
return [
|
||||
{
|
||||
param => 'reseller_id',
|
||||
description => 'Filter for Phonebook entries belonging to a specific reseeller',
|
||||
query => {
|
||||
first => sub {
|
||||
my $q = shift;
|
||||
{ reseller_id => $q };
|
||||
},
|
||||
second => sub {},
|
||||
},
|
||||
},
|
||||
{
|
||||
param => 'contract_id',
|
||||
description => 'Filter for Phonebook entries belonging to a specific contract',
|
||||
query => {
|
||||
first => sub {
|
||||
my $q = shift;
|
||||
{ contract_id => $q };
|
||||
},
|
||||
second => sub {},
|
||||
},
|
||||
},
|
||||
{
|
||||
param => 'subscriber_id',
|
||||
description => 'Filter for Phonebook entries belonging to a specific subscriber',
|
||||
query => {
|
||||
first => sub {
|
||||
my $q = shift;
|
||||
{ subscriber_id => $q };
|
||||
},
|
||||
second => sub {},
|
||||
},
|
||||
},
|
||||
{
|
||||
param => 'number',
|
||||
description => 'Filter for LNP numbers with a specific number (wildcards possible)',
|
||||
query => {
|
||||
first => sub {
|
||||
my $q = shift;
|
||||
{ 'me.number' => { like => $q } };
|
||||
},
|
||||
second => sub {},
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
sub check_create_csv :Private {
|
||||
my ($self, $c) = @_;
|
||||
return 'phonebookentries_list.csv';
|
||||
}
|
||||
|
||||
sub create_csv :Private {
|
||||
my ($self, $c) = @_;
|
||||
NGCP::Panel::Utils::Phonebook::create_csv(
|
||||
c => $c,
|
||||
);
|
||||
}
|
||||
|
||||
sub create_item {
|
||||
my ($self, $c, $resource, $form, $process_extras) = @_;
|
||||
my $rs = $self->_item_rs($c,undef,$resource);#maybe copy-paste it here?
|
||||
return unless $rs;
|
||||
my $item = $rs->create($resource);
|
||||
return $item;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
# vim: set tabstop=4 expandtab:
|
||||
@ -0,0 +1,23 @@
|
||||
package NGCP::Panel::Controller::API::PhonebookEntriesItem;
|
||||
use NGCP::Panel::Utils::Generic qw(:all);
|
||||
|
||||
use Sipwise::Base;
|
||||
|
||||
use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::PhonebookEntries/;
|
||||
|
||||
use Data::HAL qw();
|
||||
use Data::HAL::Link qw();
|
||||
use HTTP::Headers qw();
|
||||
use HTTP::Status qw(:constants);
|
||||
|
||||
__PACKAGE__->set_config({
|
||||
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
|
||||
});
|
||||
|
||||
sub allowed_methods{
|
||||
return [qw/GET OPTIONS HEAD PATCH PUT DELETE/];
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
# vim: set tabstop=4 expandtab:
|
||||
@ -0,0 +1,46 @@
|
||||
package NGCP::Panel::Form::Phonebook::CustomerAPI;
|
||||
|
||||
use HTML::FormHandler::Moose;
|
||||
extends 'HTML::FormHandler';
|
||||
|
||||
has_field 'id' => (
|
||||
type => 'PosInteger',
|
||||
required => 0,
|
||||
label => 'Phonebook entry id',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['Phonebook entry id'],
|
||||
},
|
||||
);
|
||||
|
||||
has_field 'contract_id' => (
|
||||
type => 'PosInteger',
|
||||
required => 0,
|
||||
label => 'Phonebook entry contract id',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['Phonebook entry contract id'],
|
||||
},
|
||||
);
|
||||
|
||||
has_field 'name' => (
|
||||
type => 'Text',
|
||||
required => 1,
|
||||
label => 'Phonebook entry name',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['The full entry name "e.g. John Smith".'],
|
||||
},
|
||||
);
|
||||
|
||||
has_field 'number' => (
|
||||
type => 'Text',
|
||||
required => 1,
|
||||
label => 'Phonebook number',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['The phonebook number, can be either as a numeric or a SIP number.' ],
|
||||
},
|
||||
);
|
||||
|
||||
1;
|
||||
@ -0,0 +1,46 @@
|
||||
package NGCP::Panel::Form::Phonebook::ResellerAPI;
|
||||
|
||||
use HTML::FormHandler::Moose;
|
||||
extends 'HTML::FormHandler';
|
||||
|
||||
has_field 'id' => (
|
||||
type => 'PosInteger',
|
||||
required => 0,
|
||||
label => 'Phonebook entry id',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['Phonebook entry id'],
|
||||
},
|
||||
);
|
||||
|
||||
has_field 'reseller_id' => (
|
||||
type => 'PosInteger',
|
||||
required => 0,
|
||||
label => 'Phonebook entry reseller id',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['Phonebook entry subscriber id'],
|
||||
},
|
||||
);
|
||||
|
||||
has_field 'name' => (
|
||||
type => 'Text',
|
||||
required => 1,
|
||||
label => 'Phonebook entry name',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['The full entry name "e.g. John Smith".'],
|
||||
},
|
||||
);
|
||||
|
||||
has_field 'number' => (
|
||||
type => 'Text',
|
||||
required => 1,
|
||||
label => 'Phonebook number',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['The phonebook number, can be either as a numeric or a SIP number.' ],
|
||||
},
|
||||
);
|
||||
|
||||
1;
|
||||
@ -0,0 +1,57 @@
|
||||
package NGCP::Panel::Form::Phonebook::SubscriberAPI;
|
||||
|
||||
use HTML::FormHandler::Moose;
|
||||
extends 'HTML::FormHandler';
|
||||
|
||||
has_field 'id' => (
|
||||
type => 'PosInteger',
|
||||
required => 0,
|
||||
label => 'Phonebook entry id',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['Phonebook entry id'],
|
||||
},
|
||||
);
|
||||
|
||||
has_field 'subscriber_id' => (
|
||||
type => 'PosInteger',
|
||||
required => 0,
|
||||
label => 'Phonebook entry subscriber id',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['Phonebook entry subscriber id'],
|
||||
},
|
||||
);
|
||||
|
||||
has_field 'name' => (
|
||||
type => 'Text',
|
||||
required => 1,
|
||||
label => 'Phonebook entry name',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['The full entry name "e.g. John Smith".'],
|
||||
},
|
||||
);
|
||||
|
||||
has_field 'number' => (
|
||||
type => 'Text',
|
||||
required => 1,
|
||||
label => 'Phonebook number',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['The phonebook number, can be either as a numeric or a SIP number.' ],
|
||||
},
|
||||
);
|
||||
|
||||
has_field 'shared' => (
|
||||
type => 'Boolean',
|
||||
required => 0,
|
||||
default_value => 0,
|
||||
label => 'Share phonebook entry',
|
||||
element_attr => {
|
||||
rel => ['tooltip'],
|
||||
title => ['Define if the Phonebook entry is visible to other subscribers within the same contract'],
|
||||
},
|
||||
);
|
||||
|
||||
1;
|
||||
@ -0,0 +1,219 @@
|
||||
package NGCP::Panel::Role::API::PhonebookEntries;
|
||||
use NGCP::Panel::Utils::Generic qw(:all);
|
||||
|
||||
use Sipwise::Base;
|
||||
|
||||
use parent 'NGCP::Panel::Role::API';
|
||||
|
||||
no strict 'refs';
|
||||
|
||||
use boolean qw(true);
|
||||
use Data::HAL qw();
|
||||
use Data::HAL::Link qw();
|
||||
use HTTP::Status qw(:constants);
|
||||
|
||||
sub resource_name{
|
||||
return 'phonebookentries';
|
||||
}
|
||||
|
||||
sub dispatch_path{
|
||||
return '/api/phonebookentries/';
|
||||
}
|
||||
|
||||
sub relation{
|
||||
return 'http://purl.org/sipwise/ngcp-api/#rel-phonebookentries';
|
||||
}
|
||||
|
||||
sub _item_rs {
|
||||
my ($self, $c, $id, $resource) = @_;
|
||||
my $params = $c->request->query_params;
|
||||
my($owner,$type,$parameter,$value) = $self->check_owner_params($c, $params);
|
||||
return unless $owner;
|
||||
my $method = 'get_'.$type.'_phonebook_rs';
|
||||
my ($list_rs,$item_rs) = &$method($c, $value, $type);
|
||||
return $list_rs;
|
||||
}
|
||||
|
||||
sub item_by_id {
|
||||
my ($self, $c, $id) = @_;
|
||||
my $item_rs = $self->item_rs($c, $id);
|
||||
return unless $item_rs;
|
||||
return $item_rs->find($id);
|
||||
}
|
||||
|
||||
sub get_form {
|
||||
my ($self, $c) = @_;
|
||||
my $params = $c->request->query_params;
|
||||
if ($params) {
|
||||
if ($params->{reseller_id}) {
|
||||
return NGCP::Panel::Form::get("NGCP::Panel::Form::Phonebook::ResellerAPI", $c);
|
||||
} elsif ($params->{customer_id}) {
|
||||
return NGCP::Panel::Form::get("NGCP::Panel::Form::Phonebook::CustomerAPI", $c);
|
||||
} elsif ($params->{subscriber_id}) {
|
||||
return NGCP::Panel::Form::get("NGCP::Panel::Form::Phonebook::SubscriberAPI", $c);
|
||||
}
|
||||
}
|
||||
if ($c->user->roles eq "admin") {
|
||||
return NGCP::Panel::Form::get("NGCP::Panel::Form::Phonebook::ResellerAPI", $c);
|
||||
} elsif ($c->user->roles eq "reseller") {
|
||||
return NGCP::Panel::Form::get("NGCP::Panel::Form::Phonebook::ResellerAPI", $c);
|
||||
} elsif ($c->user->roles eq 'subscriber' ||
|
||||
$c->user->roles eq 'subscriberadmin') {
|
||||
return NGCP::Panel::Form::get("NGCP::Panel::Form::Phonebook::SubscriberAPI", $c);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub check_owner_params {
|
||||
my($self, $c, $params) = @_;
|
||||
my @allowed_params;
|
||||
if ($c->user->roles eq "admin") {
|
||||
@allowed_params = qw/reseller_id customer_id subscriber_id/;
|
||||
} elsif ($c->user->roles eq "reseller") {
|
||||
@allowed_params = qw/reseller_id customer_id subscriber_id/;
|
||||
} elsif ($c->user->roles eq 'subscriberadmin') {
|
||||
@allowed_params = qw/customer_id subscriber_id/;
|
||||
} elsif ($c->user->roles eq 'subscriber') {
|
||||
@allowed_params = qw/subscriber_id/;
|
||||
}
|
||||
|
||||
$params //= $c->request->params;
|
||||
my %owner_params =
|
||||
map { $_ => $params->{$_} }
|
||||
grep { exists $params->{$_} }
|
||||
(qw/reseller_id customer_id subscriber_id/);
|
||||
|
||||
if (!grep { exists $owner_params{$_} } @allowed_params) {
|
||||
$c->log->error('"'.join('" or "', @allowed_params).'" should be specified');
|
||||
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, '"'.join('" or "', @allowed_params).'" should be specified.');
|
||||
return;
|
||||
}
|
||||
|
||||
if (scalar keys %owner_params > 1) {
|
||||
$c->log->error('Too many owners: '.join(',',keys %owner_params));
|
||||
$self->error($c, HTTP_UNPROCESSABLE_ENTITY,
|
||||
sprintf("Only one of either %s should be specified",
|
||||
join(' or ', @allowed_params)));
|
||||
return;
|
||||
}
|
||||
|
||||
my $schema = $c->model('DB');
|
||||
my ($parameter,$value) = each %owner_params;
|
||||
my ($owner,$type);
|
||||
|
||||
unless (is_int($value)) {
|
||||
$c->log->error('Invalid owner id '.join(',',keys %owner_params));
|
||||
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid owner id");
|
||||
return;
|
||||
}
|
||||
|
||||
if ($parameter eq 'reseller_id') {
|
||||
$type = 'reseller';
|
||||
if ($c->user->roles eq "admin" ||
|
||||
($c->user->roles eq "reseller" &&
|
||||
$c->user->reseller_id == $value)) {
|
||||
$owner = $schema->resultset('resellers')->find($value);
|
||||
}
|
||||
} elsif ($parameter eq 'customer_id') {
|
||||
$type = 'contract';
|
||||
if ($c->user->roles eq "admin") {
|
||||
$owner = $schema->resultset('contracts')->find($value);
|
||||
} elsif ($c->user->roles eq "reseller") {
|
||||
$owner = $schema->resultset('contracts')->find({
|
||||
id => $value,
|
||||
'contact.reseller_id' => $c->user->reseller_id,
|
||||
},{
|
||||
join => 'contact',
|
||||
});
|
||||
} elsif ($c->user->roles eq 'subscriberadmin' &&
|
||||
$c->user->voip_subscriber->contract_id == $value) {
|
||||
$owner = $schema->resultset('contracts')->find({ id => $value });
|
||||
}
|
||||
} elsif ($parameter eq 'subscriber_id') {
|
||||
$type = 'subscriber';
|
||||
if ($c->user->roles eq "admin") {
|
||||
$owner = $schema->resultset('voip_subscribers')->find($value);
|
||||
} elsif ($c->user->roles eq "reseller") {
|
||||
$owner = $schema->resultset('voip_subscribers')->find({
|
||||
id => $value,
|
||||
'contact.reseller_id' => $c->user->reseller_id,
|
||||
},{
|
||||
join => { 'contract' => 'contact' },
|
||||
});
|
||||
} elsif (($c->user->roles eq 'subscriberadmin' ||
|
||||
$c->user->roles eq "subscriber") &&
|
||||
$c->user->voip_subscriber->id == $value) {
|
||||
$owner = $schema->resultset('voip_subscribers')->find({ id => $value });
|
||||
}
|
||||
}
|
||||
|
||||
unless($owner) {
|
||||
$c->log->error("Unknown $parameter value '$value'");
|
||||
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Unknown $parameter value '$value'");
|
||||
return;
|
||||
}
|
||||
|
||||
return ($owner,$type,$parameter,$value);
|
||||
}
|
||||
|
||||
sub get_reseller_phonebook_rs {
|
||||
my ($c, $reseller_id, $context) = @_;
|
||||
|
||||
my $list_rs = $c->model('DB')->resultset('reseller_phonebook')->search_rs({
|
||||
reseller_id => $reseller_id,
|
||||
},{
|
||||
columns => [qw/id name number/,
|
||||
{ 'owner_id' => 'me.reseller_id' } ,
|
||||
{ 'shared' => \'0'},
|
||||
],
|
||||
});
|
||||
|
||||
my $item_rs = $c->model('DB')->resultset('reseller_phonebook');
|
||||
return ($list_rs,$item_rs);
|
||||
}
|
||||
|
||||
sub get_contract_phonebook_rs {
|
||||
my ($c, $contract_id, $context) = @_;
|
||||
|
||||
my $contract_rs = $c->model('DB')->resultset('contracts')->search({
|
||||
id => $contract_id,
|
||||
})->first;
|
||||
|
||||
my $contract_pb_rs = $c->model('DB')->resultset('contract_phonebook')->search_rs({
|
||||
contract_id => $contract_id,
|
||||
},{
|
||||
columns => [qw/id name number/,
|
||||
{ 'owner_id' => 'me.contract_id' } ,
|
||||
{ 'shared' => \'0'},
|
||||
],
|
||||
});
|
||||
|
||||
my $list_rs = $contract_pb_rs;
|
||||
my $item_rs = $c->model('DB')->resultset('contract_phonebook');
|
||||
return ($list_rs,$item_rs);
|
||||
}
|
||||
|
||||
sub get_subscriber_phonebook_rs {
|
||||
my ($c, $subscriber_id) = @_;
|
||||
|
||||
my $subscriber_rs = $c->model('DB')->resultset('voip_subscribers')->search({
|
||||
id => $subscriber_id,
|
||||
})->first;
|
||||
|
||||
my $subscriber_pb_rs = $c->model('DB')->resultset('subscriber_phonebook')->search_rs({
|
||||
subscriber_id => $subscriber_id,
|
||||
},{
|
||||
columns => [qw/id name number/,
|
||||
{ 'owner_id' => 'me.subscriber_id' } ,
|
||||
{ 'shared' => 'me.shared'},
|
||||
],
|
||||
'join' => 'subscriber',
|
||||
});
|
||||
|
||||
my $list_rs = $subscriber_pb_rs;
|
||||
my $item_rs = $c->model('DB')->resultset('subscriber_phonebook');
|
||||
return ($list_rs,$item_rs);
|
||||
}
|
||||
|
||||
1;
|
||||
# vim: set tabstop=4 expandtab:
|
||||
Loading…
Reference in new issue