#732 Node Search via API for known node returns invalid or empty JSON
A few things going on here ... swagger submitting "false" query
params which intefered with truth testing by existence, and also the
Node search not using {results => {}} format response for template,
and also that response then containing DBIC objects which cannot be
translated to JSON without running HRI first.
This commit is contained in:
@@ -16,6 +16,9 @@ use HTML::Entities (); # to ensure dependency is met
|
|||||||
use URI::QueryParam (); # part of URI, to add helper methods
|
use URI::QueryParam (); # part of URI, to add helper methods
|
||||||
use Path::Class 'dir';
|
use Path::Class 'dir';
|
||||||
use Module::Load ();
|
use Module::Load ();
|
||||||
|
use Data::Visitor::Tiny;
|
||||||
|
use Scalar::Util 'blessed';
|
||||||
|
|
||||||
use App::Netdisco::Util::Web qw/
|
use App::Netdisco::Util::Web qw/
|
||||||
interval_to_daterange
|
interval_to_daterange
|
||||||
request_is_api
|
request_is_api
|
||||||
@@ -156,6 +159,13 @@ hook 'before' => sub {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# swagger submits "false" params whereas web UI does not - remove them
|
||||||
|
# so that code testing for param existence as truth still works.
|
||||||
|
hook 'before' => sub {
|
||||||
|
return unless request_is_api_report or request_is_api_search;
|
||||||
|
map {delete params->{$_} if params->{$_} eq 'false'} keys %{params()};
|
||||||
|
};
|
||||||
|
|
||||||
hook 'before_template' => sub {
|
hook 'before_template' => sub {
|
||||||
# search or report from navbar, or reset of sidebar, can ignore params
|
# search or report from navbar, or reset of sidebar, can ignore params
|
||||||
return if param('firstsearch')
|
return if param('firstsearch')
|
||||||
@@ -252,8 +262,25 @@ hook before_layout_render => sub {
|
|||||||
my ($tokens, $html_ref) = @_;
|
my ($tokens, $html_ref) = @_;
|
||||||
return unless request_is_api_report or request_is_api_search;
|
return unless request_is_api_report or request_is_api_search;
|
||||||
|
|
||||||
${ $html_ref } =
|
if (ref {} eq ref $tokens and exists $tokens->{results}) {
|
||||||
$tokens->{results} ? (to_json $tokens->{results}) : {};
|
${ $html_ref } = to_json $tokens->{results};
|
||||||
|
}
|
||||||
|
elsif (ref {} eq ref $tokens) {
|
||||||
|
map {delete $tokens->{$_}}
|
||||||
|
grep {not blessed $tokens->{$_} or not $tokens->{$_}->isa('App::Netdisco::DB::ResultSet')}
|
||||||
|
keys %$tokens;
|
||||||
|
|
||||||
|
visit( $tokens, sub {
|
||||||
|
my ( $key, $valueref ) = @_;
|
||||||
|
$$valueref = [$$valueref->hri->all]
|
||||||
|
if blessed $$valueref and $$valueref->isa('App::Netdisco::DB::ResultSet');
|
||||||
|
});
|
||||||
|
|
||||||
|
${ $html_ref } = to_json $tokens;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
${ $html_ref } = '[]';
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
# workaround for Swagger plugin weird response body
|
# workaround for Swagger plugin weird response body
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ use Dancer::Plugin::Auth::Extensible;
|
|||||||
use NetAddr::IP::Lite ':lower';
|
use NetAddr::IP::Lite ':lower';
|
||||||
use Regexp::Common 'net';
|
use Regexp::Common 'net';
|
||||||
use NetAddr::MAC ();
|
use NetAddr::MAC ();
|
||||||
|
use POSIX qw/strftime/;
|
||||||
|
|
||||||
use App::Netdisco::Web::Plugin;
|
use App::Netdisco::Web::Plugin;
|
||||||
use App::Netdisco::Util::Web 'sql_match';
|
use App::Netdisco::Util::Web 'sql_match';
|
||||||
@@ -42,6 +43,7 @@ register_search_tab({
|
|||||||
},
|
},
|
||||||
daterange => {
|
daterange => {
|
||||||
description => 'Date Range in format "YYYY-MM-DD to YYYY-MM-DD"',
|
description => 'Date Range in format "YYYY-MM-DD to YYYY-MM-DD"',
|
||||||
|
default => ('1970-01-01 to '. strftime('%Y-%m-%d', gmtime)),
|
||||||
},
|
},
|
||||||
age_invert => {
|
age_invert => {
|
||||||
description => 'Results should NOT be within daterange',
|
description => 'Results should NOT be within daterange',
|
||||||
|
|||||||
Reference in New Issue
Block a user