diff --git a/.github/workflows/swagger-json.yml b/.github/workflows/swagger-json.yml new file mode 100644 index 0000000..d140252 --- /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: | + nohup java -jar target/fhir-api-*.war \ + --spring.profiles.active=swagger \ + --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 > fhir-api.json || { + echo "Swagger JSON invalid" + cat swagger_raw.json + exit 1 + } + + if [ "$(jq '.paths | length' fhir-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 fhir-api.json amrit-docs/docs/swagger/fhir-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 FHIR-API swagger" + title: "chore(docs): auto-update FHIR-API swagger" + delete-branch: true + body: | + This PR automatically updates FHIR-API Swagger JSON + from the latest main branch build. diff --git a/README.md b/README.md index a6836c0..a52fdd3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # AMRIT - FHIR 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/FHIR-API/actions/workflows/sast.yml/badge.svg) +[![DeepWiki](https://img.shields.io/badge/DeepWiki-PSMRI%2FFHIR--API-blue)](https://deepwiki.com/PSMRI/FHIR-API) + FHIR (Fast Healthcare Interoperability Resources) standard defines how healthcare information can be exchanged between different computer systems regardless of how it is stored in those systems. FHIR provides a means for representing and sharing information among clinicians and organizations in a standard way regardless of the ways local EHRs represent or store the data. FHIR combines the best features of previous standards into a common specification, while being flexible enough to meet needs of a wide variety of use cases within the healthcare ecosystem. Resources are the basis for all exchangeable FHIR content. Each resource includes a standard definition and human-readable descriptions about how to use the resource. Each resource also has a set of common and resource-specific metadata (attributes) to allow its use clearly and unambiguously. FHIR Resources can store and/or exchange many types of clinical and administrative data. diff --git a/pom.xml b/pom.xml index f9aea27..0479b05 100644 --- a/pom.xml +++ b/pom.xml @@ -268,6 +268,11 @@ 0.12.6 runtime + + com.h2database + h2 + runtime + diff --git a/src/main/resources/application-swagger.properties b/src/main/resources/application-swagger.properties new file mode 100644 index 0000000..ce50e62 --- /dev/null +++ b/src/main/resources/application-swagger.properties @@ -0,0 +1,133 @@ +ndhmCreateHealthID=placeholder +# --- Swagger Profile Dummy Properties --- +# Database +spring.datasource.url=jdbc:h2:mem:swaggerdb +spring.datasource.username=SA +spring.datasource.password= +spring.datasource.driver-class-name=org.h2.Driver +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.hibernate.ddl-auto=none +spring.jpa.show-sql=false +spring.jpa.properties.hibernate.format_sql=false + +# Redis +spring.redis.host=localhost +spring.redis.port=6379 +spring.redis.password= + +# MongoDB (dummy connection string for CI/CD) +spring.data.mongodb.uri=mongodb://dummyuser:dummypassword@localhost:27017/test?authSource=admin + +# Quartz Scheduler +spring.quartz.job-store-type=memory + +# Dummy external API endpoints and keys +feedAuthUserName=placeholder +feedAuthPassword=placeholder +parentUrl=placeholder +atomFeedURLPatientDemographic=placeholder +abdmFacilityId=placeholder +generateOTPForCareContext=placeholder +validateOTPForCareContext=placeholder +addCareContext=placeholder +getAbdmFacilityServicies=placeholder +x-CM-ID=placeholder +abdmV3UserAuthenticate=placeholder +generateOTP_ForCard=placeholder +verifyOTP_ForCard=placeholder +verifyOTP_ForCard_Aadhaar=placeholder +generateHealthCard=placeholder +generateHealthIDCard=placeholder +ndhmGenerateOTPWithAadhaar=placeholder +abdmGenerateMobileOTP=placeholder +abdmConfirmAadhaarBio=placeholder +ndhmGenerateOTP=placeholder +ndhmVerifyOTP=placeholder +abdmcreateHealthIdWithPreVerified=placeholder +abdmVerifyOTP=placeholder +abdmCheckAndGenerateMobileOTP=placeholder +abdmVerifyMobileOTP=placeholder +abdmVerifyBio=placeholder + +# Other likely required placeholders (add more as needed) +server.port=8080 +logging.level.root=INFO +logging.level.org.springframework=INFO +management.endpoints.web.exposure.include=health,info +management.server.address=127.0.0.1 +management.server.port=8081 + +abdmVerifyBio=placeholder +abdmVerifyMobileOTP=placeholder +abdmCheckAndGenerateMobileOTP=placeholder +abdmVerifyOTP=placeholder +abdmcreateHealthIdWithPreVerified=placeholder +ndhmGenerateOTPWithAadhaar=placeholder +generateHealthIDCard=placeholder +generateHealthCard=placeholder +verifyOTP_ForCard_Aadhaar=placeholder +verifyOTP_ForCard=placeholder +generateOTP_ForCard=placeholder +abdmV3UserAuthenticate=placeholder +x-CM-ID=placeholder +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.allowed-origins=http://localhost:8080 +logging.level.root=INFO +jwt.secret=sample-jwt-secret +eaushadhiStoreStockDetailsUrl=http://test-eaushadhi-details-url +eaushadhiStoreStockAckUrl=http://test-eaushadhi-ack-url +eAushadhiDummy=sample-eaushadhi +benSearchByBenIDURL=http://test-ben-search-url +userAuthURL=http://test-user-auth-url +fhirUserName=sample-fhir-username +fhirPassword=sample-fhir-password +abhaMode=sample-abha-mode +clientID=sample-client-id +clientSecret=sample-client-secret +ndhmuserAuthenticate=sample-ndhm-auth +generateABDM_NotifySMS=sample-abdm-notify-sms +atomsFeedStartPage=1 +feedAuthUserName=sample-feed-auth-username +feedAuthPassword=sample-feed-auth-password +parentUrl=http://test-parent-url-for-swagger +atomFeedURLPatientDemographic=http://test-patient-demographic-url-for-swagger +abdmFacilityId=sample-facility-id-for-swagger +generateOTPForCareContext=sample-generate-otp-for-care-context +validateOTPForCareContext=sample-validate-otp-for-care-context +addCareContext=sample-add-care-context +getAbdmFacilityServicies=sample-get-abdm-facility-services +atomFeedURLPatientEncounter=http://test-atom-feed-patient-encounter +atomFeedURLPatientClinical=http://test-atom-feed-patient-clinical +webLoginAbhaRequestOtp=sample-web-login-abha-request-otp +webLoginAbhaVerify=sample-web-login-abha-verify +verifyAbhaLogin=sample-verify-abha-login +abhaLoginRequestOtp=sample-abha-login-request-otp +abhaProfileLoginVerifyUser=sample-abha-profile-login-verify-user +webLoginPhrCard=sample-web-login-phr-card +requestOtpForEnrollment=sample-request-otp-for-enrollment +requestAuthByAbdm=sample-request-auth-by-abdm +abhaEnrollByAadhaar=sample-abha-enroll-by-aadhaar +printAbhaCard=sample-print-abha-card +getAuthCertPublicKey=sample-auth-cert-public-key +eAushadhiDispensePageSize=10 +patient-search-page-size=10 +nhm.agent.real.time.data.url=sample-nhm-agent-url +everwellCalendarDuration=10 +callRetryConfiguration=3 +sms-username=sample-sms-username +sms-password=sample-sms-password +sms-entityid=sample-sms-entityid +sms-consent-source-address=sample-sms-consent-source-address +send-message-url=sample-send-message-url +calibrationPageSize=10 +iemr.session.expiry.time.sec=3600 \ No newline at end of file