diff --git a/lib/NGCP/Panel/Controller/API/Root.pm b/lib/NGCP/Panel/Controller/API/Root.pm index 5f443c952c..e583c27994 100644 --- a/lib/NGCP/Panel/Controller/API/Root.pm +++ b/lib/NGCP/Panel/Controller/API/Root.pm @@ -156,18 +156,22 @@ sub GET : Allow { my ($form) = $full_mod->get_form($c); my $sorting_cols = []; - if (my $order_by_cols = eval { $full_mod->order_by_cols(); }) { - $sorting_cols = [ sort keys %$order_by_cols ]; - } else { + my ($explicit_order_cols, $explicit_order_cols_params); + if ($full_mod->can('order_by_cols')) { + ($explicit_order_cols,$explicit_order_cols_params) = $full_mod->order_by_cols(); + $sorting_cols = [ sort keys %$explicit_order_cols ]; + $explicit_order_cols_params //= {}; + } + if (!$explicit_order_cols || $explicit_order_cols_params->{columns_are_additional}) { my $item_rs; try { $item_rs = $full_mod->item_rs($c, ""); } if ($item_rs) { if(ref $item_rs eq "ARRAY") { - $sorting_cols = [map { $_->{name} } @{ $item_rs }]; + $sorting_cols = [sort (@$sorting_cols, map { $_->{name} } @{ $item_rs })]; } else { - $sorting_cols = [$item_rs->result_source->columns]; + $sorting_cols = [sort (@$sorting_cols, $item_rs->result_source->columns)]; } } } diff --git a/lib/NGCP/Panel/Controller/API/Subscribers.pm b/lib/NGCP/Panel/Controller/API/Subscribers.pm index a2a04b8ec8..37ab87a604 100644 --- a/lib/NGCP/Panel/Controller/API/Subscribers.pm +++ b/lib/NGCP/Panel/Controller/API/Subscribers.pm @@ -263,6 +263,17 @@ sub query_params { return $params; } +sub order_by_cols { + return + { create_timestamp => 'provisioning_voip_subscriber.create_timestamp' }, + { + columns_are_additional => 1, + create_timestamp => { + join => 'provisioning_voip_subscriber', + }, + }; +} + sub GET :Allow { my ($self, $c) = @_; my $page = $c->request->params->{page} // 1; diff --git a/lib/NGCP/Panel/Role/API.pm b/lib/NGCP/Panel/Role/API.pm index 3ceb01c2d1..b2c8163c2b 100644 --- a/lib/NGCP/Panel/Role/API.pm +++ b/lib/NGCP/Panel/Role/API.pm @@ -701,19 +701,31 @@ sub paginate_order_collection_rs { rows => $rows, }); $self->define_collection_infinite_pager($c, undef, $item_rs, $rows, $no_count); - - if ($order_by && ((my $explicit = ($self->can('order_by_cols') && exists $self->order_by_cols()->{$order_by})) or $item_rs->result_source->has_column($order_by))) { - my $col = ($explicit ? $self->order_by_cols()->{$order_by} : $item_rs->current_source_alias . '.' . $order_by); - if (lc($direction) eq 'desc') { - $item_rs = $item_rs->search(undef, { - order_by => {-desc => $col}, - }); - $c->log->debug("ordering by $col DESC"); - } else { - $item_rs = $item_rs->search(undef, { - order_by => "$col", - }); - $c->log->debug("ordering by $col"); + if ($order_by) { + my $explicit_order_col_spec; + if ($self->can('order_by_cols')) { + my($explicit_order_cols,$explicit_order_cols_params) = $self->order_by_cols(); + $explicit_order_col_spec = $explicit_order_cols->{$order_by}; + $explicit_order_cols_params //= {}; + if ( exists $explicit_order_cols_params->{$order_by}->{join} ) { + $item_rs = $item_rs->search(undef, { + join => $explicit_order_cols_params->{$order_by}->{join}, + }); + } + } + if ($explicit_order_col_spec or $item_rs->result_source->has_column($order_by)) { + my $col = $explicit_order_col_spec || $item_rs->current_source_alias . '.' . $order_by; + if (lc($direction) eq 'desc') { + $item_rs = $item_rs->search(undef, { + order_by => {-desc => $col}, + }); + $c->log->debug("ordering by $col DESC"); + } else { + $item_rs = $item_rs->search(undef, { + order_by => "$col", + }); + $c->log->debug("ordering by $col"); + } } } my $result_class_after = $item_rs->result_class();