From c61b9eec5d3e46f4685c1ed05c1cb35dbfa898c8 Mon Sep 17 00:00:00 2001 From: Andreas Granig Date: Fri, 14 Feb 2014 11:01:15 +0100 Subject: [PATCH] MT#3933 API: Handle subscriber lock/termination --- lib/NGCP/Panel/Controller/API/Root.pm | 7 ++- lib/NGCP/Panel/Controller/Subscriber.pm | 43 +----------------- lib/NGCP/Panel/Form/Subscriber.pm | 2 +- lib/NGCP/Panel/Role/API.pm | 3 +- lib/NGCP/Panel/Role/API/BillingFees.pm | 2 +- lib/NGCP/Panel/Role/API/BillingProfiles.pm | 2 +- lib/NGCP/Panel/Role/API/BillingZones.pm | 2 +- lib/NGCP/Panel/Role/API/CustomerContacts.pm | 2 +- lib/NGCP/Panel/Role/API/Domains.pm | 2 +- lib/NGCP/Panel/Role/API/Resellers.pm | 2 +- lib/NGCP/Panel/Role/API/Subscribers.pm | 30 ++++++++++++- lib/NGCP/Panel/Role/API/SystemContacts.pm | 2 +- lib/NGCP/Panel/Utils/Subscriber.pm | 50 +++++++++++++++++++++ 13 files changed, 95 insertions(+), 54 deletions(-) diff --git a/lib/NGCP/Panel/Controller/API/Root.pm b/lib/NGCP/Panel/Controller/API/Root.pm index e6079e1b06..e928dc70ea 100644 --- a/lib/NGCP/Panel/Controller/API/Root.pm +++ b/lib/NGCP/Panel/Controller/API/Root.pm @@ -41,11 +41,16 @@ sub auto :Private { sub GET : Allow { my ($self, $c) = @_; + my $blacklist = { + "DomainPreferenceDefs" => 1, + "SubscriberPreferenceDefs" => 1, + }; + my @colls = $self->get_collections; foreach my $coll(@colls) { my $mod = $coll; $mod =~ s/^.+\/([a-zA-Z0-9_]+)\.pm$/$1/; - next if($mod eq "DomainPreferenceDefs"); # not a "real" collection + next if(exists $blacklist->{$mod}); my $rel = lc $mod; my $full_mod = 'NGCP::Panel::Controller::API::'.$mod; diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index aa0dd09f8b..33e77d5c84 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -460,49 +460,8 @@ sub terminate :Chained('base') :PathPart('terminate') :Args(0) :Does(ACL) :ACLDe NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/subscriber')); } - my $schema = $c->model('DB'); try { - $schema->txn_do(sub { - if($subscriber->provisioning_voip_subscriber->is_pbx_group) { - my $pbx_group = $schema->resultset('voip_pbx_groups')->find({ - subscriber_id => $subscriber->provisioning_voip_subscriber->id - }); - if($pbx_group) { - $pbx_group->provisioning_voip_subscribers->update_all({ - pbx_group_id => undef, - }); - } - $pbx_group->delete; - } - my $prov_subscriber = $subscriber->provisioning_voip_subscriber; - if($prov_subscriber) { - NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs( - c => $c, - schema => $schema, - old_group_id => $prov_subscriber->voip_pbx_group->id, - new_group_id => undef, - username => $prov_subscriber->username, - domain => $prov_subscriber->domain->domain, - ) if($prov_subscriber->voip_pbx_group); - $prov_subscriber->delete; - } - if ($c->user->roles eq 'subscriberadmin') { - NGCP::Panel::Utils::Subscriber::update_subadmin_sub_aliases( - schema => $schema, - subscriber_id => $subscriber->id, - contract_id => $subscriber->contract_id, - alias_selected => [], #none, thus moving them back to our subadmin - sadmin_id => $schema->resultset('voip_subscribers') - ->find({uuid => $c->user->uuid})->id - ); - } else { - $subscriber->voip_numbers->update_all({ - subscriber_id => undef, - reseller_id => undef, - }); - } - $subscriber->update({ status => 'terminated' }); - }); + NGCP::Panel::Utils::Subscriber::terminate(c => $c, subscriber => $subscriber); $c->flash(messages => [{type => 'success', text => $c->loc('Successfully terminated subscriber') }]); } catch($e) { NGCP::Panel::Utils::Message->error( diff --git a/lib/NGCP/Panel/Form/Subscriber.pm b/lib/NGCP/Panel/Form/Subscriber.pm index c562382c9c..5bf138e4cf 100644 --- a/lib/NGCP/Panel/Form/Subscriber.pm +++ b/lib/NGCP/Panel/Form/Subscriber.pm @@ -97,7 +97,7 @@ has_field 'status' => ( label => 'Status', element_attr => { rel => ['tooltip'], - title => ['The status of the subscriber.'] + title => ['The status of the subscriber (one of "active", "locked", "terminated").'] }, ); diff --git a/lib/NGCP/Panel/Role/API.pm b/lib/NGCP/Panel/Role/API.pm index dc4a3eb5b3..25d7e5e848 100644 --- a/lib/NGCP/Panel/Role/API.pm +++ b/lib/NGCP/Panel/Role/API.pm @@ -195,8 +195,7 @@ sub require_preference { my @preference = grep { 'return' eq $_->[0] } split_header_words($c->request->header('Prefer')); return $preference[0][1] if 1 == @preference && ('minimal' eq $preference[0][1] || 'representation' eq $preference[0][1]); - $self->error($c, HTTP_BAD_REQUEST, "This request is required to express an expectation about the response. Use the 'Prefer' header with either 'return=representation' or 'return='minimal' preference."); - return; + return 'minimal'; } sub require_wellformed_json { diff --git a/lib/NGCP/Panel/Role/API/BillingFees.pm b/lib/NGCP/Panel/Role/API/BillingFees.pm index 0dedd0d8e8..914a2c179d 100644 --- a/lib/NGCP/Panel/Role/API/BillingFees.pm +++ b/lib/NGCP/Panel/Role/API/BillingFees.pm @@ -3,7 +3,7 @@ use Moose::Role; use Sipwise::Base; use boolean qw(true); -use Try::Tiny; +use TryCatch; use Data::HAL qw(); use Data::HAL::Link qw(); use HTTP::Status qw(:constants); diff --git a/lib/NGCP/Panel/Role/API/BillingProfiles.pm b/lib/NGCP/Panel/Role/API/BillingProfiles.pm index cb98b6bcb6..d1beb7932d 100644 --- a/lib/NGCP/Panel/Role/API/BillingProfiles.pm +++ b/lib/NGCP/Panel/Role/API/BillingProfiles.pm @@ -3,7 +3,7 @@ use Moose::Role; use Sipwise::Base; use boolean qw(true); -use Try::Tiny; +use TryCatch; use Data::HAL qw(); use Data::HAL::Link qw(); use HTTP::Status qw(:constants); diff --git a/lib/NGCP/Panel/Role/API/BillingZones.pm b/lib/NGCP/Panel/Role/API/BillingZones.pm index 68e1db4967..793b001b0d 100644 --- a/lib/NGCP/Panel/Role/API/BillingZones.pm +++ b/lib/NGCP/Panel/Role/API/BillingZones.pm @@ -3,7 +3,7 @@ use Moose::Role; use Sipwise::Base; use boolean qw(true); -use Try::Tiny; +use TryCatch; use Data::HAL qw(); use Data::HAL::Link qw(); use HTTP::Status qw(:constants); diff --git a/lib/NGCP/Panel/Role/API/CustomerContacts.pm b/lib/NGCP/Panel/Role/API/CustomerContacts.pm index 4ef0c4db1f..66250961cf 100644 --- a/lib/NGCP/Panel/Role/API/CustomerContacts.pm +++ b/lib/NGCP/Panel/Role/API/CustomerContacts.pm @@ -3,7 +3,7 @@ use Moose::Role; use Sipwise::Base; use boolean qw(true); -use Try::Tiny; +use TryCatch; use Data::HAL qw(); use Data::HAL::Link qw(); use HTTP::Status qw(:constants); diff --git a/lib/NGCP/Panel/Role/API/Domains.pm b/lib/NGCP/Panel/Role/API/Domains.pm index 6d3088c208..7db06604b6 100644 --- a/lib/NGCP/Panel/Role/API/Domains.pm +++ b/lib/NGCP/Panel/Role/API/Domains.pm @@ -3,7 +3,7 @@ use Moose::Role; use Sipwise::Base; use boolean qw(true); -use Try::Tiny; +use TryCatch; use Data::HAL qw(); use Data::HAL::Link qw(); use HTTP::Status qw(:constants); diff --git a/lib/NGCP/Panel/Role/API/Resellers.pm b/lib/NGCP/Panel/Role/API/Resellers.pm index f0b79cc614..90a875c08a 100644 --- a/lib/NGCP/Panel/Role/API/Resellers.pm +++ b/lib/NGCP/Panel/Role/API/Resellers.pm @@ -3,7 +3,7 @@ use Moose::Role; use Sipwise::Base; use boolean qw(true); -use Try::Tiny; +use TryCatch; use Data::HAL qw(); use Data::HAL::Link qw(); use HTTP::Status qw(:constants); diff --git a/lib/NGCP/Panel/Role/API/Subscribers.pm b/lib/NGCP/Panel/Role/API/Subscribers.pm index ae3cf01b86..df83dee370 100644 --- a/lib/NGCP/Panel/Role/API/Subscribers.pm +++ b/lib/NGCP/Panel/Role/API/Subscribers.pm @@ -3,7 +3,7 @@ use Moose::Role; use Sipwise::Base; use boolean qw(true); -use Try::Tiny; +use TryCatch; use Data::HAL qw(); use Data::HAL::Link qw(); use HTTP::Status qw(:constants); @@ -332,6 +332,34 @@ sub update_item { my $alias_numbers = $full_resource->{alias_numbers}; my $preferences = $full_resource->{preferences}; + my $old_lock = $ + if($subscriber->status ne $resource->{status}) { + if($resource->{status} eq 'locked') { + $resource->{lock} = 4; + } elsif($subscriber->status eq 'locked' && $resource->{status} eq 'active') { + $resource->{lock} ||= 0; + } elsif($resource->{status} eq 'terminated') { + try { + NGCP::Panel::Utils::Subscriber::terminate(c => $c, subscriber => $subscriber); + } catch($e) { + $c->log->error("failed to terminate subscriber id ".$subscriber->id); + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to terminate subscriber"); + } + return; + } + } + try { + NGCP::Panel::Utils::Subscriber::lock_provisoning_voip_subscriber( + c => $c, + prov_subscriber => $subscriber->provisioning_voip_subscriber, + level => $resource->{lock}, + ); + } catch($e) { + $c->log->error("failed to lock subscriber id ".$subscriber->id." with level ".$resource->{lock}); + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to update subscriber lock"); + return; + } + NGCP::Panel::Utils::Subscriber::update_subscriber_numbers( schema => $c->model('DB'), primary_number => $resource->{e164}, diff --git a/lib/NGCP/Panel/Role/API/SystemContacts.pm b/lib/NGCP/Panel/Role/API/SystemContacts.pm index f301f82a7f..eda6327ccb 100644 --- a/lib/NGCP/Panel/Role/API/SystemContacts.pm +++ b/lib/NGCP/Panel/Role/API/SystemContacts.pm @@ -3,7 +3,7 @@ use Moose::Role; use Sipwise::Base; use boolean qw(true); -use Try::Tiny; +use TryCatch; use Data::HAL qw(); use Data::HAL::Link qw(); use HTTP::Status qw(:constants); diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index a6d3108f58..847bb4bc58 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -562,6 +562,56 @@ sub update_subadmin_sub_aliases { } } +sub terminate { + my %params = @_; + + my $c = $params{c}; + my $subscriber = $params{subscriber}; + + my $schema = $c->model('DB'); + $schema->txn_do(sub { + if($subscriber->provisioning_voip_subscriber->is_pbx_group) { + my $pbx_group = $schema->resultset('voip_pbx_groups')->find({ + subscriber_id => $subscriber->provisioning_voip_subscriber->id + }); + if($pbx_group) { + $pbx_group->provisioning_voip_subscribers->update_all({ + pbx_group_id => undef, + }); + } + $pbx_group->delete; + } + my $prov_subscriber = $subscriber->provisioning_voip_subscriber; + if($prov_subscriber) { + update_pbx_group_prefs( + c => $c, + schema => $schema, + old_group_id => $prov_subscriber->voip_pbx_group->id, + new_group_id => undef, + username => $prov_subscriber->username, + domain => $prov_subscriber->domain->domain, + ) if($prov_subscriber->voip_pbx_group); + $prov_subscriber->delete; + } + if ($c->user->roles eq 'subscriberadmin') { + update_subadmin_sub_aliases( + schema => $schema, + subscriber_id => $subscriber->id, + contract_id => $subscriber->contract_id, + alias_selected => [], #none, thus moving them back to our subadmin + sadmin_id => $schema->resultset('voip_subscribers') + ->find({uuid => $c->user->uuid})->id + ); + } else { + $subscriber->voip_numbers->update_all({ + subscriber_id => undef, + reseller_id => undef, + }); + } + $subscriber->update({ status => 'terminated' }); + }); +} + 1; =head1 NAME