Skip to content

Add CredentialManagementService to user credential API v2#299

Merged
pamodaaw merged 1 commit into
wso2:masterfrom
pamodaaw:feature/user-credential-api-v2
Jun 11, 2026
Merged

Add CredentialManagementService to user credential API v2#299
pamodaaw merged 1 commit into
wso2:masterfrom
pamodaaw:feature/user-credential-api-v2

Conversation

@pamodaaw

@pamodaaw pamodaaw commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Introduce CredentialManagementService as a dedicated core service layer (mirroring the SessionManagementService pattern) responsible for user ID validation, credential handler resolution, and translating handler results to API response DTOs
  • Slim down UsersCredentialApiServiceImpl to a thin delegation layer that only builds Response objects
  • Fix CredentialManagementUtils.validateUserId: handle UserStoreException from isExistingUserWithID, add a proper debug log and early return false when the user store manager does not support unique IDs (instead of falling through to an unsafe cast), and replace RuntimeException with a typed CredentialMgtServerException
  • Move credential ID validation inline to CredentialManagementService and clean up now-unused methods from CredentialMgtEndpointUtils

Comment on lines 82 to 84
} catch (PushDeviceHandlerClientException e) {
if (ERROR_CODE_PUSH_AUTH_DEVICE_NOT_FOUND.equals(e.getErrorCode())) {
if (ERROR_CODE_DEVICE_NOT_FOUND_FOR_USER_ID.getCode().equals(e.getErrorCode())) {
if (LOG.isDebugEnabled()) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 1

Suggested change
} catch (PushDeviceHandlerClientException e) {
if (ERROR_CODE_PUSH_AUTH_DEVICE_NOT_FOUND.equals(e.getErrorCode())) {
if (ERROR_CODE_DEVICE_NOT_FOUND_FOR_USER_ID.getCode().equals(e.getErrorCode())) {
if (LOG.isDebugEnabled()) {
} catch (PushDeviceHandlerClientException e) {
if (ERROR_CODE_DEVICE_NOT_FOUND_FOR_USER_ID.getCode().equals(e.getErrorCode())) {
LOG.info("No push authentication devices found for user ID: " + userId);

* @return true if the user exists, false otherwise.
* @throws CredentialMgtServerException if an error occurs while validating the user ID.
*/
public static boolean validateUserId(String userId) throws CredentialMgtServerException {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 2

Suggested change
public static boolean validateUserId(String userId) throws CredentialMgtServerException {
public static boolean validateUserId(String userId) throws CredentialMgtServerException {
if (LOG.isDebugEnabled()) {
LOG.debug("Validating user ID: " + userId);
}

Comment on lines +118 to +120
return false;
}
return ((UniqueIDUserStoreManager) userStoreManager).isExistingUserWithID(userId);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 3

Suggested change
return false;
}
return ((UniqueIDUserStoreManager) userStoreManager).isExistingUserWithID(userId);
return false;
}
boolean userExists = ((UniqueIDUserStoreManager) userStoreManager).isExistingUserWithID(userId);
if (LOG.isDebugEnabled()) {
LOG.debug("User validation result for user ID " + userId + ": " + userExists);
}
return userExists;

Comment on lines +73 to +74
*/
public CredentialCreationResponseDTO createUserCredential(String userId, String type) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 4

Suggested change
*/
public CredentialCreationResponseDTO createUserCredential(String userId, String type) {
validateUserId(userId);
LOG.info("Creating credential for user: " + userId + ", type: " + type);
try {

Comment on lines +171 to +173
break;
default:
LOG.warn("No response mapping for credential type: " + entry.getKey() + ". Skipping.");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 5

Suggested change
break;
default:
LOG.warn("No response mapping for credential type: " + entry.getKey() + ". Skipping.");
throw CredentialMgtEndpointUtils.handleCredentialMgtException(e);
} catch (Exception e) {
LOG.error("Unexpected error while retrieving credentials for user: " + userId + ", type: " + entry.getKey() + ". Error: " + e.getMessage());
throw CredentialMgtEndpointUtils.handleCredentialMgtException(new CredentialMgtServerException("Unexpected error occurred", e));
}

import org.wso2.carbon.identity.api.user.credential.common.exception.CredentialMgtClientException;
import org.wso2.carbon.identity.api.user.credential.common.exception.CredentialMgtException;
import org.wso2.carbon.identity.api.user.credential.common.exception.CredentialMgtServerException;
import org.wso2.carbon.identity.rest.api.user.credential.v2.UsersApiService;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 6

Suggested change
import org.wso2.carbon.identity.rest.api.user.credential.v2.UsersApiService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.identity.rest.api.user.credential.v2.UsersApiService;

Comment on lines 30 to 32
*/
public class UsersCredentialApiServiceImpl implements UsersApiService {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 7

Suggested change
*/
public class UsersCredentialApiServiceImpl implements UsersApiService {
*/
public class UsersCredentialApiServiceImpl implements UsersApiService {
private static final Log LOG = LogFactory.getLog(UsersCredentialApiServiceImpl.class);
private final CredentialManagementService credentialManagementService;

@wso2-engineering wso2-engineering Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Agent Log Improvement Checklist

⚠️ Warning: AI-Generated Review Comments

  • The log-related comments and suggestions in this review were generated by an AI tool to assist with identifying potential improvements. Purpose of reviewing the code for log improvements is to improve the troubleshooting capabilities of our products.
  • Please make sure to manually review and validate all suggestions before applying any changes. Not every code suggestion would make sense or add value to our purpose. Therefore, you have the freedom to decide which of the suggestions are helpful.

✅ Before merging this pull request:

  • Review all AI-generated comments for accuracy and relevance.
  • Complete and verify the table below. We need your feedback to measure the accuracy of these suggestions and the value they add. If you are rejecting a certain code suggestion, please mention the reason briefly in the suggestion for us to capture it.
Comment Accepted (Y/N) Reason
#### Log Improvement Suggestion No: 1
#### Log Improvement Suggestion No: 2
#### Log Improvement Suggestion No: 3
#### Log Improvement Suggestion No: 4
#### Log Improvement Suggestion No: 5
#### Log Improvement Suggestion No: 6
#### Log Improvement Suggestion No: 7

@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0e5b9016-db9f-4790-9586-c78bab7e07f8

📥 Commits

Reviewing files that changed from the base of the PR and between 81d27e5 and 1d3044a.

⛔ Files ignored due to path filters (2)
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/gen/java/org/wso2/carbon/identity/rest/api/user/credential/v2/dto/ErrorDTO.java is excluded by !**/gen/**
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/gen/java/org/wso2/carbon/identity/rest/api/user/credential/v2/factories/UsersApiServiceFactory.java is excluded by !**/gen/**
📒 Files selected for processing (6)
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.common/src/main/java/org/wso2/carbon/identity/api/user/credential/common/CredentialManagementConstants.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.common/src/main/java/org/wso2/carbon/identity/api/user/credential/common/core/PushCredentialHandler.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.common/src/main/java/org/wso2/carbon/identity/api/user/credential/common/utils/CredentialManagementUtils.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/main/java/org/wso2/carbon/identity/rest/api/user/credential/v2/core/CredentialManagementService.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/main/java/org/wso2/carbon/identity/rest/api/user/credential/v2/impl/UsersCredentialApiServiceImpl.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/main/java/org/wso2/carbon/identity/rest/api/user/credential/v2/utils/CredentialMgtEndpointUtils.java
💤 Files with no reviewable changes (1)
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/main/java/org/wso2/carbon/identity/rest/api/user/credential/v2/utils/CredentialMgtEndpointUtils.java
🚧 Files skipped from review as they are similar to previous changes (4)
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.common/src/main/java/org/wso2/carbon/identity/api/user/credential/common/CredentialManagementConstants.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.common/src/main/java/org/wso2/carbon/identity/api/user/credential/common/core/PushCredentialHandler.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.common/src/main/java/org/wso2/carbon/identity/api/user/credential/common/utils/CredentialManagementUtils.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/main/java/org/wso2/carbon/identity/rest/api/user/credential/v2/core/CredentialManagementService.java

📝 Walkthrough

Overview

This PR introduces a new CredentialManagementService core service for the user credential API v2. The service implements a centralized orchestration pattern for user credential operations, following the design of SessionManagementService. The UsersCredentialApiServiceImpl REST layer is refactored into a thin delegation layer that constructs HTTP responses, while all business logic is moved to the new service.

Key Changes

New Core Service:

  • Added CredentialManagementService to handle credential creation, deletion, and retrieval operations
  • Manages user ID validation, credential handler resolution, and transformation of handler results to API response DTOs
  • Supports credential operations across multiple credential types (PASSKEY, PUSH_AUTH, BACKUP_CODE)

Improved Error Handling:

  • Enhanced CredentialManagementUtils.validateUserId() with proper UserStoreException handling
  • Added ERROR_CODE_VALIDATE_USER_ID_FAILURE error message constant for user validation failures
  • Validates that user store managers support unique ID operations before attempting ID-based lookups

Refactored REST Layer:

  • UsersCredentialApiServiceImpl now delegates credential operations directly to CredentialManagementService
  • Removed handler resolution, exception translation, and DTO-building logic from the REST layer
  • Reduced REST controller to response object construction

Simplified Utilities:

  • Removed credential ID validation and credential-by-type DTO construction methods from CredentialMgtEndpointUtils
  • Updated PushCredentialHandler to use centrally-managed error message constants instead of local definitions

Test Coverage

The PR includes test plan items covering:

  • Credential grouping by type for valid users
  • 404 responses for unknown user IDs and 500 responses when user store is unavailable
  • Credential creation (201 for supported types, 400 for unsupported)
  • Credential deletion by type and ID (204 No Content responses)
  • Validation of blank credential IDs (400 Bad Request)

Walkthrough

This pull request refactors the credential management API by introducing a new CredentialManagementService core layer that centralizes credential operation orchestration. The changes standardize user ID validation, consolidate error handling, and simplify the API endpoint implementation through delegation. Five files are modified: error constants are added and standardized in handlers, user validation logic is centralized in utilities, a new service class coordinates all credential operations, the API implementation is simplified to delegate to the service, and endpoint utilities are cleaned up to remove now-redundant methods.

Sequence Diagram

sequenceDiagram
  participant APIEndpoint as UsersCredentialApiServiceImpl
  participant Service as CredentialManagementService
  participant Handler as CredentialHandler
  participant UserStore as UserStoreManager
  participant DTO as DTO Layer
  
  APIEndpoint->>Service: createUserCredential(userId, type)
  Service->>Service: validateUserId(userId)
  Service->>UserStore: isExistingUserWithID(userId)
  UserStore-->>Service: boolean
  Service->>Service: resolveCredentialHandler(type)
  Service->>Handler: createCredential(userId)
  Handler-->>Service: CredentialDTO
  Service->>DTO: toEntryDTOs(credentials)
  DTO-->>Service: List<CredentialEntryDTO>
  Service-->>APIEndpoint: CredentialCreationResponseDTO
  APIEndpoint-->>Client: 201 Created
Loading

Suggested reviewers

  • ZiyamSanthosh
  • jenkins-is-staging
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description provides a clear summary of changes but does not follow the required repository template structure with sections like Purpose, Goals, Approach, User stories, Developer Checklist, Release notes, Documentation, etc. Complete the description by adding missing template sections: Purpose (with issue links), Goals, Approach, User stories, Developer Checklist, Release note, Documentation, Training, Certification, Marketing, Automation tests (unit/integration), Security checks, Samples, Related PRs, Migrations, Test environment, and Learning.
Docstring Coverage ⚠️ Warning Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: introduction of CredentialManagementService to the user credential API v2, which is the primary objective of this pull request.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.common/src/main/java/org/wso2/carbon/identity/api/user/credential/common/utils/CredentialManagementUtils.java`:
- Around line 113-119: Replace the current false return in the UniqueID support
check in CredentialManagementUtils (the branch that tests "if
(!(userStoreManager instanceof UniqueIDUserStoreManager))") with throwing a
server-side exception instead of returning false; specifically, throw an
appropriate runtime/server exception (e.g., IdentityServerException or
CarbonException used in this project) with a clear message that unique-ID
validation is unsupported for the current user store, include the userId and log
the condition (use LOG.debug/info/error as appropriate) so downstream code does
not interpret the result as USER_NOT_FOUND.

In
`@components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/main/java/org/wso2/carbon/identity/rest/api/user/credential/v2/core/CredentialManagementService.java`:
- Around line 84-85: The response currently echoes the raw input `type` (the
.type(type) call in CredentialManagementService) which can preserve
case/whitespace variants; instead normalize to the canonical API enum value
before setting the response. Locate the .type(type) assignment in
CredentialManagementService and replace the raw value with a normalized form
derived from the API enum (e.g., trim the input, map/parse it to the canonical
enum constant using the credential enum/parsing helper, then use the enum's
canonical string/value) so the response always returns the enum's canonical API
value.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b8d1e861-ea38-43a3-9529-6addb79cc901

📥 Commits

Reviewing files that changed from the base of the PR and between 04e2b0c and 81d27e5.

⛔ Files ignored due to path filters (2)
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/gen/java/org/wso2/carbon/identity/rest/api/user/credential/v2/dto/ErrorDTO.java is excluded by !**/gen/**
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/gen/java/org/wso2/carbon/identity/rest/api/user/credential/v2/factories/UsersApiServiceFactory.java is excluded by !**/gen/**
📒 Files selected for processing (6)
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.common/src/main/java/org/wso2/carbon/identity/api/user/credential/common/CredentialManagementConstants.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.common/src/main/java/org/wso2/carbon/identity/api/user/credential/common/core/PushCredentialHandler.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.common/src/main/java/org/wso2/carbon/identity/api/user/credential/common/utils/CredentialManagementUtils.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/main/java/org/wso2/carbon/identity/rest/api/user/credential/v2/core/CredentialManagementService.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/main/java/org/wso2/carbon/identity/rest/api/user/credential/v2/impl/UsersCredentialApiServiceImpl.java
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/main/java/org/wso2/carbon/identity/rest/api/user/credential/v2/utils/CredentialMgtEndpointUtils.java
💤 Files with no reviewable changes (1)
  • components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/main/java/org/wso2/carbon/identity/rest/api/user/credential/v2/utils/CredentialMgtEndpointUtils.java

Comment on lines +113 to +119
if (!(userStoreManager instanceof UniqueIDUserStoreManager)) {
if (LOG.isDebugEnabled()) {
LOG.debug("User store manager does not support unique user IDs. " +
"Cannot validate user ID: " + userId);
}
return false;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Return a server error when unique-ID validation is unsupported.

At Line 113-119, returning false causes downstream code to treat this as USER_NOT_FOUND, which can misreport valid users when the store cannot validate unique IDs. Throw a server exception on this branch instead.

Suggested fix
             if (!(userStoreManager instanceof UniqueIDUserStoreManager)) {
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("User store manager does not support unique user IDs. " +
                             "Cannot validate user ID: " + userId);
                 }
-                return false;
+                throw handleServerException(ErrorMessages.ERROR_CODE_VALIDATE_USER_ID_FAILURE,
+                        new IllegalStateException("Unique ID user store is not supported for tenant: " +
+                                tenantDomain), userId);
             }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (!(userStoreManager instanceof UniqueIDUserStoreManager)) {
if (LOG.isDebugEnabled()) {
LOG.debug("User store manager does not support unique user IDs. " +
"Cannot validate user ID: " + userId);
}
return false;
}
if (!(userStoreManager instanceof UniqueIDUserStoreManager)) {
if (LOG.isDebugEnabled()) {
LOG.debug("User store manager does not support unique user IDs. " +
"Cannot validate user ID: " + userId);
}
throw handleServerException(ErrorMessages.ERROR_CODE_VALIDATE_USER_ID_FAILURE,
new IllegalStateException("Unique ID user store is not supported for tenant: " +
tenantDomain), userId);
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.common/src/main/java/org/wso2/carbon/identity/api/user/credential/common/utils/CredentialManagementUtils.java`
around lines 113 - 119, Replace the current false return in the UniqueID support
check in CredentialManagementUtils (the branch that tests "if
(!(userStoreManager instanceof UniqueIDUserStoreManager))") with throwing a
server-side exception instead of returning false; specifically, throw an
appropriate runtime/server exception (e.g., IdentityServerException or
CarbonException used in this project) with a clear message that unique-ID
validation is unsupported for the current user store, include the userId and log
the condition (use LOG.debug/info/error as appropriate) so downstream code does
not interpret the result as USER_NOT_FOUND.

Comment on lines +84 to +85
.type(type)
.credentials(dto.getCredentials());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Normalize the response type to canonical API value.

At Line 84, the response echoes raw input type. If input includes case/whitespace variants, output becomes inconsistent despite successful normalized resolution. Return the canonical enum API value instead.

Suggested fix
             return new CredentialCreationResponseDTO()
-                    .type(type)
+                    .type(CredentialTypes.fromString(type).apiValue())
                     .credentials(dto.getCredentials());
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@components/org.wso2.carbon.identity.api.user.credential/org.wso2.carbon.identity.api.user.credential.v2/src/main/java/org/wso2/carbon/identity/rest/api/user/credential/v2/core/CredentialManagementService.java`
around lines 84 - 85, The response currently echoes the raw input `type` (the
.type(type) call in CredentialManagementService) which can preserve
case/whitespace variants; instead normalize to the canonical API enum value
before setting the response. Locate the .type(type) assignment in
CredentialManagementService and replace the raw value with a normalized form
derived from the API enum (e.g., trim the input, map/parse it to the canonical
enum constant using the credential enum/parsing helper, then use the enum's
canonical string/value) so the response always returns the enum's canonical API
value.

@pamodaaw pamodaaw force-pushed the feature/user-credential-api-v2 branch from 81d27e5 to 1d3044a Compare June 11, 2026 10:00
@pamodaaw pamodaaw merged commit 3c699cc into wso2:master Jun 11, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants