From da4278daa39e645c677005c19e568a604ecfc117 Mon Sep 17 00:00:00 2001 From: Kirill Solomko Date: Tue, 12 Oct 2021 01:52:10 +0200 Subject: [PATCH] TT#145300 Adjust domains reseller_id handling * domains do not use billing.domain_resellers table anymore but instead the new domains.reseller_id field. That is to remove the unneeded many<>many relation through the additional table where the actual logic only supports one(reseller) to many(domains) relation Change-Id: I1b681543baf1901f19e10c2f6210e4cf6eeb8fbe --- lib/NGCP/Panel/Controller/API/CallQueues.pm | 10 +- .../Panel/Controller/API/CallRecordings.pm | 10 +- lib/NGCP/Panel/Controller/API/Domains.pm | 22 ++--- lib/NGCP/Panel/Controller/API/DomainsItem.pm | 5 +- lib/NGCP/Panel/Controller/Domain.pm | 91 +++++++++++++------ lib/NGCP/Panel/Controller/Reseller.pm | 2 +- lib/NGCP/Panel/Role/API/Domains.pm | 12 +-- lib/NGCP/Panel/Role/API/Preferences.pm | 8 +- lib/NGCP/Panel/Utils/Contract.pm | 5 +- lib/NGCP/Panel/Utils/Preferences.pm | 2 +- lib/NGCP/Panel/Utils/Subscriber.pm | 10 +- .../Widget/Dashboard/AdminResellerOverview.pm | 2 +- .../Dashboard/ResellerDomainOverview.pm | 2 +- 13 files changed, 88 insertions(+), 93 deletions(-) diff --git a/lib/NGCP/Panel/Controller/API/CallQueues.pm b/lib/NGCP/Panel/Controller/API/CallQueues.pm index 6f9a1dc236..6ff08c61bf 100644 --- a/lib/NGCP/Panel/Controller/API/CallQueues.pm +++ b/lib/NGCP/Panel/Controller/API/CallQueues.pm @@ -22,15 +22,7 @@ sub query_params { { param => 'reseller_id', description => 'Filter for callqueues of subscribers belonging to a specific reseller', - query => { - first => sub { - my $q = shift; - { 'domain_resellers.reseller_id' => $q }; - }, - second => sub { - { join => 'domain_resellers' }; - }, - }, + query_type => 'string_eq', }, { # we handle that separately/manually in the role diff --git a/lib/NGCP/Panel/Controller/API/CallRecordings.pm b/lib/NGCP/Panel/Controller/API/CallRecordings.pm index 2bcf9e4ba0..9c8204e1b6 100644 --- a/lib/NGCP/Panel/Controller/API/CallRecordings.pm +++ b/lib/NGCP/Panel/Controller/API/CallRecordings.pm @@ -22,15 +22,7 @@ sub query_params { { param => 'reseller_id', description => 'Filter for callrecordings belonging to a specific reseller', - query => { - first => sub { - my $q = shift; - { 'domain_resellers.reseller_id' => $q }; - }, - second => sub { - { join => 'domain_resellers' }; - }, - }, + query_type => 'string_eq', }, { param => 'status', diff --git a/lib/NGCP/Panel/Controller/API/Domains.pm b/lib/NGCP/Panel/Controller/API/Domains.pm index f1e5a8019a..6086a6daa1 100644 --- a/lib/NGCP/Panel/Controller/API/Domains.pm +++ b/lib/NGCP/Panel/Controller/API/Domains.pm @@ -24,15 +24,7 @@ sub query_params { { param => 'reseller_id', description => 'Filter for domains belonging to a specific reseller', - query => { - first => sub { - my $q = shift; - { 'domain_resellers.reseller_id' => $q }; - }, - second => sub { - { join => 'domain_resellers' }; - }, - }, + query_type => 'string_eq', }, { param => 'domain', @@ -154,21 +146,19 @@ sub POST :Allow { try { my $rs = $self->item_rs($c); - $billing_domain = $c->model('DB')->resultset('domains')->create({ - domain => $resource->{domain} - }); - my $provisioning_domain = $c->model('DB')->resultset('voip_domains')->create({ - domain => $resource->{domain} - }); my $reseller_id; if($c->user->roles eq "admin") { $reseller_id = $resource->{reseller_id}; } elsif($c->user->roles eq "reseller") { $reseller_id = $c->user->reseller_id; } - $billing_domain->create_related('domain_resellers', { + $billing_domain = $c->model('DB')->resultset('domains')->create({ + domain => $resource->{domain}, reseller_id => $reseller_id, }); + my $provisioning_domain = $c->model('DB')->resultset('voip_domains')->create({ + domain => $resource->{domain} + }); } catch($e) { $c->log->error("failed to create domain: $e"); # TODO: user, message, trace, ... $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create domain."); diff --git a/lib/NGCP/Panel/Controller/API/DomainsItem.pm b/lib/NGCP/Panel/Controller/API/DomainsItem.pm index a91acdd79d..67073286fc 100644 --- a/lib/NGCP/Panel/Controller/API/DomainsItem.pm +++ b/lib/NGCP/Panel/Controller/API/DomainsItem.pm @@ -78,9 +78,8 @@ sub DELETE :Allow { if($c->user->roles eq "admin") { } elsif($c->user->roles eq "reseller") { - #relation domain->domain_resellers is one to many. - unless($domain->domain_resellers->search({ reseller_id => $c->user->reseller_id })->first() ) { - $self->error($c, HTTP_FORBIDDEN, "Domain does not belong to reseller"); + if ($domain->reseller_id != $c->user->reseller_id) { + $self->error($c, HTTP_FORBIDDEN, "Domain does not belong to the reseller"); last; } } diff --git a/lib/NGCP/Panel/Controller/Domain.pm b/lib/NGCP/Panel/Controller/Domain.pm index eaeb67afe3..106f3c67f5 100644 --- a/lib/NGCP/Panel/Controller/Domain.pm +++ b/lib/NGCP/Panel/Controller/Domain.pm @@ -35,7 +35,10 @@ sub dom_list :Chained('/') :PathPart('domain') :CaptureArgs(0) { $c->stash->{domain_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [ { name => 'id', search => 1, title => $c->loc('#') }, - { name => 'domain_resellers.reseller.name', search => 1, title => $c->loc('Reseller') }, + ($c->user->is_superuser + ? { name => "reseller.name", search => 1, title => $c->loc("Reseller") } + : () + ), { name => 'domain', search => 1, title => $c->loc('Domain') }, ]); @@ -55,11 +58,9 @@ sub _dom_resultset_admin { sub _dom_resultset_reseller { my ($self, $c) = @_; - return $c->model('DB')->resultset('admins')->find( - { id => $c->user->id, } ) - ->reseller - ->domain_resellers - ->search_related('domain'); + return $c->model('DB')->resultset('domains')->search({ + reseller_id => $c->user->reseller_id, + }); } sub root :Chained('dom_list') :PathPart('') :Args(0) { @@ -69,9 +70,13 @@ sub root :Chained('dom_list') :PathPart('') :Args(0) { sub create :Chained('dom_list_restricted') :PathPart('create') :Args() { my ($self, $c, $reseller_id, $type) = @_; - my $posted = ($c->request->method eq 'POST'); my $form; my $pbx; - if($type && $type eq 'pbx') { + my $posted = ($c->request->method eq 'POST'); + my $params = {}; + $params = merge($params, $c->session->{created_objects}); + delete $params->{domain} if exists $params->{domain}; + + if ($type && $type eq 'pbx') { unless($reseller_id && is_int($reseller_id)) { NGCP::Panel::Utils::Message::error( c => $c, @@ -99,23 +104,38 @@ sub create :Chained('dom_list_restricted') :PathPart('create') :Args() { } else { $form = NGCP::Panel::Form::get("NGCP::Panel::Form::Domain::Reseller", $c); } - my $params = { %{ $c->session->{created_objects} } }; - delete $params->{domain} if exists $params->{domain}; + $form->process( posted => $posted, params => $c->request->params, - item => $params, + item => $params, + ); + + NGCP::Panel::Utils::Navigation::check_form_buttons( + c => $c, + form => $form, + fields => { + 'reseller.create' => $c->uri_for('/reseller/create'), + }, + back_uri => $c->req->uri, ); - if($posted && $form->validated) { + + if ($posted && $form->validated) { try { + if ($c->user->is_superuser) { + $form->values->{reseller_id} = delete $form->values->{reseller}{id}; + } else { + $form->values->{reseller_id} = $c->user->reseller_id; + } $c->model('DB')->schema->txn_do( sub { my $prov_dom = $c->model('DB')->resultset('voip_domains') ->create({domain => $form->value->{domain}}); - my $new_dom = $c->stash->{dom_rs} - ->create({domain => $form->value->{domain}}); + delete $c->session->{created_objects}->{reseller}; + my $new_dom = $c->stash->{dom_rs}->create({ + domain => $form->value->{domain}, + reseller_id => $form->value->{reseller_id}, + }); unless($pbx) { - $reseller_id = $c->user->is_superuser ? - $form->values->{reseller}{id} : $c->user->reseller_id; } elsif($form->values->{rwr_set}) { my $rwr_set = $c->model('DB')->resultset('voip_rewrite_rule_sets') ->find($form->values->{rwr_set}); @@ -138,9 +158,6 @@ sub create :Chained('dom_list_restricted') :PathPart('create') :Args() { } } - $new_dom->create_related('domain_resellers', { - reseller_id => $reseller_id - }); NGCP::Panel::Utils::Prosody::activate_domain($c, $form->value->{domain}) unless($c->config->{features}->{debug}); delete $c->session->{created_objects}->{reseller}; @@ -219,18 +236,34 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) { my $posted = ($c->request->method eq 'POST'); my $form = NGCP::Panel::Form::get("NGCP::Panel::Form::Domain::Reseller", $c); + my $params = { $c->stash->{dom_rs}->get_inflated_columns }; + $form->process( - posted => 1, - params => $posted ? $c->request->params : $c->stash->{domain}, - action => $c->uri_for($c->stash->{domain}->{id}, 'edit'), + posted => $posted, + params => $c->request->params, + item => $params, + ); + + NGCP::Panel::Utils::Navigation::check_form_buttons( + c => $c, + form => $form, + fields => { + 'reseller.create' => $c->uri_for('/reseller/create'), + }, + back_uri => $c->req->uri, ); - if($posted && $form->validated) { + if ($posted && $form->validated) { try { + if($c->user->is_superuser) { + $form->values->{reseller_id} = delete $form->values->{reseller}{id}; + } else { + $form->values->{reseller_id} = $c->user->reseller_id; + } + $c->model('DB')->schema->txn_do( sub { - $c->stash->{'domain_result'}->update({ - domain => $form->value->{domain}, - }); + $c->stash->{'domain_result'}->update($form->values); + delete $c->session->{created_objects}->{reseller}; $c->stash->{'provisioning_domain_result'}->update({ domain => $form->value->{domain}, }); @@ -326,9 +359,7 @@ sub ajax_filter_reseller :Chained('dom_list') :PathPart('ajax/filter_reseller') my ($self, $c, $reseller_id) = @_; my $resultset = $c->stash->{dom_rs}->search({ - 'domain_resellers.reseller_id' => $reseller_id, - },{ - join => 'domain_resellers' + 'reseller_id' => $reseller_id, }); NGCP::Panel::Utils::Datatables::process($c, $resultset, $c->stash->{domain_dt_columns}); $c->detach( $c->view("JSON") ); @@ -417,7 +448,7 @@ sub load_preference_list :Private { } } - my $correct_reseller_id = $c->stash->{domain_result}->domain_resellers->first->reseller_id; + my $correct_reseller_id = $c->stash->{domain_result}->reseller_id; my $rewrite_rule_sets_rs = $c->model('DB') ->resultset('voip_rewrite_rule_sets') ->search_rs({ reseller_id => $correct_reseller_id, }); diff --git a/lib/NGCP/Panel/Controller/Reseller.pm b/lib/NGCP/Panel/Controller/Reseller.pm index d13a8922c9..d4b0a23106 100644 --- a/lib/NGCP/Panel/Controller/Reseller.pm +++ b/lib/NGCP/Panel/Controller/Reseller.pm @@ -214,7 +214,7 @@ sub base :Chained('list_reseller') :PathPart('') :CaptureArgs(1) { $c->stash->{domain_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [ { name => "id", search => 1, title => $c->loc('#') }, { name => "domain", search => 1, title => $c->loc('Domain') }, - { name => "domain_resellers.reseller.name", search => 1, title => $c->loc('Reseller') }, + { name => "domain.reseller.name", search => 1, title => $c->loc('Reseller') }, ]); $c->stash->{tmpl_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [ { name => 'id', search => 1, title => $c->loc('#') }, diff --git a/lib/NGCP/Panel/Role/API/Domains.pm b/lib/NGCP/Panel/Role/API/Domains.pm index d0706ce6af..957f51c1d5 100644 --- a/lib/NGCP/Panel/Role/API/Domains.pm +++ b/lib/NGCP/Panel/Role/API/Domains.pm @@ -38,8 +38,8 @@ sub resource_from_item { $resource{id} = int($item->id); - if ($c->user->roles eq "admin" && $item->domain_resellers->first) { - $resource{reseller_id} = int($item->domain_resellers->first->reseller_id) + if ($c->user->roles eq "admin") { + $resource{reseller_id} = $item->reseller_id; } return \%resource; @@ -80,11 +80,9 @@ sub _item_rs { if($c->user->roles eq "admin") { $item_rs = $c->model('DB')->resultset('domains'); } elsif($c->user->roles eq "reseller") { - $item_rs = $c->model('DB')->resultset('admins')->find( - { id => $c->user->id, } ) - ->reseller - ->domain_resellers - ->search_related('domain'); + $item_rs = $c->model('DB')->resultset('domains')->search({ + reseller_id => $c->user->reseller_id, + }); } return $item_rs; } diff --git a/lib/NGCP/Panel/Role/API/Preferences.pm b/lib/NGCP/Panel/Role/API/Preferences.pm index a9d98c186e..8b84df0f41 100644 --- a/lib/NGCP/Panel/Role/API/Preferences.pm +++ b/lib/NGCP/Panel/Role/API/Preferences.pm @@ -79,11 +79,9 @@ sub _item_rs { if($c->user->roles eq "admin") { $item_rs = $c->model('DB')->resultset('domains'); } elsif($c->user->roles eq "reseller") { - $item_rs = $c->model('DB')->resultset('admins')->find( - { id => $c->user->id, } ) - ->reseller - ->domain_resellers - ->search_related('domain'); + $item_rs = $c->model('DB')->resultset('domains')->search({ + reseller_id => $c->user->reseller_id, + }); } } elsif($type eq "profiles") { # we actually return the profile rs here, as we can easily diff --git a/lib/NGCP/Panel/Utils/Contract.pm b/lib/NGCP/Panel/Utils/Contract.pm index 980a864fea..10f562f4e2 100644 --- a/lib/NGCP/Panel/Utils/Contract.pm +++ b/lib/NGCP/Panel/Utils/Contract.pm @@ -104,15 +104,14 @@ sub recursively_lock_contract { if ($status eq 'terminated') { # remove domains in case of reseller termination - for my $domain ($reseller->domain_resellers->all) { - my $prov_domain = $domain->domain->provisioning_voip_domain; + for my $domain ($reseller->domains->all) { + my $prov_domain = $domain->provisioning_voip_domain; if ($prov_domain) { $prov_domain->voip_dbaliases->delete; $prov_domain->voip_dom_preferences->delete; $prov_domain->provisioning_voip_subscribers->delete; $prov_domain->delete; } - $domain->domain->delete; $domain->delete; } diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index cfb9bab39d..6cf41eb7a6 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -448,7 +448,7 @@ sub update_preferences { $elem = $item->provisioning_voip_domain; $full_rs = $elem->voip_dom_preferences; $pref_type = 'dom_pref'; - $reseller_id = $item->domain_resellers->first->reseller_id; + $reseller_id = $item->reseller_id; } elsif($type eq "profiles") { delete $resource->{profile_id}; delete $resource->{profilepreferences_id}; diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 0b4f8cfced..88b7ec0897 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -233,9 +233,7 @@ sub prepare_resource { if($c->user->roles eq "admin") { } elsif($c->user->roles eq "reseller") { $domain = $domain->search({ - 'domain_resellers.reseller_id' => $c->user->reseller_id, - }, { - join => 'domain_resellers', + 'reseller_id' => $c->user->reseller_id, }); } $domain = $domain->first; @@ -364,9 +362,7 @@ sub prepare_resource { if ($c->user->roles eq "admin" || $c->user->roles eq "ccareadmin") { } elsif ($c->user->roles eq "reseller" || $c->user->roles eq "ccare") { $domain = $domain->search({ - 'domain_resellers.reseller_id' => $c->user->reseller_id, - }, { - join => 'domain_resellers', + 'reseller_id' => $c->user->reseller_id, }); } $domain = $domain->first; @@ -391,7 +387,7 @@ sub prepare_resource { return; } - if (!$customer->contact->reseller->domain_resellers->search({domain_id => $domain->id})->first()) { + if (!$customer->contact->reseller->id != $domain->reseller_id) { &{$err_code}(HTTP_UNPROCESSABLE_ENTITY, "Invalid 'domain', doesn't belong to the same reseller as subscriber's customer."); return; } diff --git a/lib/NGCP/Panel/Widget/Dashboard/AdminResellerOverview.pm b/lib/NGCP/Panel/Widget/Dashboard/AdminResellerOverview.pm index 5d1257ccdc..be61d3ffb2 100644 --- a/lib/NGCP/Panel/Widget/Dashboard/AdminResellerOverview.pm +++ b/lib/NGCP/Panel/Widget/Dashboard/AdminResellerOverview.pm @@ -29,7 +29,7 @@ sub _prepare_resellers_count { sub _prepare_domains_count { my ($self, $c) = @_; $c->stash( - domains => $c->model('DB')->resultset('domain_resellers')->search_rs({}), + domains => $c->model('DB')->resultset('domains')->search_rs({}), ); } diff --git a/lib/NGCP/Panel/Widget/Dashboard/ResellerDomainOverview.pm b/lib/NGCP/Panel/Widget/Dashboard/ResellerDomainOverview.pm index 416db6ea07..23571a3355 100644 --- a/lib/NGCP/Panel/Widget/Dashboard/ResellerDomainOverview.pm +++ b/lib/NGCP/Panel/Widget/Dashboard/ResellerDomainOverview.pm @@ -25,7 +25,7 @@ sub _prepare_domains_count { my ($self, $c) = @_; my $reseller = $self->_get_reseller($c); $c->stash( - domains => $reseller->domain_resellers, + domains => $reseller->domains, ); }