From d6ec7c33b2a3de6b145705f14e7d4517c114ed54 Mon Sep 17 00:00:00 2001 From: simonredfern Date: Wed, 25 Mar 2026 06:07:50 +0100 Subject: [PATCH] Fix empty Operation ID for resource-docs and swagger endpoints The ResourceDocs objects (v1.4.0 through v6.0.0) registered their routes via manual oauthServe loops without passing the ResourceDoc. This meant callContext.resourceDocument was None, so partialFunctionName was "" and Operation IDs in API metrics appeared as e.g. "OBPv6.0.0-" instead of "OBPv6.0.0-getResourceDocsSwagger". Affected endpoints across all served API versions: - getResourceDocsObp (/resource-docs/API_VERSION/obp) - getResourceDocsObpV400 (/resource-docs/API_VERSION/obp) - getResourceDocsSwagger (/resource-docs/API_VERSION/swagger) - getResourceDocsOpenAPI31 (/resource-docs/API_VERSION/openapi3.1) - getBankLevelDynamicResourceDocsObp (/banks/BANK_ID/resource-docs/API_VERSION/obp) Switch all ResourceDocs objects to use registerRoutes() which matches each route to its ResourceDoc before calling oauthServe. --- .../ResourceDocs1_4_0/ResourceDocs140.scala | 82 ++++++------------- 1 file changed, 26 insertions(+), 56 deletions(-) diff --git a/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocs140.scala b/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocs140.scala index 4f4e46793a..231cb437e3 100644 --- a/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocs140.scala +++ b/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocs140.scala @@ -17,14 +17,12 @@ import net.liftweb.http.{GetRequest, InMemoryResponse, PlainTextResponse, Req, S object ResourceDocs140 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable { val version = ApiVersion.v1_4_0 // "1.4.0" // We match other api versions so API explorer can easily use the path. val versionStatus = ApiVersionStatus.STABLE.toString - val routes: Seq[OBPEndpoint] = List( + val routes: List[OBPEndpoint] = List( ImplementationsResourceDocs.getResourceDocsObp, ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp, ImplementationsResourceDocs.getResourceDocsSwagger, ) - routes.foreach(route => { - oauthServe(apiPrefix{route}) - }) + registerRoutes(routes, ImplementationsResourceDocs.localResourceDocs, apiPrefix) } @@ -32,14 +30,12 @@ object ResourceDocs140 extends OBPRestHelper with ResourceDocsAPIMethods with Md object ResourceDocs200 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable { val version = ApiVersion.v2_0_0 // "2.0.0" // We match other api versions so API explorer can easily use the path. val versionStatus = ApiVersionStatus.STABLE.toString - val routes: Seq[OBPEndpoint] = List( + val routes: List[OBPEndpoint] = List( ImplementationsResourceDocs.getResourceDocsObp, ImplementationsResourceDocs.getResourceDocsSwagger, ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp, ) - routes.foreach(route => { - oauthServe(apiPrefix{route}) - }) + registerRoutes(routes, ImplementationsResourceDocs.localResourceDocs, apiPrefix) } @@ -47,121 +43,95 @@ object ResourceDocs200 extends OBPRestHelper with ResourceDocsAPIMethods with Md object ResourceDocs210 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable { val version: ApiVersion = ApiVersion.v2_1_0 // "2.1.0" // We match other api versions so API explorer can easily use the path. val versionStatus = ApiVersionStatus.STABLE.toString - val routes: Seq[OBPEndpoint] = List( + val routes: List[OBPEndpoint] = List( ImplementationsResourceDocs.getResourceDocsObp, ImplementationsResourceDocs.getResourceDocsSwagger, ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp, ) - routes.foreach(route => { - oauthServe(apiPrefix{route}) - }) + registerRoutes(routes, ImplementationsResourceDocs.localResourceDocs, apiPrefix) } // Hack to provide Resource Docs / Swagger on endpoints other than 1.4.0 where it is defined. object ResourceDocs220 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable { val version: ApiVersion = ApiVersion.v2_2_0 // "2.2.0" // We match other api versions so API explorer can easily use the path. val versionStatus = ApiVersionStatus.STABLE.toString - val routes: Seq[OBPEndpoint] = List( + val routes: List[OBPEndpoint] = List( ImplementationsResourceDocs.getResourceDocsObp, ImplementationsResourceDocs.getResourceDocsSwagger, ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp, ) - routes.foreach(route => { - oauthServe(apiPrefix{route}) - }) + registerRoutes(routes, ImplementationsResourceDocs.localResourceDocs, apiPrefix) } // Hack to provide Resource Docs / Swagger on endpoints other than 1.4.0 where it is defined. object ResourceDocs300 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable { val version : ApiVersion = ApiVersion.v3_0_0 // = "3.0.0" // We match other api versions so API explorer can easily use the path. val versionStatus = ApiVersionStatus.STABLE.toString - val routes: Seq[OBPEndpoint] = List( + val routes: List[OBPEndpoint] = List( ImplementationsResourceDocs.getResourceDocsObp, ImplementationsResourceDocs.getResourceDocsSwagger, ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp, ) - routes.foreach(route => { - oauthServe(apiPrefix{route}) - }) + registerRoutes(routes, ImplementationsResourceDocs.localResourceDocs, apiPrefix) // Hack to provide Resource Docs / Swagger on endpoints other than 1.4.0 where it is defined. object ResourceDocs310 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable { val version: ApiVersion = ApiVersion.v3_1_0 // = "3.0.0" // We match other api versions so API explorer can easily use the path. val versionStatus = ApiVersionStatus.STABLE.toString - val routes: Seq[OBPEndpoint] = List( + val routes: List[OBPEndpoint] = List( ImplementationsResourceDocs.getResourceDocsObp, ImplementationsResourceDocs.getResourceDocsSwagger, ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp, ) - routes.foreach(route => { - oauthServe(apiPrefix { - route - }) - }) + registerRoutes(routes, ImplementationsResourceDocs.localResourceDocs, apiPrefix) } // Hack to provide Resource Docs / Swagger on endpoints other than 1.4.0 where it is defined. object ResourceDocs400 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable { val version: ApiVersion = ApiVersion.v4_0_0 // = "4.0.0" // We match other api versions so API explorer can easily use the path. val versionStatus = ApiVersionStatus.STABLE.toString - val routes: Seq[OBPEndpoint] = List( + val routes: List[OBPEndpoint] = List( ImplementationsResourceDocs.getResourceDocsObpV400, ImplementationsResourceDocs.getResourceDocsSwagger, ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp, ) - routes.foreach(route => { - oauthServe(apiPrefix { - route - }) - }) + registerRoutes(routes, ImplementationsResourceDocs.localResourceDocs, apiPrefix) } // Hack to provide Resource Docs / Swagger on endpoints other than 1.4.0 where it is defined. object ResourceDocs500 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable { - val version: ApiVersion = ApiVersion.v5_0_0 + val version: ApiVersion = ApiVersion.v5_0_0 val versionStatus = ApiVersionStatus.STABLE.toString - val routes: Seq[OBPEndpoint] = List( + val routes: List[OBPEndpoint] = List( ImplementationsResourceDocs.getResourceDocsObpV400, ImplementationsResourceDocs.getResourceDocsSwagger, ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp, ) - routes.foreach(route => { - oauthServe(apiPrefix { - route - }) - }) - } - + registerRoutes(routes, ImplementationsResourceDocs.localResourceDocs, apiPrefix) + } + object ResourceDocs510 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable { - val version: ApiVersion = ApiVersion.v5_1_0 + val version: ApiVersion = ApiVersion.v5_1_0 val versionStatus = ApiVersionStatus.BLEEDING_EDGE.toString - val routes: Seq[OBPEndpoint] = List( + val routes: List[OBPEndpoint] = List( ImplementationsResourceDocs.getResourceDocsObpV400, ImplementationsResourceDocs.getResourceDocsSwagger, ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp, // ImplementationsResourceDocs.getStaticResourceDocsObp ) - routes.foreach(route => { - oauthServe(apiPrefix { - route - }) - }) + registerRoutes(routes, ImplementationsResourceDocs.localResourceDocs, apiPrefix) } - + object ResourceDocs600 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable { - val version: ApiVersion = ApiVersion.v6_0_0 + val version: ApiVersion = ApiVersion.v6_0_0 val versionStatus = ApiVersionStatus.BLEEDING_EDGE.toString override def includeTechnologyInResponse: Boolean = true - val routes: Seq[OBPEndpoint] = List( + val routes: List[OBPEndpoint] = List( ImplementationsResourceDocs.getResourceDocsObpV400, ImplementationsResourceDocs.getResourceDocsSwagger, ImplementationsResourceDocs.getResourceDocsOpenAPI31, ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp, // ImplementationsResourceDocs.getStaticResourceDocsObp ) - routes.foreach(route => { - oauthServe(apiPrefix { - route - }) - }) + registerRoutes(routes, ImplementationsResourceDocs.localResourceDocs, apiPrefix) // Register YAML endpoint using standard RestHelper approach serve {