diff --git a/lib/NGCP/Panel/Controller/Reseller.pm b/lib/NGCP/Panel/Controller/Reseller.pm index 1cb1933aa2..4825674cb1 100644 --- a/lib/NGCP/Panel/Controller/Reseller.pm +++ b/lib/NGCP/Panel/Controller/Reseller.pm @@ -110,24 +110,35 @@ sub create :Chained('list_reseller') :PathPart('create') :Args(0) :Does(ACL) :AC NGCP::Panel::Utils::Reseller::create_email_templates( c => $c, reseller => $reseller ); my $resource = $form->values; $resource->{rtc_networks} = [qw/sip xmpp webrtc conference/]; - NGCP::Panel::Utils::Rtc::modify_reseller_rtc( - resource => $resource, - config => $c->config, - reseller_item => $reseller, - err_code => sub { - my ($msg, $debug) = @_; - $c->log->debug($debug) if $debug; - $c->log->warn($msg); - # TODO: abort reseller creation with error? - return; - }); + eval { + NGCP::Panel::Utils::Rtc::modify_reseller_rtc( + resource => $resource, + config => $c->config, + reseller_item => $reseller, + err_code => sub { + my ($msg, $debug) = @_; + $c->log->debug($debug) if $debug; + $c->log->warn($msg); + die $msg,"\n"; + }); + }; + my $rtc_err = $@ // ''; + delete $c->session->{created_objects}->{contract}; $c->session->{created_objects}->{reseller} = { id => $reseller->id }; - NGCP::Panel::Utils::Message::info( - c => $c, - desc => $c->loc('Reseller successfully created'), - ); + if ($rtc_err) { + NGCP::Panel::Utils::Message::error( + c => $c, + desc => $c->loc(sprintf '%s (%s)', + 'Reseller successfully updated', $rtc_err), + ); + } else { + NGCP::Panel::Utils::Message::info( + c => $c, + desc => $c->loc('Reseller successfully created.'), + ); + } } catch($e) { NGCP::Panel::Utils::Message::error( c => $c, @@ -279,7 +290,7 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) :Does(ACL) :ACLDetachTo('/d my $params = { $reseller->get_inflated_columns }; $params->{contract}{id} = delete $params->{contract_id}; $params = merge($params, $c->session->{created_objects}); - $params->{enable_rtc} = !!$reseller->rtc_user; + $params->{enable_rtc} = $reseller->rtc_user; $form->process( posted => $posted, params => $c->request->params, @@ -293,6 +304,7 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) :Does(ACL) :ACLDetachTo('/d ); if($posted && $form->validated) { + my $rtc_err = ''; try { $c->model('DB')->txn_do(sub { $form->params->{contract_id} = delete $form->params->{contract}{id}; @@ -305,18 +317,20 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) :Does(ACL) :ACLDetachTo('/d }); my $resource = $form->values; $resource->{rtc_networks} = [qw/sip xmpp webrtc conference/]; - NGCP::Panel::Utils::Rtc::modify_reseller_rtc( - old_resource => $params, - resource => $resource, - config => $c->config, - reseller_item => $reseller, - err_code => sub { - my ($msg, $debug) = @_; - $c->log->debug($debug) if $debug; - $c->log->warn($msg); - # TODO: abort reseller creation with error? - return; - }); + eval { + NGCP::Panel::Utils::Rtc::modify_reseller_rtc( + old_resource => $params, + resource => $resource, + config => $c->config, + reseller_item => $reseller, + err_code => sub { + my ($msg, $debug) = @_; + $c->log->debug($debug) if $debug; + $c->log->warn($msg); + die $msg,"\n"; + }); + }; + $rtc_err = $@ // ''; if($reseller->status ne $old_status) { NGCP::Panel::Utils::Reseller::_handle_reseller_status_change($c, $reseller); @@ -325,10 +339,18 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) :Does(ACL) :ACLDetachTo('/d delete $c->session->{created_objects}->{contract}; delete $c->session->{edit_contract_id}; - NGCP::Panel::Utils::Message::info( - c => $c, - desc => $c->loc('Reseller successfully updated'), - ); + if ($rtc_err) { + NGCP::Panel::Utils::Message::error( + c => $c, + desc => $c->loc(sprintf '%s (%s)', + 'Reseller successfully updated', $rtc_err), + ); + } else { + NGCP::Panel::Utils::Message::info( + c => $c, + desc => $c->loc('Reseller successfully updated'), + ); + } } catch($e) { NGCP::Panel::Utils::Message::error( c => $c, @@ -363,7 +385,7 @@ sub terminate :Chained('base') :PathPart('terminate') :Args(0) :Does(ACL) :ACLDe try { $c->model('DB')->txn_do(sub { my $old_status = $reseller->status; - my $old_enable_rtc = !!$reseller->rtc_user; + my $old_enable_rtc = $reseller->rtc_user; $reseller->update({ status => 'terminated' }); NGCP::Panel::Utils::Rtc::modify_reseller_rtc( old_resource => {status => $old_status, enable_rtc => $old_enable_rtc}, @@ -374,8 +396,7 @@ sub terminate :Chained('base') :PathPart('terminate') :Args(0) :Does(ACL) :ACLDe my ($msg, $debug) = @_; $c->log->debug($debug) if $debug; $c->log->warn($msg); - # TODO: abort reseller creation with error? - return; + die $msg,"\n"; }); if($reseller->status ne $old_status) { diff --git a/lib/NGCP/Panel/Role/API/Resellers.pm b/lib/NGCP/Panel/Role/API/Resellers.pm index 263ed8724a..790703f0b2 100644 --- a/lib/NGCP/Panel/Role/API/Resellers.pm +++ b/lib/NGCP/Panel/Role/API/Resellers.pm @@ -131,17 +131,25 @@ sub update_reseller { contract_id => $resource->{contract_id}, }); - NGCP::Panel::Utils::Rtc::modify_reseller_rtc( - old_resource => $old_resource, - resource => $resource, - config => $c->config, - reseller_item => $reseller, - err_code => sub { - my ($msg, $debug) = @_; - $c->log->debug($debug) if $debug; - $c->log->warn($msg); - return; - }); + eval { + NGCP::Panel::Utils::Rtc::modify_reseller_rtc( + old_resource => $old_resource, + resource => $resource, + config => $c->config, + reseller_item => $reseller, + err_code => sub { + my ($msg, $debug) = @_; + $c->log->debug($debug) if $debug; + $c->log->warn($msg); + die $msg,"\n"; + }); + }; + my $rtc_err = $@ // ''; + if ($rtc_err && $resource->{status} eq 'terminated') { + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, + "Could not terminate rtc_user: $rtc_err"); + return; + } # TODO: should we lock reseller admin logins if reseller gets terminated? # or terminate all his customers and delete non-billing data?