@ -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/\\\\/\\/g r : undef ,
callee_pattern = > $ resource - > { callee_pattern } ? $ resource - > { callee_pattern } =~ s/\\\\/\\/g r : '' ,
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/\\\\/\\/g r : undef ,
callee_pattern = > $ resource - > { callee_pattern } ? $ resource - > { callee_pattern } =~ s/\\\\/\\/g r : '' ,
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 ;