MT#56693 parent_name, allow empty sound files, sems audio cache

* /api/soundsets new parent_name field
* /api/soundfiles now allow POST to be done without the upload,
  for cases when an empty record needs to be added to define
  "use_parent" behaviour
* improve sems audio cache clear on sound files change, now
  sems instances that are not available (not running/request timeout)
  are skipped instead of raising an error

Change-Id: I83af2ee2fd3672ab35cf330464ace68416ab52be
mr11.4
Kirill Solomko 2 years ago
parent fd9c003c8b
commit 6a922c5cfb

@ -116,16 +116,26 @@ sub POST :Allow {
if ($upload) {
$recording = eval { $upload->slurp };
}
last unless $recording;
my $json_raw = encode_utf8($c->req->params->{json});
$resource = JSON::from_json($json_raw, { utf8 => 0 });
} else {
$recording = $self->get_valid_raw_post_data(
c => $c,
media_type => ['audio/x-wav', 'audio/mpeg', 'audio/ogg'],
);
$resource = $c->req->query_params;
my $ctype = $self->get_content_type($c);
if ($ctype eq 'application/json') {
$resource = $self->get_valid_post_data(
c => $c,
media_type => 'application/json',
);
last unless $resource;
} else {
$recording = $self->get_valid_raw_post_data(
c => $c,
media_type => ['application/json', 'audio/x-wav', 'audio/mpeg', 'audio/ogg'],
);
last unless $recording;
$resource = $c->req->query_params;
}
}
last unless $recording;
$resource->{data} = $recording;
my $form = $self->get_form($c);
my $item;

@ -16,7 +16,7 @@ has_field 'reseller_id' => (
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/reseller_id customer_id name description expose_to_customer contract_default parent_id copy_from_default language loopplay replace_existing/],
render_list => [qw/reseller_id customer_id name description expose_to_customer contract_default parent_id parent_name copy_from_default language loopplay replace_existing/],
);

@ -30,7 +30,7 @@ has_field 'use_parent' => (
has_field 'filename' => (
type => 'Text',
required => 1,
required => 0,
element_attr => {
rel => ['tooltip'],
title => ['The filename of the sound file (for informational purposes only).'],

@ -24,7 +24,7 @@ has_field 'expose_to_customer' => (
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/customer_id name description expose_to_customer contract_default parent_id copy_from_default language loopplay replace_existing/],
render_list => [qw/customer_id name description expose_to_customer contract_default parent_id parent_name copy_from_default language loopplay replace_existing/],
);

@ -51,6 +51,15 @@ has_field 'parent_id' => (
},
);
has_field 'parent_name' => (
type => 'Text',
element_attr => {
rel => ['tooltip'],
title => ['Parent sound set name'],
},
);
has_field 'copy_from_default' => (
type => 'Boolean',
label => 'Use system default sound files',
@ -60,7 +69,7 @@ has_field 'copy_from_default' => (
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/name description contract_id contract_default parent_id copy_from_default language loopplay replace_existing/],
render_list => [qw/name description contract_id contract_default parent_id parent_name copy_from_default language loopplay replace_existing/],
);
# TODO: inheritance?

@ -143,6 +143,12 @@ sub update_item {
$resource->{loopplay} = ($resource->{loopplay} eq "true" || is_int($resource->{loopplay}) && $resource->{loopplay}) ? 1 : 0;
if ($resource->{data} && !$resource->{filename}) {
$c->log->error("filename is required when there is data to upload'");
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "'filename' cannot be empty during upload");
return;
}
my $set_rs = $c->model('DB')->resultset('voip_sound_sets')->search({
id => $resource->{set_id},
});
@ -177,6 +183,7 @@ sub update_item {
join => 'group',
});
$handle = $handle_rs->first;
$resource->{handle} //= '';
unless($handle) {
$c->log->error("invalid handle '$$resource{handle}'");
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid handle");

@ -18,20 +18,25 @@ sub resource_name{
sub _item_rs {
my ($self, $c) = @_;
my $item_rs = $c->model('DB')->resultset('voip_sound_sets');
my $item_rs = $c->model('DB')->resultset('voip_sound_sets')->search({
},{
join => 'parent',
'+select' => [ 'parent.name' ],
'+as' => [ 'parent_name' ],
});
if ($c->user->roles eq "admin") {
} elsif ($c->user->roles eq "reseller") {
$item_rs = $item_rs->search({
'reseller_id' => $c->user->reseller_id,
'me.reseller_id' => $c->user->reseller_id,
});
} elsif ($c->user->roles eq "subscriberadmin") {
my $contract = $c->model('DB')->resultset('contracts')->find($c->user->account_id);
$item_rs = $item_rs->search_rs({
-or => [
'contract_id' => $c->user->account_id,
-and => [ 'contract_id' => undef,
'reseller_id' => $contract->contact->reseller_id,
'expose_to_customer' => 1,
'me.contract_id' => $c->user->account_id,
-and => [ 'me.contract_id' => undef,
'me.reseller_id' => $contract->contact->reseller_id,
'me.expose_to_customer' => 1,
],
]
});
@ -97,6 +102,8 @@ sub process_form_resource{
$resource->{reseller_id} = $c->user->contract->contact->reseller_id;
}
$resource->{contract_default} //= 0;
delete $resource->{parent_name};
return $resource;
}

@ -406,7 +406,7 @@ sub _clear_audio_cache_service {
</methodCall>
EOF
if(grep { $$_[1] == 0 or $$_[2] !~ m#<value>OK</value># } @ret) { # error
if (grep { $$_[1] == 0 || ($$_[1] != -1 && $$_[2] !~ m#<value>OK</value>#) } @ret) { # error
die "failed to clear SEMS audio cache";
}

Loading…
Cancel
Save