From d5c079c24f5c8f63beca1a636db30605cd754679 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 23 Jul 2026 16:23:01 +0530 Subject: [PATCH 01/13] save fcm user token in table --- .../common/data/userToken/UserTokenData.java | 17 +++++++++-------- .../model/notification/NotificationMessage.java | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/iemr/common/data/userToken/UserTokenData.java b/src/main/java/com/iemr/common/data/userToken/UserTokenData.java index 0646972e..9a6da29d 100644 --- a/src/main/java/com/iemr/common/data/userToken/UserTokenData.java +++ b/src/main/java/com/iemr/common/data/userToken/UserTokenData.java @@ -24,23 +24,24 @@ */ package com.iemr.common.data.userToken; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; +import jakarta.persistence.*; import lombok.Data; import java.sql.Timestamp; +import static jakarta.persistence.GenerationType.IDENTITY; + @Entity -@Table(name = "user_tokens", schema = "db_iemr") +@Table(name = "user_fcm_tokens", schema = "db_iemr") @Data public class UserTokenData { @Id + @GeneratedValue(strategy = IDENTITY) + private int id; @Column(name = "user_id") - Integer userId; + private Integer userId; @Column(name = "token") - String token; + private String token; @Column(name = "updated_at") - Timestamp updatedAt; + private Timestamp updatedAt; } diff --git a/src/main/java/com/iemr/common/model/notification/NotificationMessage.java b/src/main/java/com/iemr/common/model/notification/NotificationMessage.java index 58343034..55cb0e62 100644 --- a/src/main/java/com/iemr/common/model/notification/NotificationMessage.java +++ b/src/main/java/com/iemr/common/model/notification/NotificationMessage.java @@ -35,4 +35,4 @@ public class NotificationMessage { private String title; private String body; private Map data; -} +} \ No newline at end of file From e9b38a27ae04c030c644d2f4524b829ea22eef13 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 23 Jul 2026 16:47:02 +0530 Subject: [PATCH 02/13] save fcm user token in table --- .../java/com/iemr/common/repo/userToken/UserTokenRepo.java | 3 +++ .../firebaseNotification/FirebaseNotificationService.java | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/iemr/common/repo/userToken/UserTokenRepo.java b/src/main/java/com/iemr/common/repo/userToken/UserTokenRepo.java index 817f26f0..10e504ae 100644 --- a/src/main/java/com/iemr/common/repo/userToken/UserTokenRepo.java +++ b/src/main/java/com/iemr/common/repo/userToken/UserTokenRepo.java @@ -26,6 +26,9 @@ import com.iemr.common.data.userToken.UserTokenData; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository public interface UserTokenRepo extends JpaRepository { } diff --git a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java index 7f33c453..01de9df3 100644 --- a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java +++ b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java @@ -94,12 +94,10 @@ public String updateToken(UserToken userToken) { if (existingTokenData.isPresent()) { userTokenData = existingTokenData.get(); userTokenData.setToken(userToken.getToken()); - userTokenData.setUpdatedAt(new Timestamp(System.currentTimeMillis())); } else { userTokenData = new UserTokenData(); userTokenData.setUserId(userToken.getUserId()); userTokenData.setToken(userToken.getToken()); - userTokenData.setUpdatedAt(new Timestamp(System.currentTimeMillis())); } userTokenRepo.save(userTokenData); From 3714b6d51436453305aa29532e0e05ce2aba5ebb Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 23 Jul 2026 16:53:15 +0530 Subject: [PATCH 03/13] save fcm user token in table --- .../{UserTokenData.java => UserFcmTokenData.java} | 2 +- .../{UserTokenRepo.java => UserFcmTokenRepo.java} | 4 ++-- .../FirebaseNotificationService.java | 15 +++++++-------- 3 files changed, 10 insertions(+), 11 deletions(-) rename src/main/java/com/iemr/common/data/userToken/{UserTokenData.java => UserFcmTokenData.java} (97%) rename src/main/java/com/iemr/common/repo/userToken/{UserTokenRepo.java => UserFcmTokenRepo.java} (88%) diff --git a/src/main/java/com/iemr/common/data/userToken/UserTokenData.java b/src/main/java/com/iemr/common/data/userToken/UserFcmTokenData.java similarity index 97% rename from src/main/java/com/iemr/common/data/userToken/UserTokenData.java rename to src/main/java/com/iemr/common/data/userToken/UserFcmTokenData.java index 9a6da29d..0a0fefbe 100644 --- a/src/main/java/com/iemr/common/data/userToken/UserTokenData.java +++ b/src/main/java/com/iemr/common/data/userToken/UserFcmTokenData.java @@ -34,7 +34,7 @@ @Entity @Table(name = "user_fcm_tokens", schema = "db_iemr") @Data -public class UserTokenData { +public class UserFcmTokenData { @Id @GeneratedValue(strategy = IDENTITY) private int id; diff --git a/src/main/java/com/iemr/common/repo/userToken/UserTokenRepo.java b/src/main/java/com/iemr/common/repo/userToken/UserFcmTokenRepo.java similarity index 88% rename from src/main/java/com/iemr/common/repo/userToken/UserTokenRepo.java rename to src/main/java/com/iemr/common/repo/userToken/UserFcmTokenRepo.java index 10e504ae..ccc1d6d9 100644 --- a/src/main/java/com/iemr/common/repo/userToken/UserTokenRepo.java +++ b/src/main/java/com/iemr/common/repo/userToken/UserFcmTokenRepo.java @@ -24,11 +24,11 @@ */ package com.iemr.common.repo.userToken; -import com.iemr.common.data.userToken.UserTokenData; +import com.iemr.common.data.userToken.UserFcmTokenData; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface UserTokenRepo extends JpaRepository { +public interface UserFcmTokenRepo extends JpaRepository { } diff --git a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java index 01de9df3..9514620f 100644 --- a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java +++ b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java @@ -28,10 +28,10 @@ import com.google.firebase.messaging.FirebaseMessaging; import com.google.firebase.messaging.Message; import com.google.firebase.messaging.Notification; -import com.iemr.common.data.userToken.UserTokenData; +import com.iemr.common.data.userToken.UserFcmTokenData; import com.iemr.common.model.notification.NotificationMessage; import com.iemr.common.model.notification.UserToken; -import com.iemr.common.repo.userToken.UserTokenRepo; +import com.iemr.common.repo.userToken.UserFcmTokenRepo; import com.iemr.common.utils.CookieUtil; import com.iemr.common.utils.JwtUtil; import com.iemr.common.utils.exception.IEMRException; @@ -43,7 +43,6 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import java.sql.Timestamp; import java.util.Optional; @Service @@ -54,7 +53,7 @@ public class FirebaseNotificationService { FirebaseMessaging firebaseMessaging; @Autowired - private UserTokenRepo userTokenRepo; + private UserFcmTokenRepo userTokenRepo; @Autowired private CookieUtil cookieUtil; @@ -87,15 +86,15 @@ public String sendNotification(NotificationMessage notificationMessage) { } public String updateToken(UserToken userToken) { - Optional existingTokenData = userTokenRepo.findById(userToken.getUserId()); + Optional existingTokenData = userTokenRepo.findById(userToken.getUserId()); - UserTokenData userTokenData; + UserFcmTokenData userTokenData; if (existingTokenData.isPresent()) { userTokenData = existingTokenData.get(); userTokenData.setToken(userToken.getToken()); } else { - userTokenData = new UserTokenData(); + userTokenData = new UserFcmTokenData(); userTokenData.setUserId(userToken.getUserId()); userTokenData.setToken(userToken.getToken()); } @@ -109,7 +108,7 @@ public String getUserToken() throws IEMRException { .getRequest(); String jwtTokenFromCookie = cookieUtil.getJwtTokenFromCookie(requestHeader); return userTokenRepo.findById(Integer.parseInt(jwtUtil.getUserIdFromToken(jwtTokenFromCookie))) // because your userId is Long in DB - .map(UserTokenData::getToken) + .map(UserFcmTokenData::getToken) .orElse(null); // } From 251cf6fa361d34032ea35b97b22b47cfb8ab2d66 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 23 Jul 2026 17:01:57 +0530 Subject: [PATCH 04/13] save fcm user token in table --- .../firebaseNotification/FirebaseNotificationService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java index 9514620f..7dbee27f 100644 --- a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java +++ b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java @@ -72,7 +72,7 @@ public String sendNotification(NotificationMessage notificationMessage) { Notification notification = Notification.builder().setTitle(notificationMessage.getTitle()).setBody(notificationMessage.getBody()).build(); - Message message = Message.builder().setTopic(notificationMessage.getToken()).setNotification(notification).putAllData(notificationMessage.getData()).build(); + Message message = Message.builder().setToken(notificationMessage.getToken()).setNotification(notification).putAllData(notificationMessage.getData()).build(); try { From 4ef61c244c4c01aa67e8ddd18e33048962d61195 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 23 Jul 2026 17:38:38 +0530 Subject: [PATCH 05/13] save fcm user token in table --- .../FirebaseNotificationController.java | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java b/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java index 3bb10cfc..e37f2c41 100644 --- a/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java +++ b/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java @@ -28,9 +28,12 @@ import com.iemr.common.model.notification.UserToken; import com.iemr.common.service.firebaseNotification.FirebaseNotificationService; import com.iemr.common.utils.exception.IEMRException; +import com.iemr.common.utils.response.ApiResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController @@ -41,17 +44,33 @@ public class FirebaseNotificationController { @Autowired FirebaseNotificationService firebaseNotificationService; - @RequestMapping(value = "sendNotification",method = RequestMethod.POST,headers = "Authorization") + @PostMapping(value = "/sendNotification") public String sendNotificationByToken(@RequestBody NotificationMessage notificationMessage){ return firebaseNotificationService.sendNotification(notificationMessage); } - @RequestMapping(value = "updateToken",method = RequestMethod.POST,headers = "Authorization") - public String updateToken(@RequestBody UserToken userToken){ - return firebaseNotificationService.updateToken(userToken); + @PostMapping("/updateToken") + public ResponseEntity updateToken(@RequestBody UserToken userToken) { + try { + + Object result = firebaseNotificationService.updateToken(userToken); + + return ResponseEntity.ok(result); + + } catch (IllegalArgumentException e) { + + return ResponseEntity.badRequest().body(e.getMessage()); + + } catch (Exception e) { + + logger.error("Error while updating Firebase token", e); + + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Failed to update Firebase token."); + } } - @RequestMapping(value = "getToken",method = RequestMethod.GET,headers = "Authorization") + @PostMapping(value = "getToken") public String getUserToken() throws IEMRException { return firebaseNotificationService.getUserToken(); From 65c4f93d52cdbb9de8815a1e45d4c46822270cfa Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 23 Jul 2026 17:40:57 +0530 Subject: [PATCH 06/13] save fcm user token in table --- .../java/com/iemr/common/repo/userToken/UserFcmTokenRepo.java | 4 ++++ .../firebaseNotification/FirebaseNotificationService.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/common/repo/userToken/UserFcmTokenRepo.java b/src/main/java/com/iemr/common/repo/userToken/UserFcmTokenRepo.java index ccc1d6d9..b2ed14df 100644 --- a/src/main/java/com/iemr/common/repo/userToken/UserFcmTokenRepo.java +++ b/src/main/java/com/iemr/common/repo/userToken/UserFcmTokenRepo.java @@ -28,7 +28,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface UserFcmTokenRepo extends JpaRepository { + + Optional findByUserId(Integer userId); } diff --git a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java index 7dbee27f..52591cb4 100644 --- a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java +++ b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java @@ -86,7 +86,7 @@ public String sendNotification(NotificationMessage notificationMessage) { } public String updateToken(UserToken userToken) { - Optional existingTokenData = userTokenRepo.findById(userToken.getUserId()); + Optional existingTokenData = userTokenRepo.findByUserId(userToken.getUserId()); UserFcmTokenData userTokenData; From ac356240af02e1d66b79008de48b0221464146f4 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 24 Jul 2026 12:35:13 +0530 Subject: [PATCH 07/13] save fcm user token in table --- .../FirebaseNotificationController.java | 33 +++++++++++++++-- .../FirebaseNotificationService.java | 35 +++++++++++++++---- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java b/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java index e37f2c41..1cb2753d 100644 --- a/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java +++ b/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java @@ -44,9 +44,36 @@ public class FirebaseNotificationController { @Autowired FirebaseNotificationService firebaseNotificationService; - @PostMapping(value = "/sendNotification") - public String sendNotificationByToken(@RequestBody NotificationMessage notificationMessage){ - return firebaseNotificationService.sendNotification(notificationMessage); + + @PostMapping("/sendNotification") + public ResponseEntity sendNotificationByToken(@RequestBody NotificationMessage notificationMessage) { + + logger.info("Received notification request. Token={}, Title={}, ReceiverId={}, Type={}", + notificationMessage.getToken(), + notificationMessage.getTitle(), + notificationMessage.getData() != null ? notificationMessage.getData().get("receiver_user_id") : null, + notificationMessage.getData() != null ? notificationMessage.getData().get("notification_type") : null); + + logger.debug("Notification payload: {}", notificationMessage); + + try { + String response = firebaseNotificationService.sendNotification(notificationMessage); + + logger.info("Notification processed successfully. Response={}", response); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + + logger.error("Failed to process notification request. Token={}, ReceiverId={}, Error={}", + notificationMessage.getToken(), + notificationMessage.getData() != null ? notificationMessage.getData().get("receiver_user_id") : null, + e.getMessage(), + e); + + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Failed to send notification"); + } } @PostMapping("/updateToken") diff --git a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java index 52591cb4..834ce443 100644 --- a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java +++ b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java @@ -26,8 +26,10 @@ import com.google.firebase.FirebaseException; import com.google.firebase.messaging.FirebaseMessaging; +import com.google.firebase.messaging.FirebaseMessagingException; import com.google.firebase.messaging.Message; import com.google.firebase.messaging.Notification; +import com.google.gson.Gson; import com.iemr.common.data.userToken.UserFcmTokenData; import com.iemr.common.model.notification.NotificationMessage; import com.iemr.common.model.notification.UserToken; @@ -65,23 +67,42 @@ public class FirebaseNotificationService { public String sendNotification(NotificationMessage notificationMessage) { + + logger.info("Notification Request : {}", new Gson().toJson(notificationMessage)); + if (firebaseMessaging == null) { - logger.error("⚠️ Firebase is not configured, skipping notification"); - return null; + logger.error("Firebase is not configured"); + return "Firebase is not configured"; } - Notification notification = Notification.builder().setTitle(notificationMessage.getTitle()).setBody(notificationMessage.getBody()).build(); + try { - Message message = Message.builder().setToken(notificationMessage.getToken()).setNotification(notification).putAllData(notificationMessage.getData()).build(); + Notification notification = Notification.builder() + .setTitle(notificationMessage.getTitle()) + .setBody(notificationMessage.getBody()) + .build(); + Message message = Message.builder() + .setToken(notificationMessage.getToken()) + .setNotification(notification) + .putAllData(notificationMessage.getData()) + .build(); - try { String response = FirebaseMessaging.getInstance().send(message); + logger.info("FCM Success : {}", response); + return response; - } catch (FirebaseException e) { - return "Error sending notification"; + } catch (FirebaseMessagingException e) { + + logger.error("FirebaseMessagingException : {}", e.getMessage(), e); + return e.getMessage(); + + } catch (Exception e) { + + logger.error("Unexpected Exception : {}", e.getMessage(), e); + throw e; } } From 4f58051954978a7bdce865ee338ccb2fa0b28b80 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 24 Jul 2026 13:55:32 +0530 Subject: [PATCH 08/13] save fcm user token in table --- .../firebaseNotification/FirebaseNotificationService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java index 834ce443..809eda19 100644 --- a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java +++ b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java @@ -30,6 +30,7 @@ import com.google.firebase.messaging.Message; import com.google.firebase.messaging.Notification; import com.google.gson.Gson; +import com.iemr.common.config.firebase.FirebaseMessagingConfig; import com.iemr.common.data.userToken.UserFcmTokenData; import com.iemr.common.model.notification.NotificationMessage; import com.iemr.common.model.notification.UserToken; @@ -51,8 +52,8 @@ public class FirebaseNotificationService { final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); - @Autowired(required = false) - FirebaseMessaging firebaseMessaging; + @Autowired + FirebaseMessagingConfig firebaseMessaging; @Autowired private UserFcmTokenRepo userTokenRepo; From 7b4b14fde2cac43d761eb9b6a92a9275c714c7d5 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 24 Jul 2026 13:58:02 +0530 Subject: [PATCH 09/13] save fcm user token in table --- .../iemr/common/config/firebase/FirebaseMessagingConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java b/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java index ebb697ec..baca2bc2 100644 --- a/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java +++ b/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java @@ -21,10 +21,10 @@ public class FirebaseMessagingConfig { private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); - @Value("${firebase.enabled:false}") + @Value("${firebase.enabled}") private boolean firebaseEnabled; - @Value("${firebase.credential-file:}") + @Value("${firebase.credential-file}") private String firebaseCredentialFile; From 865ede141dee758c3b9091277281cee611a91b5c Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 24 Jul 2026 14:12:34 +0530 Subject: [PATCH 10/13] save fcm user token in table --- .../FirebaseNotificationService.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java index 809eda19..7d642c74 100644 --- a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java +++ b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java @@ -53,7 +53,10 @@ public class FirebaseNotificationService { final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); @Autowired - FirebaseMessagingConfig firebaseMessaging; + FirebaseMessagingConfig firebaseMessagingConfig; + + @Autowired(required = false) + private FirebaseMessaging firebaseMessaging; @Autowired private UserFcmTokenRepo userTokenRepo; @@ -69,11 +72,12 @@ public class FirebaseNotificationService { public String sendNotification(NotificationMessage notificationMessage) { - logger.info("Notification Request : {}", new Gson().toJson(notificationMessage)); + logger.info("========== FCM Notification Request =========="); + logger.info("Request : {}", new Gson().toJson(notificationMessage)); if (firebaseMessaging == null) { - logger.error("Firebase is not configured"); - return "Firebase is not configured"; + logger.error("FirebaseMessaging bean is not initialized."); + return "FirebaseMessaging bean is not initialized."; } try { @@ -89,24 +93,30 @@ public String sendNotification(NotificationMessage notificationMessage) { .putAllData(notificationMessage.getData()) .build(); - String response = FirebaseMessaging.getInstance().send(message); + logger.info("Sending notification to token: {}", notificationMessage.getToken()); + + String response = firebaseMessaging.send(message); - logger.info("FCM Success : {}", response); + logger.info("Notification sent successfully."); + logger.info("Firebase Message Id : {}", response); return response; } catch (FirebaseMessagingException e) { - logger.error("FirebaseMessagingException : {}", e.getMessage(), e); - return e.getMessage(); + logger.error("FirebaseMessagingException"); + logger.error("Error Code : {}", e.getMessagingErrorCode()); + logger.error("Error Message : {}", e.getMessage(), e); + + return "FCM Error : " + e.getMessage(); } catch (Exception e) { - logger.error("Unexpected Exception : {}", e.getMessage(), e); - throw e; + logger.error("Unexpected exception while sending notification.", e); + + return "Unexpected Error : " + e.getMessage(); } } - public String updateToken(UserToken userToken) { Optional existingTokenData = userTokenRepo.findByUserId(userToken.getUserId()); From c4cfb5d1907b608c11db4086fb0f6cd05b1b09cf Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 24 Jul 2026 14:25:22 +0530 Subject: [PATCH 11/13] save fcm user token in table --- .../iemr/common/config/firebase/FirebaseMessagingConfig.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java b/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java index baca2bc2..7aae4c89 100644 --- a/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java +++ b/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java @@ -31,6 +31,9 @@ public class FirebaseMessagingConfig { @Bean @ConditionalOnProperty(name = "firebase.enabled", havingValue = "true") public FirebaseMessaging firebaseMessaging() throws IOException { + logger.info("===== Initializing Firebase ====="); + logger.info("firebaseEnabled={}", firebaseEnabled); + logger.info("firebaseCredentialFile={}", firebaseCredentialFile); if (!firebaseEnabled) { logger.error("⚠️ Firebase disabled by config"); return null; From 3e31edae6f0b99de5170cf570c26d14e01a5aa48 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 24 Jul 2026 15:30:42 +0530 Subject: [PATCH 12/13] save fcm user token in table --- .../FirebaseNotificationService.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java index 7d642c74..691318db 100644 --- a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java +++ b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java @@ -42,6 +42,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -69,9 +70,20 @@ public class FirebaseNotificationService { private Message message; + @Value("${firebase.enabled}") + private boolean firebaseEnabled; + + @Value("${firebase.credential-file}") + private String firebaseCredentialFile; + + public String sendNotification(NotificationMessage notificationMessage) { + logger.info("===== Initializing Firebase ====="); + logger.info("firebaseEnabled={}", firebaseEnabled); + logger.info("firebaseCredentialFile={}", firebaseCredentialFile); + logger.info("========== FCM Notification Request =========="); logger.info("Request : {}", new Gson().toJson(notificationMessage)); From 700e2e2010613a3391308668e4729827f0b1da5d Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 24 Jul 2026 15:41:54 +0530 Subject: [PATCH 13/13] save fcm user token in table --- .../common/config/firebase/FirebaseMessagingConfig.java | 8 +++++--- .../firebaseNotification/FirebaseNotificationService.java | 3 --- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java b/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java index 7aae4c89..08d9a518 100644 --- a/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java +++ b/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java @@ -45,9 +45,11 @@ public FirebaseMessaging firebaseMessaging() throws IOException { return null; // don't throw, app will still start } - GoogleCredentials credentials = GoogleCredentials.fromStream( - new ClassPathResource(firebaseCredentialFile).getInputStream() - ); + GoogleCredentials credentials = + GoogleCredentials.fromStream( + new FileInputStream(firebaseCredentialFile) + ); + FirebaseOptions options = FirebaseOptions.builder() .setCredentials(credentials) .build(); diff --git a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java index 691318db..66140ccc 100644 --- a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java +++ b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java @@ -53,9 +53,6 @@ public class FirebaseNotificationService { final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); - @Autowired - FirebaseMessagingConfig firebaseMessagingConfig; - @Autowired(required = false) private FirebaseMessaging firebaseMessaging;