Skip to content

Commit 8aeff20

Browse files
committed
Adding Popular Endpoints
1 parent 2cedb7b commit 8aeff20

2 files changed

Lines changed: 75 additions & 2 deletions

File tree

‎obp-api/src/main/scala/code/api/v6_0_0/APIMethods600.scala‎

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import code.api.util.FutureUtil.EndpointContext
1515
import code.api.util.Glossary
1616
import code.api.util.JsonSchemaGenerator
1717
import code.api.util.NewStyle.HttpCode
18-
import code.api.util.{APIUtil, CallContext, DiagnosticDynamicEntityCheck, ErrorMessages, NewStyle, RateLimitingUtil}
18+
import code.api.util.{APIUtil, CallContext, DiagnosticDynamicEntityCheck, ErrorMessages, NewStyle, OBPLimit, RateLimitingUtil}
1919
import net.liftweb.json
2020
import code.api.util.NewStyle.function.extractQueryParams
2121
import code.api.util.newstyle.ViewNewStyle
@@ -31,7 +31,7 @@ import code.api.v5_0_0.{ViewJsonV500, ViewsJsonV500}
3131
import code.api.v5_1_0.{JSONFactory510, PostCustomerLegalNameJsonV510}
3232
import code.api.dynamic.entity.helper.{DynamicEntityHelper, DynamicEntityInfo}
3333
import code.api.v6_0_0.JSONFactory600.{AddUserToGroupResponseJsonV600, DynamicEntityDiagnosticsJsonV600, DynamicEntityIssueJsonV600, GroupEntitlementJsonV600, GroupEntitlementsJsonV600, GroupJsonV600, GroupsJsonV600, PostGroupJsonV600, PostGroupMembershipJsonV600, PostResetPasswordUrlJsonV600, PutGroupJsonV600, ReferenceTypeJsonV600, ReferenceTypesJsonV600, ResetPasswordUrlJsonV600, RoleWithEntitlementCountJsonV600, RolesWithEntitlementCountsJsonV600, ScannedApiVersionJsonV600, UpdateViewJsonV600, UserGroupMembershipJsonV600, UserGroupMembershipsJsonV600, ValidateUserEmailJsonV600, ValidateUserEmailResponseJsonV600, ViewJsonV600, ViewPermissionJsonV600, ViewPermissionsJsonV600, ViewsJsonV600, createAbacRuleJsonV600, createAbacRulesJsonV600, createActiveRateLimitsJsonV600, createCallLimitJsonV600, createRedisCallCountersJson, createFeaturedApiCollectionJsonV600, createFeaturedApiCollectionsJsonV600}
34-
import code.api.v6_0_0.{AbacRuleJsonV600, AbacRuleResultJsonV600, AbacRulesJsonV600, CacheConfigJsonV600, CacheInfoJsonV600, CacheNamespaceInfoJsonV600, CreateAbacRuleJsonV600, CreateDynamicEntityRequestJsonV600, CurrentConsumerJsonV600, DynamicEntityDefinitionJsonV600, DynamicEntityDefinitionWithCountJsonV600, DynamicEntitiesWithCountJsonV600, DynamicEntityLinksJsonV600, ExecuteAbacRuleJsonV600, GetOidcClientResponseJsonV600, InMemoryCacheStatusJsonV600, MyDynamicEntitiesJsonV600, PostVerifyUserCredentialsJsonV600, RedisCacheStatusJsonV600, RelatedLinkJsonV600, UpdateAbacRuleJsonV600, UpdateDynamicEntityRequestJsonV600, VerifyOidcClientRequestJsonV600, VerifyOidcClientResponseJsonV600}
34+
import code.api.v6_0_0.{AbacRuleJsonV600, AbacRuleResultJsonV600, AbacRulesJsonV600, CacheConfigJsonV600, CacheInfoJsonV600, CacheNamespaceInfoJsonV600, CreateAbacRuleJsonV600, CreateDynamicEntityRequestJsonV600, CurrentConsumerJsonV600, DynamicEntityDefinitionJsonV600, DynamicEntityDefinitionWithCountJsonV600, DynamicEntitiesWithCountJsonV600, DynamicEntityLinksJsonV600, ExecuteAbacRuleJsonV600, GetOidcClientResponseJsonV600, InMemoryCacheStatusJsonV600, MyDynamicEntitiesJsonV600, PopularApisJsonV600, PostVerifyUserCredentialsJsonV600, RedisCacheStatusJsonV600, RelatedLinkJsonV600, UpdateAbacRuleJsonV600, UpdateDynamicEntityRequestJsonV600, VerifyOidcClientRequestJsonV600, VerifyOidcClientResponseJsonV600}
3535
import code.api.v6_0_0.OBPAPI6_0_0
3636
import code.abacrule.{AbacRuleEngine, MappedAbacRuleProvider}
3737
import code.metrics.APIMetrics
@@ -7699,6 +7699,74 @@ trait APIMethods600 {
76997699
}
77007700
}
77017701

