@@ -79,7 +79,7 @@ public class AspectModelOpenApiGenerator {
79
79
private static final String NOT_FOUND_ERROR = "NotFoundError" ;
80
80
private static final String OPERATIONS_SERVER_PATH = "/rpc-api/%s" ;
81
81
private static final String TENANT_ID = "/{tenant-id}" ;
82
- private static final String OPERATIONS_ENDPOINT_PATH = TENANT_ID + "/ %s/operations" ;
82
+ private static final String OPERATIONS_ENDPOINT_PATH = " %s/operations" ;
83
83
private static final String PARAMETER_CONVENTION = "^[a-zA-Z][a-zA-Z0-9-_]*" ;
84
84
private static final String QUERY_SERVER_PATH = "/query-api/%s" ;
85
85
private static final String READ_SERVER_PATH = "/api/%s" ;
@@ -398,21 +398,25 @@ private ObjectNode getPathsNode( final Aspect aspect, final String baseUrl, fina
398
398
final Optional <JsonNode > jsonProperties , final boolean includeQueryApi , final Optional <PagingOption > selectedPagingOption ) throws IOException {
399
399
final ObjectNode endpointPathsNode = factory .objectNode ();
400
400
final ObjectNode pathNode = factory .objectNode ();
401
- final String finalResourcePath = resourcePath .orElse ( deriveResourcePathFromAspectName ( aspect .getName () ) );
402
401
final ObjectNode propertiesNode = getPropertiesNode ( resourcePath , jsonProperties );
403
- endpointPathsNode .set ( TENANT_ID + "/" + finalResourcePath , pathNode );
402
+ // If resource path is provided then use it as the complete path and don't prefix tenant-id to it.
403
+ final String finalResourcePath = resourcePath
404
+ .map ( path -> path .startsWith ( "/" ) ? path : "/" + path )
405
+ .orElse ( TENANT_ID + "/" + deriveResourcePathFromAspectName ( aspect .getName () ) );
406
+
407
+ endpointPathsNode .set ( finalResourcePath , pathNode );
404
408
405
409
if ( includePaging ( aspect , selectedPagingOption ) ) {
406
410
pagingGenerator .setPagingProperties ( aspect , selectedPagingOption , propertiesNode );
407
411
}
408
412
409
- pathNode .set ( FIELD_GET , getRequestEndpointsRead ( aspect , propertiesNode ) );
413
+ pathNode .set ( FIELD_GET , getRequestEndpointsRead ( aspect , propertiesNode , resourcePath ) );
410
414
411
415
if ( includeQueryApi ) {
412
- pathNode .set ( FIELD_POST , getRequestEndpointFilter ( aspect , propertiesNode , baseUrl , apiVersion ) );
416
+ pathNode .set ( FIELD_POST , getRequestEndpointFilter ( aspect , propertiesNode , baseUrl , apiVersion , resourcePath ) );
413
417
}
414
418
415
- final Optional <ObjectNode > operationsNode = getRequestEndpointOperations ( aspect , propertiesNode , baseUrl , apiVersion );
419
+ final Optional <ObjectNode > operationsNode = getRequestEndpointOperations ( aspect , propertiesNode , baseUrl , apiVersion , resourcePath );
416
420
operationsNode .ifPresent (
417
421
jsonNodes -> endpointPathsNode
418
422
.set ( String .format ( OPERATIONS_ENDPOINT_PATH , finalResourcePath ), jsonNodes ) );
@@ -424,14 +428,14 @@ private String deriveResourcePathFromAspectName( final String aspectName ) {
424
428
}
425
429
426
430
private Optional <ObjectNode > getRequestEndpointOperations ( final Aspect aspect , final ObjectNode parameterNode , final String baseUrl ,
427
- final String apiVersion ) {
431
+ final String apiVersion , final Optional < String > resourcePath ) {
428
432
if ( !aspect .getOperations ().isEmpty () ) {
429
433
final ObjectNode postNode = factory .objectNode ();
430
434
final ObjectNode objectNode = factory .objectNode ();
431
435
setServers ( objectNode , baseUrl , apiVersion , OPERATIONS_SERVER_PATH );
432
436
objectNode .set ( "tags" , factory .arrayNode ().add ( aspect .getName () ) );
433
437
objectNode .put ( FIELD_OPERATION_ID , FIELD_POST + FIELD_OPERATION + aspect .getName () );
434
- objectNode .set ( FIELD_PARAMETERS , getRequiredParameters ( parameterNode ) );
438
+ objectNode .set ( FIELD_PARAMETERS , getRequiredParameters ( parameterNode , resourcePath . isEmpty () ) );
435
439
objectNode .set ( "requestBody" , factory .objectNode ().put ( REF , COMPONENTS_REQUESTS + FIELD_OPERATION ) );
436
440
final ObjectNode responseNode = factory .objectNode ();
437
441
objectNode .set ( FIELD_RESPONSES , responseNode );
@@ -495,12 +499,13 @@ private ObjectNode getResponseSchemaForOperation( final Optional<Property> prope
495
499
return schemaNode ;
496
500
}
497
501
498
- private ObjectNode getRequestEndpointFilter ( final Aspect aspect , final ObjectNode parameterNode , final String baseUrl , final String apiVersion ) {
502
+ private ObjectNode getRequestEndpointFilter ( final Aspect aspect , final ObjectNode parameterNode , final String baseUrl , final String apiVersion ,
503
+ final Optional <String > resourcePath ) {
499
504
final ObjectNode objectNode = factory .objectNode ();
500
505
setServers ( objectNode , baseUrl , apiVersion , QUERY_SERVER_PATH );
501
506
objectNode .set ( "tags" , factory .arrayNode ().add ( aspect .getName () ) );
502
507
objectNode .put ( FIELD_OPERATION_ID , FIELD_POST + aspect .getName () );
503
- objectNode .set ( FIELD_PARAMETERS , getRequiredParameters ( parameterNode ) );
508
+ objectNode .set ( FIELD_PARAMETERS , getRequiredParameters ( parameterNode , resourcePath . isEmpty () ) );
504
509
objectNode .set ( "requestBody" , getRequestBodyForFilter () );
505
510
objectNode .set ( FIELD_RESPONSES , getResponsesForGet ( aspect ) );
506
511
return objectNode ;
@@ -510,11 +515,11 @@ private ObjectNode getRequestBodyForFilter() {
510
515
return factory .objectNode ().put ( REF , COMPONENTS_REQUESTS + FIELD_FILTER );
511
516
}
512
517
513
- private ObjectNode getRequestEndpointsRead ( final Aspect aspect , final ObjectNode parameterNode ) {
518
+ private ObjectNode getRequestEndpointsRead ( final Aspect aspect , final ObjectNode parameterNode , final Optional < String > resourcePath ) {
514
519
final ObjectNode objectNode = factory .objectNode ();
515
520
objectNode .set ( "tags" , factory .arrayNode ().add ( aspect .getName () ) );
516
521
objectNode .put ( FIELD_OPERATION_ID , FIELD_GET + aspect .getName () );
517
- objectNode .set ( FIELD_PARAMETERS , getRequiredParameters ( parameterNode ) );
522
+ objectNode .set ( FIELD_PARAMETERS , getRequiredParameters ( parameterNode , resourcePath . isEmpty () ) );
518
523
objectNode .set ( FIELD_RESPONSES , getResponsesForGet ( aspect ) );
519
524
return objectNode ;
520
525
}
@@ -541,9 +546,11 @@ private ObjectNode getSuccessfulNode( final Aspect aspect ) {
541
546
return factory .objectNode ().put ( REF , COMPONENTS_RESPONSES + aspect .getName () );
542
547
}
543
548
544
- private ArrayNode getRequiredParameters ( final ObjectNode parameterNode ) {
549
+ private ArrayNode getRequiredParameters ( final ObjectNode parameterNode , final boolean includeTenantIdNode ) {
545
550
final ArrayNode parameters = factory .arrayNode ();
546
- parameters .add ( getTenantIdNode () );
551
+ if ( includeTenantIdNode ) {
552
+ parameters .add ( getTenantIdNode () );
553
+ }
547
554
parameterNode .forEach ( parameters ::add );
548
555
return parameters ;
549
556
}
0 commit comments