From ede3d43a4280ac391d11351ad6ea0c07a2d73503 Mon Sep 17 00:00:00 2001 From: Gerhard Jungwirth Date: Thu, 13 Mar 2014 09:38:10 +0100 Subject: [PATCH] MT#6195 API: rewriterule/rewriteruleset: POST --- .../Panel/Controller/API/RewriteRuleSets.pm | 57 ++++++++++++++++++ lib/NGCP/Panel/Controller/API/RewriteRules.pm | 58 +++++++++++++++++++ 2 files changed, 115 insertions(+) diff --git a/lib/NGCP/Panel/Controller/API/RewriteRuleSets.pm b/lib/NGCP/Panel/Controller/API/RewriteRuleSets.pm index aef3f4f19e..1263e28209 100644 --- a/lib/NGCP/Panel/Controller/API/RewriteRuleSets.pm +++ b/lib/NGCP/Panel/Controller/API/RewriteRuleSets.pm @@ -122,6 +122,63 @@ sub OPTIONS :Allow { return; } +sub POST :Allow { + my ($self, $c) = @_; + + my $guard = $c->model('DB')->txn_scope_guard; + { + my $schema = $c->model('DB'); + my $resource = $self->get_valid_post_data( + c => $c, + media_type => 'application/json', + ); + last unless $resource; + + unless(defined $resource->{reseller_id}) { + try { + $resource->{reseller_id} = $c->user->contract->contact->reseller_id; + } + } + my $reseller = $c->model('DB')->resultset('resellers')->find($resource->{reseller_id}); + unless($reseller) { + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid 'reseller_id', doesn't exist."); + last; + } + + my $form = $self->get_form($c); + last unless $self->validate_form( + c => $c, + resource => $resource, + form => $form, + ); + + my $ruleset_test = $schema->resultset('voip_rewrite_rule_sets')->search_rs({ + name => $resource->{name} + })->first; + if ($ruleset_test) { + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Ruleset with this 'name' already exists."); + last; + } + + my $ruleset; + + try { + $ruleset = $schema->resultset('voip_rewrite_rule_sets')->create($resource); + } catch($e) { + $c->log->error("failed to create rewriteruleset: $e"); # TODO: user, message, trace, ... + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create rewriteruleset."); + last; + } + + $guard->commit; + + $c->response->status(HTTP_CREATED); + $c->response->header(Location => sprintf('/%s%d', $c->request->path, $ruleset->id)); + $c->response->body(q()); + } + return; +} + sub end : Private { my ($self, $c) = @_; diff --git a/lib/NGCP/Panel/Controller/API/RewriteRules.pm b/lib/NGCP/Panel/Controller/API/RewriteRules.pm index d9ce48b0ca..ba472c216d 100644 --- a/lib/NGCP/Panel/Controller/API/RewriteRules.pm +++ b/lib/NGCP/Panel/Controller/API/RewriteRules.pm @@ -127,6 +127,64 @@ sub OPTIONS :Allow { return; } +sub POST :Allow { + my ($self, $c) = @_; + + my $guard = $c->model('DB')->txn_scope_guard; + { + my $schema = $c->model('DB'); + my $resource = $self->get_valid_post_data( + c => $c, + media_type => 'application/json', + ); + last unless $resource; + + unless($resource->{direction} && ($resource->{direction} eq "in" || $resource->{direction} eq "out") ) { + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid 'direction', must be 'in' or 'out'."); + last; + } + unless($resource->{field} && ($resource->{field} eq "callee" || $resource->{field} eq "caller") ) { + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid 'field', must be 'callee' or 'caller'."); + last; + } + my $set_id = delete $resource->{set_id}; # keep this, cause formhandler doesn't know it + + my $form = $self->get_form($c); + last unless $self->validate_form( + c => $c, + resource => $resource, + form => $form, + ); + + my $rule; + + unless(defined $set_id) { + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Required: 'set_id'"); + last; + } + my $ruleset = $schema->resultset('voip_rewrite_rule_sets')->find($set_id); + unless($ruleset) { + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid 'set_id'."); + last; + } + $resource->{set_id} = $ruleset->id; + try { + $rule = $schema->resultset('voip_rewrite_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 rewriterule."); + last; + } + + $guard->commit; + + $c->response->status(HTTP_CREATED); + $c->response->header(Location => sprintf('/%s%d', $c->request->path, $rule->id)); + $c->response->body(q()); + } + return; +} + sub end : Private { my ($self, $c) = @_;