You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
5.3 KiB
169 lines
5.3 KiB
package NGCP::Panel::Role::API::VoicemailGreetings;
|
|
|
|
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;
|
|
|
|
sub item_name {
|
|
return 'voicemailgreetings';
|
|
}
|
|
|
|
sub resource_name{
|
|
return 'voicemailgreetings';
|
|
}
|
|
|
|
sub dispatch_path{
|
|
return '/api/voicemailgreetings/';
|
|
}
|
|
|
|
sub relation{
|
|
return 'http://purl.org/sipwise/ngcp-api/#rel-voicemailgreetings';
|
|
}
|
|
|
|
sub _item_rs {
|
|
my ($self, $c) = @_;
|
|
|
|
my $item_rs = $c->model('DB')->resultset('voicemail_spool')->search({
|
|
'msgnum' => '-1',
|
|
'-or' => [
|
|
'dir' => { like => '/var/spool/asterisk/voicemail/%/unavail' },
|
|
'dir' => { like => '/var/spool/asterisk/voicemail/%/busy' },
|
|
'dir' => { like => '/var/spool/asterisk/voicemail/%/greet' },
|
|
'dir' => { like => '/var/spool/asterisk/voicemail/%/temp' },
|
|
],
|
|
'voip_subscriber.id' => { '!=' => undef },
|
|
'voip_subscriber.status' => { '!=' => 'terminated' }
|
|
},{
|
|
join => { 'mailboxuser' => { 'provisioning_voip_subscriber' => 'voip_subscriber' } },
|
|
'+select' => [qw/voip_subscriber.id/],
|
|
'+as' => [qw/subscriber_id/],
|
|
});
|
|
if ($c->user->roles eq "admin" || $c->user->roles eq "ccareadmin") {
|
|
} elsif ($c->user->roles eq "reseller" || $c->user->roles eq "ccare") {
|
|
$item_rs = $item_rs->search({
|
|
'contact.reseller_id' => $c->user->reseller_id
|
|
},{
|
|
join => { mailboxuser => {
|
|
provisioning_voip_subscriber => {
|
|
voip_subscriber => {
|
|
contract => 'contact'
|
|
}
|
|
}
|
|
} }
|
|
});
|
|
} elsif ($c->user->roles eq "subscriberadmin") {
|
|
$item_rs = $item_rs->search_rs({
|
|
'contract.id' => $c->user->account_id,
|
|
},{
|
|
join => { 'mailboxuser' => { 'provisioning_voip_subscriber' =>
|
|
{ 'voip_subscriber' => 'contract' } } },
|
|
});
|
|
} elsif ($c->user->roles eq "subscriber") {
|
|
$item_rs = $item_rs->search_rs({
|
|
'voip_subscriber.uuid' => $c->user->uuid,
|
|
});
|
|
}
|
|
return $item_rs;
|
|
}
|
|
|
|
sub get_form {
|
|
my ($self, $c) = @_;
|
|
return (NGCP::Panel::Form::get("NGCP::Panel::Form::Voicemail::GreetingAPI", $c));
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
sub process_form_resource{
|
|
my($self, $c, $item, $old_resource, $resource, $form, $process_extras) = @_;
|
|
try{
|
|
NGCP::Panel::Utils::Subscriber::convert_voicemailgreeting(
|
|
c => $c,
|
|
upload => $resource->{greetingfile},
|
|
converted_data_ref => \$process_extras->{binary_ref},
|
|
);
|
|
} catch($e) {
|
|
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, $e);
|
|
return;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
sub check_resource{
|
|
my($self, $c, $item, $old_resource, $resource, $form, $process_extras) = @_;
|
|
|
|
|
|
#TODO: Move subscriber checking to some checking collections
|
|
my $subscriber_rs = $c->model('DB')->resultset('voip_subscribers')->search({
|
|
'me.status' => { '!=' => 'terminated' },
|
|
'me.id' => $resource->{subscriber_id},
|
|
});
|
|
if ($c->user->roles eq 'reseller' || $c->user->roles eq "ccare") {
|
|
$subscriber_rs = $subscriber_rs->search({
|
|
'contact.reseller_id' => $c->user->reseller_id,
|
|
},{
|
|
join => { 'contract' => 'contact'},
|
|
});
|
|
} elsif($c->user->roles eq 'subscriberadmin') {
|
|
$subscriber_rs = $subscriber_rs->search({
|
|
'contract.id' => $c->user->account_id,
|
|
},{
|
|
join => { 'contract' => 'contact'},
|
|
});
|
|
} elsif ($c->user->roles eq 'subscriber') {
|
|
$subscriber_rs = $subscriber_rs->search({
|
|
'me.uuid' => $c->user->uuid,
|
|
});
|
|
}
|
|
my $billing_subscriber = $subscriber_rs->first;
|
|
unless($billing_subscriber) {
|
|
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid 'subscriber_id'.");
|
|
return;
|
|
}
|
|
|
|
my $subscriber = $billing_subscriber->provisioning_voip_subscriber;
|
|
unless($subscriber) {
|
|
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid subscriber.");
|
|
return;
|
|
}
|
|
|
|
my $voicemail_subscriber = $subscriber->voicemail_user;
|
|
unless($voicemail_subscriber) {
|
|
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "No voicemail user found for subscriber uuid ".$subscriber->uuid);
|
|
return;
|
|
}
|
|
|
|
$c->stash->{checked}->{subscriber} = $subscriber;
|
|
$c->stash->{checked}->{voicemail_subscriber} = $voicemail_subscriber;
|
|
|
|
return 1;
|
|
}
|
|
|
|
sub check_duplicate{
|
|
my($self, $c, $item, $old_resource, $resource, $form, $process_extras) = @_;
|
|
|
|
my $rs = $self->item_rs($c);
|
|
|
|
my $existing_item = $rs->search({
|
|
'voip_subscriber.id' => $resource->{subscriber_id},
|
|
'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');
|
|
return;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
1;
|
|
# vim: set tabstop=4 expandtab:
|