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.
ngcp-panel/lib/NGCP/Panel/Role/API/VoicemailGreetings.pm

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: