separate openapi to own module
This commit is contained in:
		@@ -5,7 +5,6 @@ use Dancer::Plugin::Ajax;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use Dancer::Plugin::DBIC;
 | 
					use Dancer::Plugin::DBIC;
 | 
				
			||||||
use Dancer::Plugin::Auth::Extensible;
 | 
					use Dancer::Plugin::Auth::Extensible;
 | 
				
			||||||
use Dancer::Plugin::Swagger;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
use URI ();
 | 
					use URI ();
 | 
				
			||||||
use Socket6 (); # to ensure dependency is met
 | 
					use Socket6 (); # to ensure dependency is met
 | 
				
			||||||
@@ -17,6 +16,7 @@ use App::Netdisco::Util::Web
 | 
				
			|||||||
  qw/request_is_api interval_to_daterange/;
 | 
					  qw/request_is_api interval_to_daterange/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use App::Netdisco::Web::AuthN;
 | 
					use App::Netdisco::Web::AuthN;
 | 
				
			||||||
 | 
					use App::Netdisco::Web::OpenAPI;
 | 
				
			||||||
use App::Netdisco::Web::Static;
 | 
					use App::Netdisco::Web::Static;
 | 
				
			||||||
use App::Netdisco::Web::Search;
 | 
					use App::Netdisco::Web::Search;
 | 
				
			||||||
use App::Netdisco::Web::Device;
 | 
					use App::Netdisco::Web::Device;
 | 
				
			||||||
@@ -77,28 +77,6 @@ eval {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
Dancer::Session::Cookie::init(session);
 | 
					Dancer::Session::Cookie::init(session);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# setup for swagger API
 | 
					 | 
				
			||||||
my $swagger = Dancer::Plugin::Swagger->instance->doc;
 | 
					 | 
				
			||||||
$swagger->{schemes} = ['http','https'];
 | 
					 | 
				
			||||||
$swagger->{consumes} = 'application/json';
 | 
					 | 
				
			||||||
$swagger->{produces} = 'application/json';
 | 
					 | 
				
			||||||
$swagger->{tags} = [
 | 
					 | 
				
			||||||
  {name => 'General'},
 | 
					 | 
				
			||||||
  {name => 'Devices',
 | 
					 | 
				
			||||||
    description => 'Operations relating to Devices (switches, routers, etc)'},
 | 
					 | 
				
			||||||
  {name => 'Nodes',
 | 
					 | 
				
			||||||
    description => 'Operations relating to Nodes (end-stations such as printers)'},
 | 
					 | 
				
			||||||
  {name => 'NodeIPs',
 | 
					 | 
				
			||||||
    description => 'Operations relating to MAC-IP mappings (IPv4 ARP and IPv6 Neighbors)'},
 | 
					 | 
				
			||||||
];
 | 
					 | 
				
			||||||
$swagger->{securityDefinitions} = {
 | 
					 | 
				
			||||||
  APIKeyHeader =>
 | 
					 | 
				
			||||||
    { type => 'apiKey', name => 'Authorization', in => 'header' },
 | 
					 | 
				
			||||||
  BasicAuth =>
 | 
					 | 
				
			||||||
    { type => 'basic' },
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
$swagger->{security} = [ { APIKeyHeader => [] } ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# workaround for https://github.com/PerlDancer/Dancer/issues/935
 | 
					# workaround for https://github.com/PerlDancer/Dancer/issues/935
 | 
				
			||||||
hook after_error_render => sub { setting('layout' => 'main') };
 | 
					hook after_error_render => sub { setting('layout' => 'main') };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -123,11 +101,6 @@ hook after_error_render => sub { setting('layout' => 'main') };
 | 
				
			|||||||
    for @port_columns;
 | 
					    for @port_columns;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# support for checking if this is an api request even after forward
 | 
					 | 
				
			||||||
hook 'before' => sub {
 | 
					 | 
				
			||||||
  vars->{'orig_path'} = request->path unless request->is_forward;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
hook 'before' => sub {
 | 
					hook 'before' => sub {
 | 
				
			||||||
  my $key = request->path;
 | 
					  my $key = request->path;
 | 
				
			||||||
  if (param('tab') and ($key !~ m/ajax/)) {
 | 
					  if (param('tab') and ($key !~ m/ajax/)) {
 | 
				
			||||||
@@ -211,16 +184,6 @@ hook 'before_template' => sub {
 | 
				
			|||||||
    $Template::Stash::PRIVATE = undef;
 | 
					    $Template::Stash::PRIVATE = undef;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# workaround for Swagger plugin weird response body
 | 
					 | 
				
			||||||
hook 'after' => sub {
 | 
					 | 
				
			||||||
    my $r = shift; # a Dancer::Response
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (request->path eq '/swagger.json') {
 | 
					 | 
				
			||||||
        $r->content( to_json( $r->content ) );
 | 
					 | 
				
			||||||
        header('Content-Type' => 'application/json');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# remove empty lines from CSV response
 | 
					# remove empty lines from CSV response
 | 
				
			||||||
# this makes writing templates much more straightforward!
 | 
					# this makes writing templates much more straightforward!
 | 
				
			||||||
hook 'after' => sub {
 | 
					hook 'after' => sub {
 | 
				
			||||||
@@ -238,17 +201,6 @@ hook 'after' => sub {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# forward API calls to AJAX route handlers
 | 
					 | 
				
			||||||
any '/api/:type/:identifier/:method' => require_login sub {
 | 
					 | 
				
			||||||
    pass unless setting('api_enabled')
 | 
					 | 
				
			||||||
      ->{ params->{'type'} }->{ params->{'method'} };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    vars->{'is_api'} = 1;
 | 
					 | 
				
			||||||
    my $target =
 | 
					 | 
				
			||||||
      sprintf '/ajax/content/%s/%s', params->{'type'}, params->{'method'};
 | 
					 | 
				
			||||||
    forward $target, { tab => params->{'method'}, q => params->{'identifier'} };
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
any qr{.*} => sub {
 | 
					any qr{.*} => sub {
 | 
				
			||||||
    if (request_is_api()) {
 | 
					    if (request_is_api()) {
 | 
				
			||||||
      status(404);
 | 
					      status(404);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										59
									
								
								lib/App/Netdisco/Web/OpenAPI.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								lib/App/Netdisco/Web/OpenAPI.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					package App::Netdisco::Web;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Dancer ':syntax';
 | 
				
			||||||
 | 
					use Dancer::Plugin::Ajax;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Dancer::Plugin::Swagger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use App::Netdisco::Util::Web
 | 
				
			||||||
 | 
					  qw/request_is_api interval_to_daterange/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# setup for swagger API
 | 
				
			||||||
 | 
					my $swagger = Dancer::Plugin::Swagger->instance->doc;
 | 
				
			||||||
 | 
					$swagger->{schemes} = ['http','https'];
 | 
				
			||||||
 | 
					$swagger->{consumes} = 'application/json';
 | 
				
			||||||
 | 
					$swagger->{produces} = 'application/json';
 | 
				
			||||||
 | 
					$swagger->{tags} = [
 | 
				
			||||||
 | 
					  {name => 'General'},
 | 
				
			||||||
 | 
					  {name => 'Devices',
 | 
				
			||||||
 | 
					    description => 'Operations relating to Devices (switches, routers, etc)'},
 | 
				
			||||||
 | 
					  {name => 'Nodes',
 | 
				
			||||||
 | 
					    description => 'Operations relating to Nodes (end-stations such as printers)'},
 | 
				
			||||||
 | 
					  {name => 'NodeIPs',
 | 
				
			||||||
 | 
					    description => 'Operations relating to MAC-IP mappings (IPv4 ARP and IPv6 Neighbors)'},
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					$swagger->{securityDefinitions} = {
 | 
				
			||||||
 | 
					  APIKeyHeader =>
 | 
				
			||||||
 | 
					    { type => 'apiKey', name => 'Authorization', in => 'header' },
 | 
				
			||||||
 | 
					  BasicAuth =>
 | 
				
			||||||
 | 
					    { type => 'basic' },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					$swagger->{security} = [ { APIKeyHeader => [] } ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# support for checking if this is an api request even after forward
 | 
				
			||||||
 | 
					hook 'before' => sub {
 | 
				
			||||||
 | 
					  vars->{'orig_path'} = request->path unless request->is_forward;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# workaround for Swagger plugin weird response body
 | 
				
			||||||
 | 
					hook 'after' => sub {
 | 
				
			||||||
 | 
					    my $r = shift; # a Dancer::Response
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (request->path eq '/swagger.json') {
 | 
				
			||||||
 | 
					        $r->content( to_json( $r->content ) );
 | 
				
			||||||
 | 
					        header('Content-Type' => 'application/json');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# forward API calls to AJAX route handlers
 | 
				
			||||||
 | 
					any '/api/:type/:identifier/:method' => require_login sub {
 | 
				
			||||||
 | 
					    pass unless setting('api_enabled')
 | 
				
			||||||
 | 
					      ->{ params->{'type'} }->{ params->{'method'} };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    vars->{'is_api'} = 1;
 | 
				
			||||||
 | 
					    my $target =
 | 
				
			||||||
 | 
					      sprintf '/ajax/content/%s/%s', params->{'type'}, params->{'method'};
 | 
				
			||||||
 | 
					    forward $target, { tab => params->{'method'}, q => params->{'identifier'} };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					true;
 | 
				
			||||||
		Reference in New Issue
	
	Block a user