From 8df17379227049712d6c44e2bb5e772b124de477 Mon Sep 17 00:00:00 2001 From: DurgaPrasad-54 Date: Wed, 4 Feb 2026 12:45:34 +0530 Subject: [PATCH 01/11] chore(swagger): automate swagger sync to amrit-docs --- .github/workflows/swagger-json.yml | 88 +++++++++++++++++++ pom.xml | 5 ++ .../resources/application-swagger.properties | 18 ++++ src/main/resources/application.properties | 2 + 4 files changed, 113 insertions(+) create mode 100644 .github/workflows/swagger-json.yml create mode 100644 src/main/resources/application-swagger.properties diff --git a/.github/workflows/swagger-json.yml b/.github/workflows/swagger-json.yml new file mode 100644 index 0000000..b4e0596 --- /dev/null +++ b/.github/workflows/swagger-json.yml @@ -0,0 +1,88 @@ +name: Sync Swagger to AMRIT-Docs + +on: + push: + branches: [ main ] + workflow_dispatch: + +jobs: + swagger-sync: + runs-on: ubuntu-latest + + 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 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..30}; 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 + if jq . swagger_raw.json > helpline104-api.json; then + echo "Swagger generated successfully" + exit 0 + else + echo "Failed to parse swagger_raw.json with jq" + exit 1 + fi + fi + echo "Waiting for API... ($i)" + sleep 5 + done + + echo "Swagger not generated" + cat app.log || true + exit 1 + + - name: Stop API + if: always() + run: | + if [ -f api_pid.txt ]; then + kill $(cat api_pid.txt) || true + fi + + - name: Checkout AMRIT-Docs + uses: actions/checkout@v4 + with: + repository: PSMRI/AMRIT-Docs + token: ${{ secrets.DOCS_REPO_TOKEN }} + path: amrit-docs + + - name: Copy Swagger JSON + run: | + mkdir -p amrit-docs/docs/swagger + cp helpline104-api.json amrit-docs/docs/swagger/helpline104-api.json + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v6 + with: + token: ${{ secrets.DOCS_REPO_TOKEN }} + path: amrit-docs + branch: auto/swagger-update-${{ github.run_id }} + base: main + commit-message: Auto-update Helpline104-API swagger + title: Auto-update Helpline104-API swagger + body: | + This PR automatically updates the Helpline104-API Swagger JSON + from the latest main branch build. diff --git a/pom.xml b/pom.xml index ac49436..4349c78 100644 --- a/pom.xml +++ b/pom.xml @@ -249,6 +249,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..02108fa --- /dev/null +++ b/src/main/resources/application-swagger.properties @@ -0,0 +1,18 @@ +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 + +jwt.secret=JWT_SECRET diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 2bb31ad..7f4b55b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -33,6 +33,8 @@ spring.session.store-type=redis #spring.redis.host=localhost spring.redis.password= spring.redis.port=6379 +spring.datasource.username=SA +spring.datasource.password= ## Below values are needed for extending the expiry time and extend expiry time. iemr.extend.expiry.time=true iemr.session.expiry.time=7200 From dded87ddf3851585b89a75845ded5f388b3866db Mon Sep 17 00:00:00 2001 From: DurgaPrasad-54 Date: Wed, 4 Feb 2026 12:54:33 +0530 Subject: [PATCH 02/11] chore(swagger): automate swagger sync to amrit-docs --- .../java/com/iemr/helpline104/config/RedisConfig.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/iemr/helpline104/config/RedisConfig.java b/src/main/java/com/iemr/helpline104/config/RedisConfig.java index 755b966..ba97903 100644 --- a/src/main/java/com/iemr/helpline104/config/RedisConfig.java +++ b/src/main/java/com/iemr/helpline104/config/RedisConfig.java @@ -35,4 +35,14 @@ public RedisTemplate redisTemplate(RedisConnectionFactory factor return template; } + // Add a generic RedisTemplate bean for TokenDenylist and other usages + @Bean + public RedisTemplate genericRedisTemplate(RedisConnectionFactory factory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(factory); + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class)); + return template; + } + } From 72402a70c682fd1f0fbbf740e7c6e6595c1e21bd Mon Sep 17 00:00:00 2001 From: DurgaPrasad-54 Date: Wed, 4 Feb 2026 13:43:48 +0530 Subject: [PATCH 03/11] chore(swagger): automate swagger sync to amrit-docs --- .github/workflows/swagger-json.yml | 13 ++++++++++++- .../com/iemr/helpline104/config/RedisConfig.java | 16 ++++++++-------- .../resources/application-swagger.properties | 4 +++- src/main/resources/application.properties | 4 ++-- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/.github/workflows/swagger-json.yml b/.github/workflows/swagger-json.yml index b4e0596..4c60110 100644 --- a/.github/workflows/swagger-json.yml +++ b/.github/workflows/swagger-json.yml @@ -9,6 +9,17 @@ jobs: swagger-sync: runs-on: ubuntu-latest + services: + redis: + image: redis:7 + ports: + - 6379:6379 + options: >- + --health-cmd "redis-cli ping" + --health-interval 5s + --health-timeout 5s + --health-retries 10 + steps: - name: Checkout API repo uses: actions/checkout@v4 @@ -30,7 +41,7 @@ jobs: run: | mvn spring-boot:run \ -Dspring-boot.run.profiles=swagger \ - -Dspring-boot.run.arguments=--server.port=9090 \ + -Dspring-boot.run.arguments=--server.port=9090,--spring.redis.host=redis \ > app.log 2>&1 & echo $! > api_pid.txt diff --git a/src/main/java/com/iemr/helpline104/config/RedisConfig.java b/src/main/java/com/iemr/helpline104/config/RedisConfig.java index ba97903..b42e62e 100644 --- a/src/main/java/com/iemr/helpline104/config/RedisConfig.java +++ b/src/main/java/com/iemr/helpline104/config/RedisConfig.java @@ -36,13 +36,13 @@ public RedisTemplate redisTemplate(RedisConnectionFactory factor } // Add a generic RedisTemplate bean for TokenDenylist and other usages - @Bean - public RedisTemplate genericRedisTemplate(RedisConnectionFactory factory) { - RedisTemplate template = new RedisTemplate<>(); - template.setConnectionFactory(factory); - template.setKeySerializer(new StringRedisSerializer()); - template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class)); - return template; - } + @Bean(name = "genericRedisTemplate") + public RedisTemplate genericRedisTemplate(RedisConnectionFactory factory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(factory); + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(new org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer()); + return template; + } } diff --git a/src/main/resources/application-swagger.properties b/src/main/resources/application-swagger.properties index 02108fa..3b20444 100644 --- a/src/main/resources/application-swagger.properties +++ b/src/main/resources/application-swagger.properties @@ -12,7 +12,9 @@ spring.redis.port=6379 # CORS for Swagger UI cors.allowed-origins=${CORS_ALLOWED_ORIGINS:http://localhost:9090,http://localhost:8080} +jwt.secret=JWT_SECRET # Logging logging.level.root=INFO -jwt.secret=JWT_SECRET +# Use environment variable for JWT secret +jwt.secret=${JWT_SECRET_KEY:default-swagger-secret-change-me} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 7f4b55b..d2ab578 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -33,8 +33,8 @@ spring.session.store-type=redis #spring.redis.host=localhost spring.redis.password= spring.redis.port=6379 -spring.datasource.username=SA -spring.datasource.password= +spring.datasource.username=${DB_USERNAME:} +spring.datasource.password=${DB_PASSWORD:} ## Below values are needed for extending the expiry time and extend expiry time. iemr.extend.expiry.time=true iemr.session.expiry.time=7200 From 7080bc92bc6f773c5659215d4806211d4ebef53a Mon Sep 17 00:00:00 2001 From: DurgaPrasad-54 Date: Wed, 4 Feb 2026 13:50:48 +0530 Subject: [PATCH 04/11] chore(swagger): automate swagger sync to amrit-docs --- .github/workflows/swagger-json.yml | 2 +- .../java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java | 2 ++ src/main/java/com/iemr/helpline104/utils/TokenDenylist.java | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/swagger-json.yml b/.github/workflows/swagger-json.yml index 4c60110..00f33c4 100644 --- a/.github/workflows/swagger-json.yml +++ b/.github/workflows/swagger-json.yml @@ -41,7 +41,7 @@ jobs: run: | mvn spring-boot:run \ -Dspring-boot.run.profiles=swagger \ - -Dspring-boot.run.arguments=--server.port=9090,--spring.redis.host=redis \ + -Dspring-boot.run.arguments=--server.port=9090,--spring.redis.host=localhost \ > app.log 2>&1 & echo $! > api_pid.txt diff --git a/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java b/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java index cdba5a8..1bfefd2 100644 --- a/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java +++ b/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java @@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; @@ -26,6 +27,7 @@ public class JwtAuthenticationUtil { @Autowired private JwtUtil jwtUtil; @Autowired + @Qualifier("genericRedisTemplate") private RedisTemplate redisTemplate; @Autowired private IEMRUserRepositoryCustom iEMRUserRepositoryCustom; diff --git a/src/main/java/com/iemr/helpline104/utils/TokenDenylist.java b/src/main/java/com/iemr/helpline104/utils/TokenDenylist.java index fb53ef5..0d51571 100644 --- a/src/main/java/com/iemr/helpline104/utils/TokenDenylist.java +++ b/src/main/java/com/iemr/helpline104/utils/TokenDenylist.java @@ -4,6 +4,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @@ -15,6 +16,7 @@ public class TokenDenylist { private static final String PREFIX = "denied_"; @Autowired + @Qualifier("genericRedisTemplate") private RedisTemplate redisTemplate; private String getKey(String jti) { From e9999579055416c879a9250e43f7dec9c7464792 Mon Sep 17 00:00:00 2001 From: DurgaPrasad-54 Date: Wed, 4 Feb 2026 16:34:49 +0530 Subject: [PATCH 05/11] chore(swagger): automate swagger sync to amrit-docs --- .github/workflows/swagger-json.yml | 2 +- .../com/iemr/helpline104/utils/JwtAuthenticationUtil.java | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/swagger-json.yml b/.github/workflows/swagger-json.yml index 00f33c4..1322fa7 100644 --- a/.github/workflows/swagger-json.yml +++ b/.github/workflows/swagger-json.yml @@ -41,7 +41,7 @@ jobs: run: | mvn spring-boot:run \ -Dspring-boot.run.profiles=swagger \ - -Dspring-boot.run.arguments=--server.port=9090,--spring.redis.host=localhost \ + -Dspring-boot.run.arguments="--server.port=9090 --spring.redis.host=localhost" \ > app.log 2>&1 & echo $! > api_pid.txt diff --git a/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java b/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java index 1bfefd2..b7a9637 100644 --- a/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java +++ b/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java @@ -7,7 +7,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; @@ -27,8 +26,7 @@ public class JwtAuthenticationUtil { @Autowired private JwtUtil jwtUtil; @Autowired - @Qualifier("genericRedisTemplate") - private RedisTemplate redisTemplate; + private RedisTemplate redisTemplate; @Autowired private IEMRUserRepositoryCustom iEMRUserRepositoryCustom; private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); From 7ee24c49996b76c1ee1891bfd67f9f1df4bc16c7 Mon Sep 17 00:00:00 2001 From: DurgaPrasad-54 Date: Wed, 11 Feb 2026 10:11:44 +0530 Subject: [PATCH 06/11] chore(swagger): update github swagger workflow --- .github/workflows/swagger-json.yml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/swagger-json.yml b/.github/workflows/swagger-json.yml index 1322fa7..1f027e7 100644 --- a/.github/workflows/swagger-json.yml +++ b/.github/workflows/swagger-json.yml @@ -69,9 +69,17 @@ jobs: - 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 - kill $(cat api_pid.txt) || true - fi + 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 @@ -86,7 +94,7 @@ jobs: cp helpline104-api.json amrit-docs/docs/swagger/helpline104-api.json - name: Create Pull Request - uses: peter-evans/create-pull-request@v6 + uses: peter-evans/create-pull-request@v8 with: token: ${{ secrets.DOCS_REPO_TOKEN }} path: amrit-docs @@ -94,6 +102,7 @@ jobs: base: main commit-message: Auto-update Helpline104-API swagger title: Auto-update Helpline104-API swagger + delete-branch: true body: | This PR automatically updates the Helpline104-API Swagger JSON from the latest main branch build. From 2edfc3ed678effed40476b8d69f80e24287b7582 Mon Sep 17 00:00:00 2001 From: DurgaPrasad-54 Date: Wed, 11 Feb 2026 10:16:27 +0530 Subject: [PATCH 07/11] fix(swagger): healt-retries decrese to 5 --- .github/workflows/swagger-json.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/swagger-json.yml b/.github/workflows/swagger-json.yml index 1f027e7..5a9f991 100644 --- a/.github/workflows/swagger-json.yml +++ b/.github/workflows/swagger-json.yml @@ -18,7 +18,7 @@ jobs: --health-cmd "redis-cli ping" --health-interval 5s --health-timeout 5s - --health-retries 10 + --health-retries 5 steps: - name: Checkout API repo From 5207183245f679ff98bceb6951872bc1ca35c960 Mon Sep 17 00:00:00 2001 From: DurgaPrasad-54 Date: Fri, 13 Feb 2026 16:00:06 +0530 Subject: [PATCH 08/11] chore(swagger): add 104 properties, swagger profile and update swagger workflow --- .github/workflows/swagger-json.yml | 20 ++---- src/main/environment/104_swagger.properties | 32 ++++++++++ src/main/java/com/iemr/helpline104/App.java | 3 + .../helpline104/config/InterceptorConfig.java | 3 + .../iemr/helpline104/config/RedisConfig.java | 12 +--- .../helpline104/config/SwaggerConfig.java | 26 +++++--- .../iemr/helpline104/utils/FilterConfig.java | 2 + .../utils/JwtAuthenticationUtil.java | 4 +- .../com/iemr/helpline104/utils/JwtUtil.java | 2 + .../iemr/helpline104/utils/TokenDenylist.java | 2 + .../utils/http/HTTPRequestInterceptor.java | 2 + .../helpline104/utils/redis/RedisStorage.java | 2 + .../utils/sessionobject/SessionObject.java | 2 + .../utils/validator/Validator.java | 3 +- .../resources/application-swagger.properties | 61 +++++++++++++++---- src/main/resources/application.properties | 2 - 16 files changed, 131 insertions(+), 47 deletions(-) create mode 100644 src/main/environment/104_swagger.properties diff --git a/.github/workflows/swagger-json.yml b/.github/workflows/swagger-json.yml index 5a9f991..b9d58e6 100644 --- a/.github/workflows/swagger-json.yml +++ b/.github/workflows/swagger-json.yml @@ -9,17 +9,6 @@ jobs: swagger-sync: runs-on: ubuntu-latest - services: - redis: - image: redis:7 - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 5s - --health-timeout 5s - --health-retries 5 - steps: - name: Checkout API repo uses: actions/checkout@v4 @@ -32,7 +21,7 @@ jobs: cache: maven - name: Build API (skip tests) - run: mvn clean package -DskipTests + run: mvn clean package -DENV_VAR=swagger -DskipTests -Dcheckstyle.skip=true - name: Install jq run: sudo apt-get update && sudo apt-get install -y jq @@ -40,8 +29,11 @@ jobs: - name: Run API in swagger profile run: | mvn spring-boot:run \ + -DENV_VAR=swagger \ -Dspring-boot.run.profiles=swagger \ - -Dspring-boot.run.arguments="--server.port=9090 --spring.redis.host=localhost" \ + -Dcheckstyle.skip=true \ + -Dmaven.test.skip=true \ + -Dspring-boot.run.arguments="--server.port=9090" \ > app.log 2>&1 & echo $! > api_pid.txt @@ -98,7 +90,7 @@ jobs: with: token: ${{ secrets.DOCS_REPO_TOKEN }} path: amrit-docs - branch: auto/swagger-update-${{ github.run_id }} + branch: auto/swagger-update-helpline104-api base: main commit-message: Auto-update Helpline104-API swagger title: Auto-update Helpline104-API swagger diff --git a/src/main/environment/104_swagger.properties b/src/main/environment/104_swagger.properties new file mode 100644 index 0000000..0f891fc --- /dev/null +++ b/src/main/environment/104_swagger.properties @@ -0,0 +1,32 @@ +# Swagger / Local dev with H2 in-memory DB (no external services needed) + +server.port=8091 + +# Primary DB – H2 in-memory (MySQL compatibility mode) +spring.datasource.url=jdbc:h2:mem:swaggerdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false +spring.datasource.username=SA +spring.datasource.password= +spring.datasource.driver-class-name=org.h2.Driver + +# Secondary (Reporting) DB – H2 in-memory (MySQL compatibility mode) +secondary.datasource.url=jdbc:h2:mem:reportingdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false +secondary.datasource.username=SA +secondary.datasource.password= +secondary.datasource.driver-class-name=org.h2.Driver + +# Common URLs (safe defaults) +common-url=http://localhost:8080 +sendSMSUrl=http://localhost:8080/sms/sendSMS +sendEmailGeneralUrl=http://localhost:8080/emailController/sendEmailGeneral + +# Redis +spring.redis.host=localhost + +# JWT +jwt.secret=my-32-character-ultra-secure-and-ultra-long-secret + +# CORS +cors.allowed-origins=http://localhost:8091,http://127.0.0.1:9000 + +# Logging +logging.file.name=logs/helpline104-api.log diff --git a/src/main/java/com/iemr/helpline104/App.java b/src/main/java/com/iemr/helpline104/App.java index 4dd7bfd..01cbfda 100644 --- a/src/main/java/com/iemr/helpline104/App.java +++ b/src/main/java/com/iemr/helpline104/App.java @@ -26,6 +26,7 @@ import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Profile; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; @@ -60,6 +61,7 @@ public static void main(String[] args) { } @Bean + @Profile("!swagger") public IEMRApplBeans instantiateBeans() { return new IEMRApplBeans(); } @@ -83,6 +85,7 @@ public String hello(@PathVariable String name) { } @Bean + @Profile("!swagger") public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(factory); diff --git a/src/main/java/com/iemr/helpline104/config/InterceptorConfig.java b/src/main/java/com/iemr/helpline104/config/InterceptorConfig.java index 5a2df6e..746c8db 100644 --- a/src/main/java/com/iemr/helpline104/config/InterceptorConfig.java +++ b/src/main/java/com/iemr/helpline104/config/InterceptorConfig.java @@ -29,7 +29,10 @@ import com.iemr.helpline104.utils.http.HTTPRequestInterceptor; +import org.springframework.context.annotation.Profile; + @Configuration +@Profile("!swagger") public class InterceptorConfig implements WebMvcConfigurer { @Autowired diff --git a/src/main/java/com/iemr/helpline104/config/RedisConfig.java b/src/main/java/com/iemr/helpline104/config/RedisConfig.java index b42e62e..5c15ba0 100644 --- a/src/main/java/com/iemr/helpline104/config/RedisConfig.java +++ b/src/main/java/com/iemr/helpline104/config/RedisConfig.java @@ -7,12 +7,14 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.context.annotation.Profile; import org.springframework.session.data.redis.config.ConfigureRedisAction; import com.iemr.helpline104.data.users.M_User; @Configuration @EnableCaching +@Profile("!swagger") public class RedisConfig { @Bean @@ -35,14 +37,4 @@ public RedisTemplate redisTemplate(RedisConnectionFactory factor return template; } - // Add a generic RedisTemplate bean for TokenDenylist and other usages - @Bean(name = "genericRedisTemplate") - public RedisTemplate genericRedisTemplate(RedisConnectionFactory factory) { - RedisTemplate template = new RedisTemplate<>(); - template.setConnectionFactory(factory); - template.setKeySerializer(new StringRedisSerializer()); - template.setValueSerializer(new org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer()); - return template; - } - } diff --git a/src/main/java/com/iemr/helpline104/config/SwaggerConfig.java b/src/main/java/com/iemr/helpline104/config/SwaggerConfig.java index e8a09c0..5dff173 100644 --- a/src/main/java/com/iemr/helpline104/config/SwaggerConfig.java +++ b/src/main/java/com/iemr/helpline104/config/SwaggerConfig.java @@ -2,6 +2,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; @@ -11,14 +12,23 @@ @Configuration public class SwaggerConfig { - - @Bean - public OpenAPI customOpenAPI() { - return new OpenAPI().info(new - Info().title("Helpline 104 API").version("version").description("A microservice for the creation and management of beneficiaries.")) - .addSecurityItem(new SecurityRequirement().addList("my security")) - .components(new Components().addSecuritySchemes("my security", - new SecurityScheme().name("my security").type(SecurityScheme.Type.HTTP).scheme("bearer"))); + private static final String DEFAULT_SERVER_URL = "http://localhost:8091"; + + @Bean + public OpenAPI customOpenAPI(Environment env) { + String devUrl = env.getProperty("api.dev.url", DEFAULT_SERVER_URL); + String uatUrl = env.getProperty("api.uat.url", DEFAULT_SERVER_URL); + String demoUrl = env.getProperty("api.demo.url", DEFAULT_SERVER_URL); + return new OpenAPI() + .info(new Info().title("Helpline 104 API").version("version").description("A microservice for the creation and management of beneficiaries.")) + .addSecurityItem(new SecurityRequirement().addList("my security")) + .components(new Components().addSecuritySchemes("my security", + new SecurityScheme().name("my security").type(SecurityScheme.Type.HTTP).scheme("bearer"))) + .servers(java.util.Arrays.asList( + new io.swagger.v3.oas.models.servers.Server().url(devUrl).description("Dev"), + new io.swagger.v3.oas.models.servers.Server().url(uatUrl).description("UAT"), + new io.swagger.v3.oas.models.servers.Server().url(demoUrl).description("Demo") + )); } } diff --git a/src/main/java/com/iemr/helpline104/utils/FilterConfig.java b/src/main/java/com/iemr/helpline104/utils/FilterConfig.java index 065954b..8f425a8 100644 --- a/src/main/java/com/iemr/helpline104/utils/FilterConfig.java +++ b/src/main/java/com/iemr/helpline104/utils/FilterConfig.java @@ -3,10 +3,12 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import org.springframework.core.Ordered; import org.springframework.beans.factory.annotation.Value; @Configuration +@Profile("!swagger") public class FilterConfig { @Value("${cors.allowed-origins}") diff --git a/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java b/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java index b7a9637..f15f081 100644 --- a/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java +++ b/src/main/java/com/iemr/helpline104/utils/JwtAuthenticationUtil.java @@ -6,6 +6,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -19,6 +20,7 @@ import jakarta.servlet.http.HttpServletRequest; @Component +@Profile("!swagger") public class JwtAuthenticationUtil { @Autowired @@ -26,7 +28,7 @@ public class JwtAuthenticationUtil { @Autowired private JwtUtil jwtUtil; @Autowired - private RedisTemplate redisTemplate; + private RedisTemplate redisTemplate; @Autowired private IEMRUserRepositoryCustom iEMRUserRepositoryCustom; private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); diff --git a/src/main/java/com/iemr/helpline104/utils/JwtUtil.java b/src/main/java/com/iemr/helpline104/utils/JwtUtil.java index bc4c659..5317636 100644 --- a/src/main/java/com/iemr/helpline104/utils/JwtUtil.java +++ b/src/main/java/com/iemr/helpline104/utils/JwtUtil.java @@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import io.jsonwebtoken.Claims; @@ -12,6 +13,7 @@ import io.jsonwebtoken.security.Keys; @Component +@Profile("!swagger") public class JwtUtil { @Value("${jwt.secret}") diff --git a/src/main/java/com/iemr/helpline104/utils/TokenDenylist.java b/src/main/java/com/iemr/helpline104/utils/TokenDenylist.java index 0d51571..bfb22dd 100644 --- a/src/main/java/com/iemr/helpline104/utils/TokenDenylist.java +++ b/src/main/java/com/iemr/helpline104/utils/TokenDenylist.java @@ -5,11 +5,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @Component +@Profile("!swagger") public class TokenDenylist { private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); diff --git a/src/main/java/com/iemr/helpline104/utils/http/HTTPRequestInterceptor.java b/src/main/java/com/iemr/helpline104/utils/http/HTTPRequestInterceptor.java index 693170a..7036833 100644 --- a/src/main/java/com/iemr/helpline104/utils/http/HTTPRequestInterceptor.java +++ b/src/main/java/com/iemr/helpline104/utils/http/HTTPRequestInterceptor.java @@ -40,8 +40,10 @@ import jakarta.ws.rs.core.MediaType; import com.iemr.helpline104.utils.validator.Validator; +import org.springframework.context.annotation.Profile; @Component +@Profile("!swagger") public class HTTPRequestInterceptor implements HandlerInterceptor { private final Validator validator; diff --git a/src/main/java/com/iemr/helpline104/utils/redis/RedisStorage.java b/src/main/java/com/iemr/helpline104/utils/redis/RedisStorage.java index 69fb95e..e5595c1 100644 --- a/src/main/java/com/iemr/helpline104/utils/redis/RedisStorage.java +++ b/src/main/java/com/iemr/helpline104/utils/redis/RedisStorage.java @@ -28,9 +28,11 @@ import org.springframework.data.redis.connection.RedisStringCommands.SetOption; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.types.Expiration; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @Component +@Profile("!swagger") public class RedisStorage { // @Autowired // private RedisConnection redisConnection;// = new RedisConnection(); diff --git a/src/main/java/com/iemr/helpline104/utils/sessionobject/SessionObject.java b/src/main/java/com/iemr/helpline104/utils/sessionobject/SessionObject.java index 3f54972..7f6c0f2 100644 --- a/src/main/java/com/iemr/helpline104/utils/sessionobject/SessionObject.java +++ b/src/main/java/com/iemr/helpline104/utils/sessionobject/SessionObject.java @@ -22,6 +22,7 @@ package com.iemr.helpline104.utils.sessionobject; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import com.google.gson.JsonElement; @@ -32,6 +33,7 @@ import com.iemr.helpline104.utils.redis.RedisStorage; @Component +@Profile("!swagger") public class SessionObject { diff --git a/src/main/java/com/iemr/helpline104/utils/validator/Validator.java b/src/main/java/com/iemr/helpline104/utils/validator/Validator.java index 6d41a79..a953085 100644 --- a/src/main/java/com/iemr/helpline104/utils/validator/Validator.java +++ b/src/main/java/com/iemr/helpline104/utils/validator/Validator.java @@ -26,7 +26,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; - +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; import com.iemr.helpline104.utils.config.ConfigProperties; @@ -36,6 +36,7 @@ @Service +@Profile("!swagger") public class Validator { // private static SessionObject session; diff --git a/src/main/resources/application-swagger.properties b/src/main/resources/application-swagger.properties index 3b20444..7a708c4 100644 --- a/src/main/resources/application-swagger.properties +++ b/src/main/resources/application-swagger.properties @@ -1,20 +1,59 @@ -spring.datasource.url=jdbc:h2:mem:swaggerdb + +spring.main.lazy-initialization=true +spring.datasource.url=jdbc:h2:mem:swaggerdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=SA spring.datasource.password= -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +secondary.datasource.url=jdbc:h2:mem:reportingdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false +secondary.datasource.driver-class-name=org.h2.Driver +secondary.datasource.username=SA +secondary.datasource.password= +spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=none -# Disable Redis if not needed for docs (optional) -spring.redis.host=localhost -spring.redis.port=6379 +## Exclude external service auto-configurations +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.session.SessionAutoConfiguration + +## H2 Console disabled – prevents eager dataSource creation during Tomcat startup +spring.h2.console.enabled=false + +## Defer repository initialization (avoids query validation against H2) +spring.data.jpa.repositories.bootstrap-mode=deferred +spring.jpa.defer-datasource-initialization=true +spring.jpa.properties.hibernate.query.validation_enabled=false +spring.jpa.properties.jakarta.persistence.validation.mode=none +spring.session.store-type=none +spring.cache.type=simple + +## Redis connection (app creates LettuceConnectionFactory – keep defaults) + +spring.redis.password= +spring.data.redis.host=localhost +spring.data.redis.port=6379 + +## =========================== +## CORS +## =========================== +cors.allowed-origins=http://localhost:*,http://127.0.0.1:* -# CORS for Swagger UI -cors.allowed-origins=${CORS_ALLOWED_ORIGINS:http://localhost:9090,http://localhost:8080} +## =========================== +## JWT Secret +## =========================== +jwt.secret=${JWT_SECRET_KEY:#{T(java.util.UUID).randomUUID().toString()}} -jwt.secret=JWT_SECRET -# Logging +## =========================== +## Logging +## =========================== logging.level.root=INFO +logging.file.name=logs/helpline104-api.log -# Use environment variable for JWT secret -jwt.secret=${JWT_SECRET_KEY:default-swagger-secret-change-me} +## =========================== +## Common / SMS / Email URLs (safe defaults) +## =========================== +common-url=http://localhost:8080 +sendSMSUrl=http://localhost:8080/sms/sendSMS +sendEmailGeneralUrl=http://localhost:8080/emailController/sendEmailGeneral +api.dev.url=${API_DEV_URL:https://amritwprdev.piramalswasthya.org} +api.uat.url=${API_UAT_URL:https://uatamrit.piramalswasthya.org} +api.demo.url=${API_DEMO_URL:https://amritdemo.piramalswasthya.org} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d2ab578..2bb31ad 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -33,8 +33,6 @@ spring.session.store-type=redis #spring.redis.host=localhost spring.redis.password= spring.redis.port=6379 -spring.datasource.username=${DB_USERNAME:} -spring.datasource.password=${DB_PASSWORD:} ## Below values are needed for extending the expiry time and extend expiry time. iemr.extend.expiry.time=true iemr.session.expiry.time=7200 From a49ee7f85dc5d19ecfc3220f5b27be0fe0222c85 Mon Sep 17 00:00:00 2001 From: DurgaPrasad-54 Date: Fri, 13 Feb 2026 16:14:26 +0530 Subject: [PATCH 09/11] chore(swagger): add verson for swagger doc and fix jwt issue --- src/main/environment/104_swagger.properties | 2 +- .../helpline104/config/SwaggerConfig.java | 2 +- .../resources/application-swagger.properties | 21 ++----------------- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/src/main/environment/104_swagger.properties b/src/main/environment/104_swagger.properties index 0f891fc..332d185 100644 --- a/src/main/environment/104_swagger.properties +++ b/src/main/environment/104_swagger.properties @@ -23,7 +23,7 @@ sendEmailGeneralUrl=http://localhost:8080/emailController/sendEmailGeneral spring.redis.host=localhost # JWT -jwt.secret=my-32-character-ultra-secure-and-ultra-long-secret +jwt.secret=${JWT_SECRET_KEY:#{T(java.util.UUID).randomUUID().toString()}} # CORS cors.allowed-origins=http://localhost:8091,http://127.0.0.1:9000 diff --git a/src/main/java/com/iemr/helpline104/config/SwaggerConfig.java b/src/main/java/com/iemr/helpline104/config/SwaggerConfig.java index 5dff173..62e2f73 100644 --- a/src/main/java/com/iemr/helpline104/config/SwaggerConfig.java +++ b/src/main/java/com/iemr/helpline104/config/SwaggerConfig.java @@ -20,7 +20,7 @@ public OpenAPI customOpenAPI(Environment env) { String uatUrl = env.getProperty("api.uat.url", DEFAULT_SERVER_URL); String demoUrl = env.getProperty("api.demo.url", DEFAULT_SERVER_URL); return new OpenAPI() - .info(new Info().title("Helpline 104 API").version("version").description("A microservice for the creation and management of beneficiaries.")) + .info(new Info().title("Helpline 104 API").version("1.0.0").description("Helpline 104 API for health advisory, disease surveillance, and medical information services.")) .addSecurityItem(new SecurityRequirement().addList("my security")) .components(new Components().addSecuritySchemes("my security", new SecurityScheme().name("my security").type(SecurityScheme.Type.HTTP).scheme("bearer"))) diff --git a/src/main/resources/application-swagger.properties b/src/main/resources/application-swagger.properties index 7a708c4..be35b00 100644 --- a/src/main/resources/application-swagger.properties +++ b/src/main/resources/application-swagger.properties @@ -8,8 +8,8 @@ secondary.datasource.url=jdbc:h2:mem:reportingdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_E secondary.datasource.driver-class-name=org.h2.Driver secondary.datasource.username=SA secondary.datasource.password= -spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto=none ## Exclude external service auto-configurations @@ -27,30 +27,13 @@ spring.session.store-type=none spring.cache.type=simple ## Redis connection (app creates LettuceConnectionFactory – keep defaults) - spring.redis.password= spring.data.redis.host=localhost spring.data.redis.port=6379 - -## =========================== -## CORS -## =========================== cors.allowed-origins=http://localhost:*,http://127.0.0.1:* - -## =========================== -## JWT Secret -## =========================== jwt.secret=${JWT_SECRET_KEY:#{T(java.util.UUID).randomUUID().toString()}} - -## =========================== -## Logging -## =========================== logging.level.root=INFO logging.file.name=logs/helpline104-api.log - -## =========================== -## Common / SMS / Email URLs (safe defaults) -## =========================== common-url=http://localhost:8080 sendSMSUrl=http://localhost:8080/sms/sendSMS sendEmailGeneralUrl=http://localhost:8080/emailController/sendEmailGeneral From 99aac3d7b4c54524759c90986319f12b61875491 Mon Sep 17 00:00:00 2001 From: DurgaPrasad-54 Date: Fri, 13 Feb 2026 16:31:58 +0530 Subject: [PATCH 10/11] chore(swagger): add mysqldialect on swagger properties --- src/main/resources/application-swagger.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application-swagger.properties b/src/main/resources/application-swagger.properties index be35b00..a541b14 100644 --- a/src/main/resources/application-swagger.properties +++ b/src/main/resources/application-swagger.properties @@ -8,8 +8,8 @@ secondary.datasource.url=jdbc:h2:mem:reportingdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_E secondary.datasource.driver-class-name=org.h2.Driver secondary.datasource.username=SA secondary.datasource.password= -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect +spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=none ## Exclude external service auto-configurations From 1e7e3892eddf4c6e63c9f76c6222975443af399e Mon Sep 17 00:00:00 2001 From: DurgaPrasad-54 Date: Wed, 18 Feb 2026 08:42:21 +0530 Subject: [PATCH 11/11] fix(swagger): removed application-swagger.properties --- .../104_swagger.properties | 11 +---- .../resources/application-swagger.properties | 42 ------------------- 2 files changed, 1 insertion(+), 52 deletions(-) rename src/main/{environment => resources}/104_swagger.properties (85%) delete mode 100644 src/main/resources/application-swagger.properties diff --git a/src/main/environment/104_swagger.properties b/src/main/resources/104_swagger.properties similarity index 85% rename from src/main/environment/104_swagger.properties rename to src/main/resources/104_swagger.properties index 332d185..da9d6d9 100644 --- a/src/main/environment/104_swagger.properties +++ b/src/main/resources/104_swagger.properties @@ -1,32 +1,23 @@ -# Swagger / Local dev with H2 in-memory DB (no external services needed) - server.port=8091 - # Primary DB – H2 in-memory (MySQL compatibility mode) spring.datasource.url=jdbc:h2:mem:swaggerdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false spring.datasource.username=SA spring.datasource.password= spring.datasource.driver-class-name=org.h2.Driver - -# Secondary (Reporting) DB – H2 in-memory (MySQL compatibility mode) +# Secondary (Reporting) DB – H2 in-memory secondary.datasource.url=jdbc:h2:mem:reportingdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false secondary.datasource.username=SA secondary.datasource.password= secondary.datasource.driver-class-name=org.h2.Driver - # Common URLs (safe defaults) common-url=http://localhost:8080 sendSMSUrl=http://localhost:8080/sms/sendSMS sendEmailGeneralUrl=http://localhost:8080/emailController/sendEmailGeneral - # Redis spring.redis.host=localhost - # JWT jwt.secret=${JWT_SECRET_KEY:#{T(java.util.UUID).randomUUID().toString()}} - # CORS cors.allowed-origins=http://localhost:8091,http://127.0.0.1:9000 - # Logging logging.file.name=logs/helpline104-api.log diff --git a/src/main/resources/application-swagger.properties b/src/main/resources/application-swagger.properties deleted file mode 100644 index a541b14..0000000 --- a/src/main/resources/application-swagger.properties +++ /dev/null @@ -1,42 +0,0 @@ - -spring.main.lazy-initialization=true -spring.datasource.url=jdbc:h2:mem:swaggerdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false -spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.username=SA -spring.datasource.password= -secondary.datasource.url=jdbc:h2:mem:reportingdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false -secondary.datasource.driver-class-name=org.h2.Driver -secondary.datasource.username=SA -secondary.datasource.password= -spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect -spring.jpa.hibernate.ddl-auto=none - -## Exclude external service auto-configurations -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.session.SessionAutoConfiguration - -## H2 Console disabled – prevents eager dataSource creation during Tomcat startup -spring.h2.console.enabled=false - -## Defer repository initialization (avoids query validation against H2) -spring.data.jpa.repositories.bootstrap-mode=deferred -spring.jpa.defer-datasource-initialization=true -spring.jpa.properties.hibernate.query.validation_enabled=false -spring.jpa.properties.jakarta.persistence.validation.mode=none -spring.session.store-type=none -spring.cache.type=simple - -## Redis connection (app creates LettuceConnectionFactory – keep defaults) -spring.redis.password= -spring.data.redis.host=localhost -spring.data.redis.port=6379 -cors.allowed-origins=http://localhost:*,http://127.0.0.1:* -jwt.secret=${JWT_SECRET_KEY:#{T(java.util.UUID).randomUUID().toString()}} -logging.level.root=INFO -logging.file.name=logs/helpline104-api.log -common-url=http://localhost:8080 -sendSMSUrl=http://localhost:8080/sms/sendSMS -sendEmailGeneralUrl=http://localhost:8080/emailController/sendEmailGeneral -api.dev.url=${API_DEV_URL:https://amritwprdev.piramalswasthya.org} -api.uat.url=${API_UAT_URL:https://uatamrit.piramalswasthya.org} -api.demo.url=${API_DEMO_URL:https://amritdemo.piramalswasthya.org}