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 -[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) ![branch parameter](https://github.com/PSMRI/HWC-API/actions/workflows/sast-and-package.yml/badge.svg) +[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) [![DeepWiki](https://img.shields.io/badge/DeepWiki-PSMRI%2FBeneficiaryID--Generation--API-blue)](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