From 577a0d44737d7b60f2369c91819ff983634aeda0 Mon Sep 17 00:00:00 2001 From: ruchira123 Date: Wed, 15 Jul 2026 12:58:33 +0530 Subject: [PATCH 1/2] Add API-level filtering to exclude AGENT userstore from GET /userstores endpoint --- .../server/userstore/v1/UserstoresApi.java | 4 ++-- .../userstore/v1/UserstoresApiService.java | 3 +-- .../v1/impl/UserstoresApiServiceImpl.java | 23 +++++++++++++++---- .../src/main/resources/userstore.yaml | 10 ++++++++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/gen/java/org/wso2/carbon/identity/api/server/userstore/v1/UserstoresApi.java b/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/gen/java/org/wso2/carbon/identity/api/server/userstore/v1/UserstoresApi.java index 94cff1b19a..e590a792f6 100644 --- a/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/gen/java/org/wso2/carbon/identity/api/server/userstore/v1/UserstoresApi.java +++ b/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/gen/java/org/wso2/carbon/identity/api/server/userstore/v1/UserstoresApi.java @@ -190,9 +190,9 @@ public Response getPrimaryUserStore() { @ApiResponse(code = 500, message = "Internal Server Error.", response = Error.class), @ApiResponse(code = 501, message = "Not Implemented.", response = Error.class) }) - public Response getSecondaryUserStores( @Valid@ApiParam(value = "maximum number of records to return") @QueryParam("limit") Integer limit, @Valid@ApiParam(value = "number of records to skip for pagination") @QueryParam("offset") Integer offset, @Valid@ApiParam(value = "Condition to filter the retrieval of records.") @QueryParam("filter") String filter, @Valid@ApiParam(value = "Define the order of how the retrieved records should be sorted.") @QueryParam("sort") String sort, @Valid@ApiParam(value = "Define set of user store attributes (as comma separated) to be returned.") @QueryParam("requiredAttributes") String requiredAttributes) { + public Response getSecondaryUserStores( @Valid@ApiParam(value = "maximum number of records to return") @QueryParam("limit") Integer limit, @Valid@ApiParam(value = "number of records to skip for pagination") @QueryParam("offset") Integer offset, @Valid@ApiParam(value = "Condition to filter the retrieval of records.") @QueryParam("filter") String filter, @Valid@ApiParam(value = "Define the order of how the retrieved records should be sorted.") @QueryParam("sort") String sort, @Valid@ApiParam(value = "Define set of user store attributes (as comma separated) to be returned.") @QueryParam("requiredAttributes") String requiredAttributes, @Valid@ApiParam(value = "Whether to exclude AGENT userstore.") @QueryParam("excludeAgentUserstore") Boolean excludeAgentUserstore) { - return delegate.getSecondaryUserStores(limit, offset, filter, sort, requiredAttributes ); + return delegate.getSecondaryUserStores(limit, offset, filter, sort, requiredAttributes, excludeAgentUserstore ); } @Valid diff --git a/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/gen/java/org/wso2/carbon/identity/api/server/userstore/v1/UserstoresApiService.java b/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/gen/java/org/wso2/carbon/identity/api/server/userstore/v1/UserstoresApiService.java index f5e80f668a..86ed2a31fa 100644 --- a/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/gen/java/org/wso2/carbon/identity/api/server/userstore/v1/UserstoresApiService.java +++ b/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/gen/java/org/wso2/carbon/identity/api/server/userstore/v1/UserstoresApiService.java @@ -51,8 +51,7 @@ public interface UserstoresApiService { public Response getPrimaryUserStore(); - public Response getSecondaryUserStores(Integer limit, Integer offset, String filter, String sort, String requiredAttributes); - + public Response getSecondaryUserStores(Integer limit, Integer offset, String filter, String sort, String requiredAttributes, Boolean excludeAgentUserstore); public Response getUserStoreAttributeMappings(String typeId, Boolean includeIdentityClaimMappings); public Response getUserStoreByDomainId(String userstoreDomainId); diff --git a/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/java/org/wso2/carbon/identity/api/server/userstore/v1/impl/UserstoresApiServiceImpl.java b/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/java/org/wso2/carbon/identity/api/server/userstore/v1/impl/UserstoresApiServiceImpl.java index 992e110148..2bf1b8078c 100644 --- a/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/java/org/wso2/carbon/identity/api/server/userstore/v1/impl/UserstoresApiServiceImpl.java +++ b/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/java/org/wso2/carbon/identity/api/server/userstore/v1/impl/UserstoresApiServiceImpl.java @@ -28,12 +28,14 @@ import org.wso2.carbon.identity.api.server.userstore.v1.model.ClaimAttributeMapping; import org.wso2.carbon.identity.api.server.userstore.v1.model.PatchDocument; import org.wso2.carbon.identity.api.server.userstore.v1.model.RDBMSConnectionReq; +import org.wso2.carbon.identity.api.server.userstore.v1.model.UserStoreListResponse; import org.wso2.carbon.identity.api.server.userstore.v1.model.UserStoreReq; import org.wso2.carbon.identity.api.server.userstore.v1.model.UserStoreResponse; import java.io.InputStream; import java.net.URI; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.List; import javax.ws.rs.core.Response; @@ -42,7 +44,7 @@ import static org.wso2.carbon.identity.api.server.userstore.common.UserStoreConstants.USER_STORE_PATH_COMPONENT; /** - * User Store API Service Implementation + * User Store API Service Implementation. */ public class UserstoresApiServiceImpl implements UserstoresApiService { @@ -101,11 +103,22 @@ public Response getPrimaryUserStore() { @Override public Response getSecondaryUserStores(Integer limit, Integer offset, String filter, String sort, - String requiredAttributes) { + String requiredAttributes, Boolean excludeAgentUserstore) { + + List userStoreList = serverUserStoreService.getUserStoreList( + limit, offset, filter, sort, requiredAttributes); + + if (Boolean.TRUE.equals(excludeAgentUserstore) && userStoreList != null) { + List filteredUserStores = new ArrayList<>(); + for (UserStoreListResponse userStore : userStoreList) { + if (!"AGENT".equalsIgnoreCase(userStore.getName())) { + filteredUserStores.add(userStore); + } + } + return Response.ok().entity(filteredUserStores).build(); + } - return Response.ok() - .entity(serverUserStoreService.getUserStoreList(limit, offset, filter, sort, requiredAttributes)) - .build(); + return Response.ok().entity(userStoreList).build(); } @Override diff --git a/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/resources/userstore.yaml b/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/resources/userstore.yaml index 4086f9d598..f1d818a996 100644 --- a/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/resources/userstore.yaml +++ b/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/resources/userstore.yaml @@ -82,6 +82,8 @@ paths: - $ref: '#/components/parameters/filterQueryParam' - $ref: '#/components/parameters/sortQueryParam' - $ref: '#/components/parameters/requiredAttributesQueryParam' + - $ref: '#/components/parameters/excludeAgentUserstoreQueryParam' + responses: '200': description: Successful response. @@ -641,6 +643,14 @@ components: description: Define set of user store attributes (as comma separated) to be returned. schema: type: string + excludeAgentUserstoreQueryParam: + in: query + name: excludeAgentUserstore + required: false + description: Whether to exclude AGENT userstore. + schema: + type: boolean + default: false fileTypeHeaderParam: in: header name: Accept From 0f7168bcd526bc63a9b5eb2f8ba6e3b82e6275ff Mon Sep 17 00:00:00 2001 From: ruchira123 Date: Wed, 15 Jul 2026 13:34:07 +0530 Subject: [PATCH 2/2] Refactor filtering logic to use Java Streams --- .../v1/impl/UserstoresApiServiceImpl.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/java/org/wso2/carbon/identity/api/server/userstore/v1/impl/UserstoresApiServiceImpl.java b/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/java/org/wso2/carbon/identity/api/server/userstore/v1/impl/UserstoresApiServiceImpl.java index 2bf1b8078c..220a703506 100644 --- a/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/java/org/wso2/carbon/identity/api/server/userstore/v1/impl/UserstoresApiServiceImpl.java +++ b/components/org.wso2.carbon.identity.api.server.userstore/org.wso2.carbon.identity.api.server.userstore.v1/src/main/java/org/wso2/carbon/identity/api/server/userstore/v1/impl/UserstoresApiServiceImpl.java @@ -35,8 +35,8 @@ import java.io.InputStream; import java.net.URI; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import javax.ws.rs.core.Response; import static org.wso2.carbon.identity.api.server.common.Constants.V1_API_PATH_COMPONENT; @@ -101,7 +101,7 @@ public Response getPrimaryUserStore() { return Response.ok().entity(serverUserStoreService.getPrimaryUserStore()).build(); } - @Override + @Override public Response getSecondaryUserStores(Integer limit, Integer offset, String filter, String sort, String requiredAttributes, Boolean excludeAgentUserstore) { @@ -109,18 +109,14 @@ public Response getSecondaryUserStores(Integer limit, Integer offset, String fil limit, offset, filter, sort, requiredAttributes); if (Boolean.TRUE.equals(excludeAgentUserstore) && userStoreList != null) { - List filteredUserStores = new ArrayList<>(); - for (UserStoreListResponse userStore : userStoreList) { - if (!"AGENT".equalsIgnoreCase(userStore.getName())) { - filteredUserStores.add(userStore); - } - } + List filteredUserStores = userStoreList.stream() + .filter(userStore -> !"AGENT".equalsIgnoreCase(userStore.getName())) + .collect(Collectors.toList()); return Response.ok().entity(filteredUserStores).build(); } return Response.ok().entity(userStoreList).build(); } - @Override public Response getUserStoreAttributeMappings(String typeId, Boolean includeIdentityClaimMappings) {