diff --git a/lib/NGCP/Panel/Controller/API/PeeringRules.pm b/lib/NGCP/Panel/Controller/API/PeeringRules.pm index bfa8e1ea4d..b5016f4093 100644 --- a/lib/NGCP/Panel/Controller/API/PeeringRules.pm +++ b/lib/NGCP/Panel/Controller/API/PeeringRules.pm @@ -79,37 +79,95 @@ __PACKAGE__->set_config({ allowed_roles => [qw/admin/], }); -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"); +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); return; } + return; +} - 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; +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}, + 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; + } + + 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()); } - - $guard->commit; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); - - return $item; + return; } 1;