diff --git a/lib/NGCP/Panel/Controller/API/VoicemailGreetings.pm b/lib/NGCP/Panel/Controller/API/VoicemailGreetings.pm index 13cdaf4d5d..98c771d497 100644 --- a/lib/NGCP/Panel/Controller/API/VoicemailGreetings.pm +++ b/lib/NGCP/Panel/Controller/API/VoicemailGreetings.pm @@ -68,7 +68,7 @@ sub query_params { first => sub { my $q = shift; return { - 'me.dir' => $q, + 'me.dir' => { like => '%/'.$q }, }; }, second => sub {}, @@ -79,12 +79,13 @@ sub query_params { sub create_item { my ($self, $c, $resource, $form, $process_extras) = @_; - + my $dir = NGCP::Panel::Utils::Subscriber::get_subscriber_voicemail_directory( c => $c, subscriber => $c->stash->{checked}->{subscriber}, dir => $resource->{dir} ); my $item = $c->stash->{checked}->{voicemail_subscriber}->voicemail_spools->create({ - 'origtime' => time(),#just to make inflate possible. Really we don't need this value - 'recording' => $resource->{greetingfile}->slurp, - 'dir' => $resource->{dir}, - 'msgnum' => '-1', + 'recording' => $resource->{greetingfile}->slurp, + 'dir' => $dir, + 'origtime' => time(),#just to make inflate possible. Really we don't need this value + 'mailboxcontext' => 'default', + 'msgnum' => '-1', }); #we need to return subscriber id, so item can be used for further update #We can't just add field to the item object, so we need to reselect it diff --git a/lib/NGCP/Panel/Controller/API/VoicemailGreetingsItem.pm b/lib/NGCP/Panel/Controller/API/VoicemailGreetingsItem.pm index ec82b52f17..1e9aed32b1 100644 --- a/lib/NGCP/Panel/Controller/API/VoicemailGreetingsItem.pm +++ b/lib/NGCP/Panel/Controller/API/VoicemailGreetingsItem.pm @@ -28,9 +28,10 @@ sub _set_config{ sub update_item_model{ my($self, $c, $item, $old_resource, $resource, $form, $process_extras) = @_; + my $dir = NGCP::Panel::Utils::Subscriber::get_subscriber_voicemail_directory(c => $c, subscriber => $c->stash->{checked}->{subscriber}, dir => $resource->{dir} ); $item->update({ 'recording' => $resource->{greetingfile}->slurp, - 'dir' => $resource->{dir}, + 'dir' => $dir, 'origtime' => time(),#just to make inflate possible. Really we don't need this value }); #we need to return subscriber id, so item can be used for further update @@ -43,7 +44,7 @@ sub get_item_binary_data{ my($self, $c, $id, $item) = @_; #caller waits for: $data_ref,$mime_type,$filename #while we will not strictly check Accepted header, if item can return only one type of the binary data - return \$item->recording, 'audio/x-wav', 'voicemail_'.$item->dir.'_'.$item->get_column('subscriber_id').'.wav', + return \$item->recording, 'audio/x-wav', 'voicemail_'. NGCP::Panel::Utils::Subscriber::get_subscriber_voicemail_type( dir => $item->dir ).'_'.$item->get_column('subscriber_id').'.wav', } # vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index 8769fd3f60..f48ebcf63e 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -695,8 +695,10 @@ sub preferences :Chained('base') :PathPart('preferences') :Args(0) { hash => 'type', ); foreach my $voicemail_greeting_type (qw/unavail busy/){ + my $dir = NGCP::Panel::Utils::Subscriber::get_subscriber_voicemail_directory(c => $c, subscriber => $c->stash->{subscriber}, dir => $voicemail_greeting_type); push @$vm_recordings_types, - $subscriber_vm_recordings->{$voicemail_greeting_type} // {greeting_exists => 0, type => $voicemail_greeting_type} ; + $subscriber_vm_recordings->{$dir} ? {%{$subscriber_vm_recordings->{$dir}}, type => $voicemail_greeting_type } + : {greeting_exists => 0, type => $voicemail_greeting_type} ; } $c->stash->{vm_recordings_types} = $vm_recordings_types; @@ -3000,7 +3002,7 @@ sub edit_voicebox :Chained('base') :PathPart('preferences/voicebox/edit') :Args( if( !grep{ $type eq $_ } (qw/unavail busy/) ){ die('Wrong voicemail greeting type.'); } - + my $dir = NGCP::Panel::Utils::Subscriber::get_subscriber_voicemail_directory(c => $c, subscriber => $c->stash->{subscriber}, dir => $type); $attribute_name = $c->loc('voicemail greeting "'.$type.'"'); $form = NGCP::Panel::Form::Voicemail::Greeting->new; $params = {}; @@ -3014,7 +3016,7 @@ sub edit_voicebox :Chained('base') :PathPart('preferences/voicebox/edit') :Args( ); if('delete' eq $action){ $vm_user->voicemail_spools->search_rs({ - 'dir' => $type, + 'dir' => $dir, 'msgnum' => '-1', })->delete; NGCP::Panel::Utils::Message::info( @@ -3027,7 +3029,7 @@ sub edit_voicebox :Chained('base') :PathPart('preferences/voicebox/edit') :Args( return; }elsif('download' eq $action){ my $recording = $vm_user->voicemail_spools->search_rs({ - 'dir' => $type, + 'dir' => $dir, 'msgnum' => '-1', })->first; if($recording){ @@ -3051,10 +3053,11 @@ sub edit_voicebox :Chained('base') :PathPart('preferences/voicebox/edit') :Args( if($form->validated) { if('edit' eq $action){ $vm_user->voicemail_spools->update_or_create({ - 'origtime' => time(),#just to make inflate possible. Really we don't need this value - 'recording' => $greetingfile->slurp, - 'dir' => $type, - 'msgnum' => '-1', + 'recording' => $greetingfile->slurp, + 'dir' => $dir, + 'origtime' => time(),#just to make inflate possible. Really we don't need this value + 'mailboxcontext' => 'default', + 'msgnum' => '-1', }); } } diff --git a/lib/NGCP/Panel/Role/API/VoicemailGreetings.pm b/lib/NGCP/Panel/Role/API/VoicemailGreetings.pm index a66699dcc0..4f941c013f 100644 --- a/lib/NGCP/Panel/Role/API/VoicemailGreetings.pm +++ b/lib/NGCP/Panel/Role/API/VoicemailGreetings.pm @@ -5,6 +5,7 @@ use parent qw/NGCP::Panel::Role::API/; use Sipwise::Base; use HTTP::Status qw(:constants); use NGCP::Panel::Utils::Generic qw(:all); +use NGCP::Panel::Utils::Subscriber; use NGCP::Panel::Form::Voicemail::GreetingAPI; sub item_name { @@ -28,7 +29,10 @@ sub _item_rs { my $item_rs = $c->model('DB')->resultset('voicemail_spool')->search({ 'msgnum' => '-1', - 'dir' => {-in => [qw/unavail busy/]}, + '-or' => [ + 'dir' => { like => '%/unavail' }, + 'dir' => { like => '%/busy' }, + ], 'voip_subscriber.id' => { '!=' => undef }, 'voip_subscriber.status' => { '!=' => 'terminated' } },{ @@ -97,6 +101,7 @@ sub check_resource{ return; } + $c->stash->{checked}->{subscriber} = $subscriber; $c->stash->{checked}->{voicemail_subscriber} = $voicemail_subscriber; return 1; @@ -106,9 +111,10 @@ sub check_duplicate{ my($self, $c, $item, $old_resource, $resource, $form) = @_; my $rs = $self->item_rs($c); + my $existing_item = $rs->search({ 'voip_subscriber.id' => $resource->{subscriber_id}, - 'me.dir' => $resource->{dir}, + 'me.dir' => {like => '%/'.$resource->{dir}}, })->first; if($existing_item && (!$item || $item->id != $existing_item->id)) { $self->error($c, HTTP_UNPROCESSABLE_ENTITY, 'Voicemail greeting for the type "'.$resource->{dir}.'" and subscriber id "'.$resource->{subscriber_id}.'" already exists'); @@ -118,5 +124,19 @@ sub check_duplicate{ return 1; } +#sub resource_from_item{ +# my $self shift; +# my($c, $item) = @_; +# my $res = $self->SUPER::resource_from_item(@_); +# $res->{dir} = NGCP::Panel::Utils::Subscriber::get_subscriber_voicemail_directory(c => $c, subscriber => $c->stash->{checked}->{subscriber}, dir => $resource->{dir} ); +# return $res; +#} + +sub process_hal_resource{ + my $self = shift; + my ($c, $item, $resource, $form) = @_; + $resource->{dir} = NGCP::Panel::Utils::Subscriber::get_subscriber_voicemail_type(c => $c, dir => $resource->{dir} ); + return $resource; +} 1; # vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 316db5d3bd..faf0ee2e64 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -1528,7 +1528,22 @@ sub mark_voicemail_read{ $voicemail->update({ dir => $dir }); return; } +sub get_subscriber_voicemail_directory{ + my (%params) = @_; + + my $c = $params{c}; + my $subscriber = $params{subscriber}; + my $dir = $params{dir}; + return "/var/spool/asterisk/voicemail/default/".$subscriber->uuid."/$dir"; +} +sub get_subscriber_voicemail_type{ + my (%params) = @_; + my $c = $params{c}; + my $dir = $params{dir}; + $dir =~s/.*?\/([^\/]+)$/$1/gis; + return $dir; +} sub number_as_string{ my ($number_row, %params) = @_; return 'HASH' eq ref $number_row