diff --git a/.github/workflows/swagger-json.yml b/.github/workflows/swagger-json.yml
new file mode 100644
index 0000000..560b4bd
--- /dev/null
+++ b/.github/workflows/swagger-json.yml
@@ -0,0 +1,107 @@
+name: Sync Swagger to AMRIT-Docs
+
+on:
+ push:
+ branches: [ main ]
+ workflow_dispatch:
+
+jobs:
+ swagger-sync:
+ runs-on: ubuntu-latest
+ timeout-minutes: 20
+
+ steps:
+ - name: Checkout API repo
+ uses: actions/checkout@v4
+
+ - name: Set up Java 17
+ uses: actions/setup-java@v4
+ with:
+ distribution: temurin
+ java-version: 17
+ cache: maven
+
+ - name: Build API (skip tests)
+ run: mvn -B clean package -DskipTests
+
+ - name: Install jq
+ run: sudo apt-get update && sudo apt-get install -y jq
+
+ - name: Run API in swagger profile
+ run: |
+ mvn spring-boot:run \
+ -Dspring-boot.run.profiles=swagger \
+ -Dspring-boot.run.arguments=--server.port=9090 \
+ > app.log 2>&1 &
+ echo $! > api_pid.txt
+
+ - name: Wait for API & fetch Swagger
+ run: |
+ for i in {1..40}; do
+ CODE=$(curl --connect-timeout 2 --max-time 5 -s -o swagger_raw.json -w "%{http_code}" http://localhost:9090/v3/api-docs || true)
+
+ if [ "$CODE" = "200" ]; then
+ jq . swagger_raw.json > beneficiaryid-generation-api.json || {
+ echo "Swagger JSON invalid"
+ cat swagger_raw.json
+ exit 1
+ }
+
+ if [ "$(jq '.paths | length' beneficiaryid-generation-api.json)" -eq 0 ]; then
+ echo "Swagger paths empty – failing"
+ exit 1
+ fi
+
+ echo "Swagger generated successfully"
+ exit 0
+ fi
+
+ echo "Waiting for API... ($i)"
+ sleep 4
+ done
+
+ echo "Swagger not generated"
+ cat app.log || true
+ exit 1
+
+ - name: Stop API
+ if: always()
+ run: |
+ # Graceful shutdown of the process group
+ sleep 5
+ # Force kill the process group if still running
+ if [ -f api_pid.txt ]; then
+ PID=$(cat api_pid.txt)
+ kill -TERM -- -"$PID" 2>/dev/null || true
+ sleep 2
+ kill -9 -- -"$PID" 2>/dev/null || true
+ fi
+ # Fallback: kill any remaining java process on port 9090
+ fuser -k 9090/tcp 2>/dev/null || true
+
+ - name: Checkout AMRIT-Docs
+ uses: actions/checkout@v4
+ with:
+ repository: PSMRI/AMRIT-Docs
+ token: ${{ secrets.DOCS_REPO_TOKEN }}
+ path: amrit-docs
+ fetch-depth: 0
+
+ - name: Copy Swagger JSON
+ run: |
+ mkdir -p amrit-docs/docs/swagger
+ cp beneficiaryid-generation-api.json amrit-docs/docs/swagger/beneficiaryid-generation-api.json
+
+ - name: Create Pull Request
+ uses: peter-evans/create-pull-request@v8
+ with:
+ token: ${{ secrets.DOCS_REPO_TOKEN }}
+ path: amrit-docs
+ branch: auto/swagger-update-${{ github.run_id }}-${{ github.run_attempt }}
+ base: main
+ commit-message: "chore(docs): auto-update BeneficiaryID-Generation-API swagger"
+ title: "chore(docs): auto-update BeneficiaryID-Generation-API swagger"
+ delete-branch: true
+ body: |
+ This PR automatically updates BeneficiaryID-Generation-API Swagger JSON
+ from the latest main branch build.
diff --git a/README.md b/README.md
index 286bdb1..3a995dc 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,6 @@
# AMRIT - BeneficiaryID-Generation-API Service
-[](https://www.gnu.org/licenses/gpl-3.0) 
+[](https://www.gnu.org/licenses/gpl-3.0) [](https://deepwiki.com/PSMRI/BeneficiaryID-Generation-API)
+
This service is used to generate unique beneficiary registration Id for new beneficiaries.
diff --git a/pom.xml b/pom.xml
index 9ebc49c..b7e7ed3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -385,7 +385,16 @@
0.12.6
runtime
-
+
+ com.h2database
+ h2
+ runtime
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ 2.3.0
+
diff --git a/src/main/java/com/iemr/common/bengen/utils/FilterConfig.java b/src/main/java/com/iemr/common/bengen/utils/FilterConfig.java
index 45cf745..10cdb4f 100644
--- a/src/main/java/com/iemr/common/bengen/utils/FilterConfig.java
+++ b/src/main/java/com/iemr/common/bengen/utils/FilterConfig.java
@@ -5,8 +5,10 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Profile;
@Configuration
+@Profile("!swagger")
public class FilterConfig {
@Value("${cors.allowed-origins}")
diff --git a/src/main/java/com/iemr/common/bengen/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/common/bengen/utils/JwtUserIdValidationFilter.java
index b6b57c0..ababf80 100644
--- a/src/main/java/com/iemr/common/bengen/utils/JwtUserIdValidationFilter.java
+++ b/src/main/java/com/iemr/common/bengen/utils/JwtUserIdValidationFilter.java
@@ -1,5 +1,8 @@
package com.iemr.common.bengen.utils;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
import java.io.IOException;
import java.util.Arrays;
@@ -18,6 +21,8 @@
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
+@Profile("!swagger")
+@Component
public class JwtUserIdValidationFilter implements Filter {
private final JwtAuthenticationUtil jwtAuthenticationUtil;
diff --git a/src/main/resources/application-swagger.properties b/src/main/resources/application-swagger.properties
new file mode 100644
index 0000000..6487467
--- /dev/null
+++ b/src/main/resources/application-swagger.properties
@@ -0,0 +1,23 @@
+
+spring.datasource.url=jdbc:h2:mem:swaggerdb
+spring.datasource.driver-class-name=org.h2.Driver
+spring.datasource.username=sa
+spring.datasource.password=
+spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
+spring.jpa.hibernate.ddl-auto=none
+
+# Disable Redis if not needed for docs (optional)
+spring.redis.host=localhost
+spring.redis.port=6379
+
+# CORS for Swagger UI
+cors.allowed-origins=${CORS_ALLOWED_ORIGINS:http://localhost:9090,http://localhost:8080}
+
+# Logging
+logging.level.root=INFO
+
+# Disable security auto-configuration (already excluded in main class)
+# If you have custom security beans, add @Profile("!swagger") to them
+
+jwt.secret= JWT_SECRET
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
\ No newline at end of file