diff --git a/apps/dashboard/src/main/java/com/akto/action/ApiCollectionsAction.java b/apps/dashboard/src/main/java/com/akto/action/ApiCollectionsAction.java index 1cf5879057..fa537a6c41 100644 --- a/apps/dashboard/src/main/java/com/akto/action/ApiCollectionsAction.java +++ b/apps/dashboard/src/main/java/com/akto/action/ApiCollectionsAction.java @@ -528,7 +528,7 @@ public String getEndpointsListFromConditions() { InventoryAction inventoryAction = new InventoryAction(); inventoryAction.attachAPIInfoListInResponse(list,-1); this.setResponse(inventoryAction.getResponse()); - response.put("apiCount", ApiCollectionUsers.getApisCountFromConditions(conditions, new ArrayList<>(deactivatedCollections))); + response.put("apiCount", ApiCollectionUsers.getApisCountFromConditionsWithStis(conditions, new ArrayList<>(deactivatedCollections))); return SUCCESS.toUpperCase(); } public String getEndpointsFromConditions(){ diff --git a/libs/dao/src/main/java/com/akto/dao/SingleTypeInfoDao.java b/libs/dao/src/main/java/com/akto/dao/SingleTypeInfoDao.java index d848b96565..83392514cf 100644 --- a/libs/dao/src/main/java/com/akto/dao/SingleTypeInfoDao.java +++ b/libs/dao/src/main/java/com/akto/dao/SingleTypeInfoDao.java @@ -828,4 +828,11 @@ public List fetchRecentEndpoints(int startTimestamp, int endTimes return endpoints; } + public static BasicDBObject getApiInfoGroupedId() { + BasicDBObject groupedId = + new BasicDBObject("apiCollectionId", "$apiCollectionId") + .append("url", "$url") + .append("method", "$method"); + return groupedId; + } } diff --git a/libs/dao/src/main/java/com/akto/dto/ApiCollectionUsers.java b/libs/dao/src/main/java/com/akto/dto/ApiCollectionUsers.java index 86b6aefbb2..3750ad7a28 100644 --- a/libs/dao/src/main/java/com/akto/dto/ApiCollectionUsers.java +++ b/libs/dao/src/main/java/com/akto/dto/ApiCollectionUsers.java @@ -27,6 +27,7 @@ import com.akto.dao.context.Context; import com.akto.dao.demo.VulnerableRequestForTemplateDao; import com.akto.dao.testing_run_findings.TestingRunIssuesDao; +import com.akto.dto.rbac.UsersCollectionsList; import com.akto.dto.testing.CustomTestingEndpoints; import com.akto.dto.testing.SensitiveDataEndpoints; import com.akto.dto.testing.TestingEndpoints; @@ -35,6 +36,7 @@ import com.akto.util.Constants; import com.mongodb.BasicDBObject; import com.mongodb.client.MongoCursor; +import com.mongodb.client.model.Accumulators; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Projections; @@ -94,6 +96,42 @@ public static int getApisCountFromConditions(List conditions, return (int) ApiInfoDao.instance.count(apiInfoFilters); } + public static int getApisCountFromConditionsWithStis(List conditions, List deactivatedCollections){ + if(conditions == null || conditions.isEmpty()){ + return 0; + } + + Bson stiFiltes = getFilters(conditions, CollectionType.ApiCollectionId); + List pipeLine = new ArrayList<>(); + pipeLine.add(Aggregates.match(stiFiltes)); + + try { + List collectionIds = UsersCollectionsList.getCollectionsIdForUser(Context.userId.get(), Context.accountId.get()); + if(collectionIds != null) { + pipeLine.add(Aggregates.match(Filters.in(SingleTypeInfo._COLLECTION_IDS, collectionIds))); + } + } catch(Exception e){ + } + + pipeLine.add(Aggregates.match(Filters.and( + Filters.eq(SingleTypeInfo._RESPONSE_CODE, -1), + Filters.eq(SingleTypeInfo._IS_HEADER, true) + ))); + BasicDBObject groupedId = SingleTypeInfoDao.getApiInfoGroupedId(); + pipeLine.add(Aggregates.group(groupedId, Accumulators.sum("count", 1))); + pipeLine.add(Aggregates.count("finalCount")); + + int ansCount = 0; + + MongoCursor countCursor = SingleTypeInfoDao.instance.getMCollection().aggregate(pipeLine, BasicDBObject.class).cursor(); + while(countCursor.hasNext()){ + BasicDBObject dbObject = countCursor.next(); + ansCount = dbObject.getInt("finalCount"); + } + + return ansCount; + } + public static void updateApiCollection(List conditions, int id) { ApiCollectionsDao.instance.updateOne(