From ba82a5517191db62dd2da7b6cf49799c18e9ccfa Mon Sep 17 00:00:00 2001 From: Kirill Solomko Date: Thu, 29 Apr 2021 18:17:50 +0200 Subject: [PATCH] TT#121250 fix /api/peeringrules * PeeeringRules.pm now uses the Entities approach for fine transaction control that fixes the POST operations Change-Id: Ieb666d3009393404e04171966adc0912f55a8a4f --- lib/NGCP/Panel/Controller/API/PeeringRules.pm | 110 +++++------------- 1 file changed, 27 insertions(+), 83 deletions(-) diff --git a/lib/NGCP/Panel/Controller/API/PeeringRules.pm b/lib/NGCP/Panel/Controller/API/PeeringRules.pm index 2a92232963..bfa8e1ea4d 100644 --- a/lib/NGCP/Panel/Controller/API/PeeringRules.pm +++ b/lib/NGCP/Panel/Controller/API/PeeringRules.pm @@ -79,93 +79,37 @@ __PACKAGE__->set_config({ allowed_roles => [qw/admin/], }); -sub GET :Allow { - my ($self, $c) = @_; - my $page = $c->request->params->{page} // 1; - my $rows = $c->request->params->{rows} // 10; - { - my $items = $self->item_rs($c); - (my $total_count, $items, my $items_rows) = $self->paginate_order_collection($c, $items); - my (@embedded, @links); - my $form = $self->get_form($c); - for my $item (@$items_rows) { - push @embedded, $self->hal_from_item($c, $item, $form); - push @links, Data::HAL::Link->new( - relation => 'ngcp:'.$self->resource_name, - href => sprintf('/%s%d', $c->request->path, $item->id), - ); - } - push @links, - Data::HAL::Link->new( - relation => 'curies', - href => 'http://purl.org/sipwise/ngcp-api/#rel-{rel}', - name => 'ngcp', - templated => true, - ), - Data::HAL::Link->new(relation => 'profile', href => 'http://purl.org/sipwise/ngcp-api/'), - $self->collection_nav_links($c, $page, $rows, $total_count, $c->request->path, $c->request->query_params); - - my $hal = Data::HAL->new( - embedded => [@embedded], - links => [@links], - ); - $hal->resource({ - total_count => $total_count, - }); - my $response = HTTP::Response->new(HTTP_OK, undef, - HTTP::Headers->new($hal->http_headers(skip_links => 1)), $hal->as_json); - $c->response->headers($response->headers); - $c->response->body($response->content); +sub create_item { + my ($self, $c, $resource, $form, $process_extras) = @_; + my $schema = $c->model('DB'); + my $guard = $schema->txn_scope_guard; + my $item; + + my $dup_item = $schema->resultset('voip_peer_rules')->find({ + group_id => $resource->{group_id}, + caller_pattern => $resource->{caller_pattern} ? $resource->{caller_pattern} =~ s/\\\\/\\/gr : undef, + callee_pattern => $resource->{callee_pattern} ? $resource->{callee_pattern} =~ s/\\\\/\\/gr : '', + callee_prefix => $resource->{callee_prefix} // '', + }); + + if ($dup_item) { + $c->log->error("peering rule already exists"); + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "peering rule already exists"); return; } - return; -} -sub POST :Allow { - my ($self, $c) = @_; - - my $guard = $c->model('DB')->txn_scope_guard; - { - my $resource = $self->get_valid_post_data( - c => $c, - media_type => 'application/json', - ); - last unless $resource; - my $item; - my $form = $self->get_form($c); - last unless $self->validate_form( - c => $c, - resource => $resource, - form => $form, - ); - my $dup_item = $c->model('DB')->resultset('voip_peer_rules')->find({ - group_id => $resource->{group_id}, - callee_pattern => $resource->{callee_pattern}, - caller_pattern => $resource->{caller_pattern}, - callee_prefix => $resource->{callee_prefix}, - }); - if($dup_item) { - $c->log->error("peering rule already exists"); # TODO: user, message, trace, ... - $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "peering rule already exists"); - return; - } - - try { - $item = $c->model('DB')->resultset('voip_peer_rules')->create($resource); - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); - } catch($e) { - $c->log->error("failed to create peering rule: $e"); # TODO: user, message, trace, ... - $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering rule."); - last; - } - - $guard->commit; - - $c->response->status(HTTP_CREATED); - $c->response->header(Location => sprintf('/%s%d', $c->request->path, $item->id)); - $c->response->body(q()); + try { + $item = $schema->resultset('voip_peer_rules')->create($resource); + } catch($e) { + $c->log->error("failed to create rewriterule: $e"); # TODO: user, message, trace, ... + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering rule."); + return; } - return; + + $guard->commit; + NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + + return $item; } 1;