diff --git a/lib/NGCP/Panel/Controller/API/CallRecordings.pm b/lib/NGCP/Panel/Controller/API/CallRecordings.pm index ddaef36b7c..93d0ad65fe 100644 --- a/lib/NGCP/Panel/Controller/API/CallRecordings.pm +++ b/lib/NGCP/Panel/Controller/API/CallRecordings.pm @@ -33,7 +33,7 @@ sub query_params { { # we handle that separately/manually in the role param => 'subscriber_id', - description => 'Filter for callrecordings where the subscriber with the given id is involved.', + description => 'Filter callrecordings for or delete callrecording of the given subscriber_id only.', }, { # we handle that separately/manually in the role diff --git a/lib/NGCP/Panel/Controller/API/CallRecordingsItem.pm b/lib/NGCP/Panel/Controller/API/CallRecordingsItem.pm index f34d11f741..467b1c10d8 100644 --- a/lib/NGCP/Panel/Controller/API/CallRecordingsItem.pm +++ b/lib/NGCP/Panel/Controller/API/CallRecordingsItem.pm @@ -3,6 +3,10 @@ use NGCP::Panel::Utils::Generic qw(:all); use Sipwise::Base; +sub allowed_methods{ + return [qw/GET OPTIONS HEAD DELETE/]; +} + use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::CallRecordings/; use NGCP::Panel::Utils::Subscriber; @@ -13,24 +17,37 @@ __PACKAGE__->set_config({ required_licenses => [qw/call_recording/], }); -sub allowed_methods{ - return [qw/GET OPTIONS HEAD DELETE/]; -} - -sub delete_item { - my ($self, $c, $item) = @_; - try { - NGCP::Panel::Utils::Subscriber::delete_callrecording( - c => $c, - recording => $item, - #TODO: Now we don't use any way to document such parameters, need to be created - force_delete => $c->request->params->{force_delete}, - ); - } catch($e) { - $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to delete callrecording.", $e); - return; +sub DELETE :Allow { + + my ($self, $c, $id) = @_; + $c->model('DB')->set_transaction_isolation('READ COMMITTED'); + my $guard = $c->model('DB')->txn_scope_guard; + { + my $recording = $self->item_by_id($c, $id); + last unless $self->resource_exists($c, callrecording => $recording); + my $subs; + $subs = $c->model('DB')->resultset('voip_subscribers')->search({ + id => $c->req->params->{subscriber_id} + })->first if $c->req->params->{subscriber_id}; + try { + NGCP::Panel::Utils::Subscriber::delete_callrecording( + c => $c, + recording => $recording, + force_delete => $c->request->params->{force_delete}, + uuid => ($subs ? $subs->uuid : undef), + ); + } catch($e) { + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to delete callrecording.", $e); + last; + } + + $guard->commit; + + $c->response->status(HTTP_NO_CONTENT); + $c->response->body(q()); } - return 1; + return; + } 1; diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index ff0c09ec2c..8b05245b74 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -4451,7 +4451,8 @@ sub delete_recording :Chained('recording') :PathPart('delete') :Args(0) { NGCP::Panel::Utils::Subscriber::delete_callrecording( c => $c, recording => $recording, - force_delete => $form->values->{force_delete} + force_delete => $form->values->{force_delete}, + uuid => $c->stash->{subscriber}->uuid, ); }); NGCP::Panel::Utils::Message::info( diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 82c3d20df0..0222177fe8 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -2589,23 +2589,43 @@ sub get_voicemail_content_type { sub delete_callrecording { my %params = @_; - my($recording, $force_delete) = @params{qw/recording force_delete/}; + my($c,$recording, $force_delete, $uuid) = @params{qw/c recording force_delete uuid/}; - foreach my $stream($recording->recording_streams->all) { - #if we met some error deleting file - we will fail and transaction will be rollbacked - if (! -e $stream->full_filename && !$force_delete) { - die "Callrecording file ".$stream->full_filename." is absent"; + $recording = $c->model('DB')->resultset('recording_calls')->find({ + id => $recording->id + },{for => 'update'}); + + my $delete_all = 1; + if ($uuid) { + $recording->recording_metakeys->search_rs({ + 'key' => 'uuid', + 'value' => $uuid, + })->delete; + if ($recording->recording_metakeys->search_rs({ + 'key' => 'uuid', + })->first) { + $delete_all = 0; } - eval { - unlink $stream->full_filename; - }; - if ($@ && !$force_delete) { - die("Cannot delete call recording file: $@"); + } + + if ($delete_all) { + foreach my $stream($recording->recording_streams->all) { + #if we met some error deleting file - we will fail and transaction will be rollbacked + if (! -e $stream->full_filename && !$force_delete) { + die "Callrecording file ".$stream->full_filename." is absent"; + } + eval { + unlink $stream->full_filename; + }; + if ($@ && !$force_delete) { + die("Cannot delete call recording file: $@"); + } } + $recording->recording_metakeys->delete; + $recording->recording_streams->delete; + $recording->delete; } - $recording->recording_streams->delete; - $recording->recording_metakeys->delete; - $recording->delete; + } sub prov_to_billing_subscriber_id {