diff --git a/.github/workflows/swagger-json.yml b/.github/workflows/swagger-json.yml
new file mode 100644
index 00000000..92b26bc5
--- /dev/null
+++ b/.github/workflows/swagger-json.yml
@@ -0,0 +1,109 @@
+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 (full history)
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - 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 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 > mmu-api.json || {
+ echo "Swagger JSON invalid"
+ cat swagger_raw.json
+ exit 1
+ }
+
+ if [ "$(jq '.paths | length' mmu-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 mmu-api.json amrit-docs/docs/swagger/mmu-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 MMU-API swagger"
+ title: "chore(docs): auto-update MMU-API swagger"
+ delete-branch: true
+ body: |
+ This PR automatically updates MMU-API Swagger JSON
+ from the latest main branch build.
diff --git a/README.md b/README.md
index 5b8cca9c..b9176dec 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# AMRIT - Mobile Medical Unit (MMU) Service
-[](https://www.gnu.org/licenses/gpl-3.0) 
+[](https://www.gnu.org/licenses/gpl-3.0) [](https://deepwiki.com/PSMRI/MMU-API)
The AMRIT Mobile Medical Unit (MMU) service provides essential medical assistance to individuals without requiring them to be admitted to a hospital. This service operates through a mobile unit equipped with a laboratory for conducting medical tests and the capability to dispense medicines. The MMU employs an internet-connected device to collect and transmit medical data to the AMRIT application. It supports various medical standards and incorporates a feature that allows data capture and synchronization even when an internet connection is unavailable.
diff --git a/pom.xml b/pom.xml
index a15dfc50..6dfc6675 100644
--- a/pom.xml
+++ b/pom.xml
@@ -290,6 +290,11 @@
0.12.6
runtime
+
+ com.h2database
+ h2
+ runtime
+
${artifactId}-${version}
diff --git a/src/main/java/com/iemr/mmu/utils/mapper/SecurityConfig.java b/src/main/java/com/iemr/mmu/utils/mapper/SecurityConfig.java
index 3fe096d2..fa328938 100644
--- a/src/main/java/com/iemr/mmu/utils/mapper/SecurityConfig.java
+++ b/src/main/java/com/iemr/mmu/utils/mapper/SecurityConfig.java
@@ -12,11 +12,12 @@
import com.iemr.mmu.utils.exception.CustomAuthenticationEntryPoint;
import com.iemr.mmu.utils.exception.CustomAccessDeniedHandler;
-
+import org.springframework.context.annotation.Profile;
@Configuration
@EnableMethodSecurity
@EnableWebSecurity
+@Profile("!swagger")
public class SecurityConfig {
private final RoleAuthenticationFilter roleAuthenticationFilter;
private final CustomAuthenticationEntryPoint customAuthenticationEntryPoint;
diff --git a/src/main/java/com/iemr/mmu/utils/mapper/SwaggerSecurityConfig.java b/src/main/java/com/iemr/mmu/utils/mapper/SwaggerSecurityConfig.java
new file mode 100644
index 00000000..66940cfc
--- /dev/null
+++ b/src/main/java/com/iemr/mmu/utils/mapper/SwaggerSecurityConfig.java
@@ -0,0 +1,29 @@
+package com.iemr.mmu.utils.mapper;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.core.annotation.Order;
+
+@Configuration
+@EnableWebSecurity
+@Profile("swagger")
+public class SwaggerSecurityConfig {
+
+ @Bean
+ @Order(1)
+ public SecurityFilterChain swaggerSecurityFilterChain(HttpSecurity http) throws Exception {
+ System.out.println(">>> SwaggerSecurityConfig is ACTIVE <<<");
+ // CSRF is disabled here because these endpoints are only used for API documentation/testing.
+ // No authentication or state-changing operations are exposed, so disabling CSRF is safe.
+ http
+ .authorizeHttpRequests(auth -> auth
+ .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-ui.html").permitAll()
+ .anyRequest().authenticated()
+ );
+ return http.build();
+ }
+}
diff --git a/src/main/resources/application-swagger.properties b/src/main/resources/application-swagger.properties
new file mode 100644
index 00000000..3af439e0
--- /dev/null
+++ b/src/main/resources/application-swagger.properties
@@ -0,0 +1,57 @@
+spring.jpa.hibernate.ddl-auto=create
+dataSyncDownloadUrl=http://localhost:8080/data/sync/download
+benGenUrlCentral=http://localhost:8080/ben/gen/central
+benImportUrlLocal=http://localhost:8080/ben/import/local
+dataSyncTransactionDownloadUrl=http://localhost:8080/data/sync/transaction/download
+dataSyncProcessedFlagUpdate=http://localhost:8080/data/sync/processed/flag/update
+registrationUrl=http://localhost:8080/registration
+registrarQuickSearchByPhoneNoUrl=http://localhost:8080/registrar/quicksearch/phone
+beneficiaryEditUrl=http://localhost:8080/beneficiary/edit
+registrarAdvanceSearchUrl=http://localhost:8080/registrar/advance/search
+serverIP=127.0.0.1
+serverDomain=localhost
+serverUserName=${SERVER_USERNAME:admin}
+serverPassword=${SERVER_PASSWORD:admin}
+getServerCredentialURL=http://localhost:8080/server/credential
+localFolderToSync=/tmp/local
+serverFolder=/tmp/server
+TMReferredWL=1
+BATCH_SIZE=100
+dataSyncUploadUrl=http://localhost:8080/data/sync/upload
+getBenImageFromIdentity=http://localhost:8080/identity/ben/image
+specialistSign=1
+tmCentralServer=http://localhost:8080/tm/centralserver
+mmucentralserver=http://localhost:8080/mmu/centralserver
+fileBasePath=/tmp
+carestreamOrderCreateURL=http://localhost:8080/carestream/order/create
+registrarQuickSearchByIdUrl=http://localhost:8080/registrar/quicksearch/byid
+oncoWL=1
+radioWL=1
+labWL=1
+pharmaWL=1
+snomedCTPageSize=100
+tmReferCheckValue=1
+tcSpecialistSlotCancel=http://localhost:8080/tc/specialist/slot/cancel
+
+tcSpecialistSlotBook=http://localhost:8080/tc/specialist/slot/book
+docWL=1
+spring.datasource.url=jdbc:h2:mem:swaggerdb
+spring.datasource.driver-class-name=org.h2.Driver
+spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
+
+# Disable Redis if not needed for docs (optional)
+spring.redis.host=${REDIS_HOST:localhost}
+spring.redis.port=${REDIS_PORT:6379}
+
+# Add or update Hibernate DDL auto for H2 in-memory DB
+spring.jpa.hibernate.ddl-auto=create-drop
+spring.jpa.show-sql=true
+
+# CORS for Swagger UI
+cors.allowed-origins=${CORS_ALLOWED_ORIGINS:http://localhost:9090,http://localhost:8080}
+# Logging
+logging.level.root=INFO
+
+# Use environment variable for JWT secret
+jwt.secret=${JWT_SECRET_KEY:#{T(java.util.UUID).randomUUID().toString()}}
+nurseWL=1
\ No newline at end of file