7702+
staticResourceDocs += ResourceDoc(
7703+
getPopularApis,
7704+
implementedInApiVersion,
7705+
nameOf(getPopularApis),
7706+
"GET",
7707+
"/api/popular-endpoints",
7708+
"Get Popular Endpoints",
7709+
s"""Returns the operation IDs of the 50 most popular endpoints based on usage metrics.
7710+
|
7711+
|This endpoint is public and does not require authentication.
7712+
|
7713+
|The response contains a simple list of operation_id strings, ordered by popularity (most called first).
7714+
|
7715+
|This includes endpoints from all API standards: OBP, Berlin Group, UK Open Banking, STET, Polish API, etc.
7716+
|
7717+
|Example operation_id formats:
7718+
|* OBP: OBPv4.0.0-getBanks
7719+
|* Berlin Group: BGv1.3-getAccountList
7720+
|* UK Open Banking: UKv3.1-getAccounts
7721+
|
7722+
|""".stripMargin,
7723+
EmptyBody,
7724+
PopularApisJsonV600(
7725+
operation_ids = List(
7726+
"OBPv4.0.0-getBanks",
7727+
"OBPv4.0.0-getBank",
7728+
"BGv1.3-getAccountList"
7729+
)
7730+
),
7731+
List(
7732+
UnknownError
7733+
),
7734+
List(apiTagMetric, apiTagApi)
7735+
)
7736+
7737+
lazy val getPopularApis: OBPEndpoint = {
7738+
case "api" :: "popular-endpoints" :: Nil JsonGet _ => {
7739+
cc => implicit val ec = EndpointContext(Some(cc))
7740+
for {
7741+
(_, callContext) <- anonymousAccess(cc)
7742+
// Get top 50 APIs - use default date range (all time) with limit of 50
7743+
httpParams <- NewStyle.function.extractHttpParamsFromUrl(cc.url)
7744+
// Add limit=50 to the query params
7745+
limitParams = List(OBPLimit(50))
7746+
(obpQueryParams, _) <- createQueriesByHttpParamsFuture(httpParams, callContext)
7747+
queryParamsWithLimit = obpQueryParams ++ limitParams
7748+
topApis <- APIMetrics.apiMetrics.vend.getTopApisFuture(queryParamsWithLimit) map {
7749+
unboxFullOrFail(_, callContext, UnknownError)
7750+
}
7751+
} yield {
7752+
// Build lookup map from (partialFunctionName, shortVersion) -> operationId
7753+
// This handles OBP, Berlin Group, UK Open Banking, and other standards correctly
7754+
val allDocs = APIUtil.getAllResourceDocs
7755+
val lookupMap: Map[(String, String), String] = allDocs.map { doc =>
7756+
// Extract short version (e.g., "v4.0.0" from "OBPv4.0.0" or "v1.3" from "BGv1.3")
7757+
val shortVersion = doc.implementedInApiVersion.toString
7758+
(doc.partialFunctionName, shortVersion) -> doc.operationId
7759+
}.toMap
7760+
7761+
// Convert TopApi to operation_id, looking up correct format for each standard
7762+
val operationIds = topApis.flatMap { api =>
7763+
lookupMap.get((api.ImplementedByPartialFunction, api.implementedInVersion))
7764+
}
7765+
(PopularApisJsonV600(operationIds), HttpCode.`200`(callContext))
7766+
}
7767+
}
7768+
}
7769+
77027770
}
77037771
}
77047772

‎obp-api/src/main/scala/code/api/v6_0_0/JSONFactory6.0.0.scala‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,11 @@ case class FeaturedApiCollectionsJsonV600(
655655
featured_api_collections: List[FeaturedApiCollectionJsonV600]
656656
)
657657

658+
// Response for popular API endpoints (operation IDs only)
659+
case class PopularApisJsonV600(
660+
operation_ids: List[String]
661+
)
662+
658663
object JSONFactory600 extends CustomJsonFormats with MdcLoggable {
659664

660665
def createRedisCallCountersJson(

0 commit comments

Comments
 (0)