From 4919ab29c1c38b66a31f3da24d04fdd719f72dcf Mon Sep 17 00:00:00 2001 From: ravishanigarapu <133210792+ravishanigarapu@users.noreply.github.com> Date: Thu, 10 Jul 2025 13:10:30 +0530 Subject: [PATCH 1/4] Constans and null check added (#134) * Update application.properties * Swagger changes * AMM-1456 : Skiped jwtToken validation if not present in Cookie or header from mobile request. * Jwtten and user-agent validation * null check * Constants added and null check * Empty check added * Optimized code * removed commented code --- .../java/com/iemr/hwc/utils/Constants.java | 9 +++ .../hwc/utils/JwtUserIdValidationFilter.java | 65 +++++++++---------- .../com/iemr/hwc/utils/RestTemplateUtil.java | 3 +- .../utils/http/HTTPRequestInterceptor.java | 2 +- 4 files changed, 42 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/iemr/hwc/utils/Constants.java diff --git a/src/main/java/com/iemr/hwc/utils/Constants.java b/src/main/java/com/iemr/hwc/utils/Constants.java new file mode 100644 index 00000000..8b069602 --- /dev/null +++ b/src/main/java/com/iemr/hwc/utils/Constants.java @@ -0,0 +1,9 @@ +package com.iemr.hwc.utils; + +public class Constants { + public static final String JWT_TOKEN = "Jwttoken"; + public static final String USER_AGENT = "User-Agent"; + public static final String OKHTTP = "okhttp"; + + private Constants() {} +} diff --git a/src/main/java/com/iemr/hwc/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/hwc/utils/JwtUserIdValidationFilter.java index 630fd9a0..630be9ee 100644 --- a/src/main/java/com/iemr/hwc/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/hwc/utils/JwtUserIdValidationFilter.java @@ -7,6 +7,8 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import com.iemr.hwc.utils.http.AuthorizationHeaderRequestWrapper; + import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; @@ -74,7 +76,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo } // Log headers for debugging - String jwtTokenFromHeader = request.getHeader("Jwttoken"); logger.info("JWT token from header: "); // Skip login and public endpoints @@ -88,39 +89,33 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo } try { - String jwtFromCookie = getJwtTokenFromCookies(request); - String jwtFromHeader = request.getHeader("JwtToken"); - String authHeader = request.getHeader("Authorization"); - - if (jwtFromCookie != null) { - logger.info("Validating JWT token from cookie"); - if (jwtAuthenticationUtil.validateUserIdAndJwtToken(jwtFromCookie)) { - filterChain.doFilter(servletRequest, servletResponse); - return; - } - } - - if (jwtFromHeader != null) { - logger.info("Validating JWT token from header"); - if (jwtAuthenticationUtil.validateUserIdAndJwtToken(jwtFromHeader)) { - filterChain.doFilter(servletRequest, servletResponse); - return; - } - } - String userAgent = request.getHeader("User-Agent"); - logger.info("User-Agent: " + userAgent); - - if (userAgent != null && isMobileClient(userAgent) && authHeader != null) { - filterChain.doFilter(servletRequest, servletResponse); - return; - } - - logger.warn("No valid authentication token found"); - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized: Invalid or missing token"); - + String jwtToken = getJwtTokenFromCookies(request); + String jwtFromHeader = request.getHeader(Constants.JWT_TOKEN); + String authHeader = request.getHeader("Authorization"); + + if ((jwtToken != null && jwtAuthenticationUtil.validateUserIdAndJwtToken(jwtToken)) || + (jwtFromHeader != null && jwtAuthenticationUtil.validateUserIdAndJwtToken(jwtFromHeader))) { + AuthorizationHeaderRequestWrapper authorizationHeaderRequestWrapper = new AuthorizationHeaderRequestWrapper(request, ""); + filterChain.doFilter(authorizationHeaderRequestWrapper, servletResponse); + return; + } else { + String userAgent = request.getHeader(Constants.USER_AGENT); + logger.info("User-Agent: " + userAgent); + if (userAgent != null && isMobileClient(userAgent) && authHeader != null) { + try { + UserAgentContext.setUserAgent(userAgent); + filterChain.doFilter(servletRequest, servletResponse); + } finally { + UserAgentContext.clear(); + } + return; + } + } + logger.warn("No valid authentication token found"); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized: Invalid or missing token"); } catch (Exception e) { - logger.error("Authorization error: ", e); - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authorization error: " + e.getMessage()); + logger.error("Authorization error: ", e); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authorization error: " + e.getMessage()); } } @@ -147,14 +142,14 @@ private boolean isMobileClient(String userAgent) { if (userAgent == null) return false; userAgent = userAgent.toLowerCase(); - return userAgent.contains("okhttp"); // iOS (custom clients) + return userAgent.contains(Constants.OKHTTP); } private String getJwtTokenFromCookies(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { - if (cookie.getName().equals("Jwttoken")) { + if (cookie.getName().equalsIgnoreCase(Constants.JWT_TOKEN)) { return cookie.getValue(); } } diff --git a/src/main/java/com/iemr/hwc/utils/RestTemplateUtil.java b/src/main/java/com/iemr/hwc/utils/RestTemplateUtil.java index eeac359f..0ead0e45 100644 --- a/src/main/java/com/iemr/hwc/utils/RestTemplateUtil.java +++ b/src/main/java/com/iemr/hwc/utils/RestTemplateUtil.java @@ -39,7 +39,8 @@ public static HttpEntity createRequestEntity(Object body, String authori headers.add(HttpHeaders.USER_AGENT, UserAgentContext.getUserAgent()); } headers.add(HttpHeaders.AUTHORIZATION, authorization); - headers.add("JwtToken",requestHeader.getHeader("JwtToken")); + if(null != requestHeader.getHeader(Constants.JWT_TOKEN)) + headers.add(Constants.JWT_TOKEN,requestHeader.getHeader(Constants.JWT_TOKEN)); if(null != jwtTokenFromCookie) { headers.add(HttpHeaders.COOKIE, "Jwttoken=" + jwtTokenFromCookie); } diff --git a/src/main/java/com/iemr/hwc/utils/http/HTTPRequestInterceptor.java b/src/main/java/com/iemr/hwc/utils/http/HTTPRequestInterceptor.java index 1513416c..69f471c3 100644 --- a/src/main/java/com/iemr/hwc/utils/http/HTTPRequestInterceptor.java +++ b/src/main/java/com/iemr/hwc/utils/http/HTTPRequestInterceptor.java @@ -124,7 +124,7 @@ public void postHandle(HttpServletRequest request, HttpServletResponse response, else authorization = postAuth; logger.debug("RequestURI::" + request.getRequestURI() + " || Authorization ::" + authorization); - if (authorization != null) { + if (authorization != null && !authorization.isEmpty()) { sessionObject.updateSessionObject(authorization, sessionObject.getSessionObject(authorization)); } } catch (Exception e) { From a996ef57f1a41c0f4982af2ecc117e9521a8c9af Mon Sep 17 00:00:00 2001 From: ravishanigarapu <133210792+ravishanigarapu@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:22:24 +0530 Subject: [PATCH 2/4] Prescription Template API not working (#139) * Update application.properties * Swagger changes * AMM-1456 : Skiped jwtToken validation if not present in Cookie or header from mobile request. * Jwtten and user-agent validation * null check * Constants added and null check * Empty check added * Optimized code * removed commented code * Exception Handled and Null conditions added * Coderabbit comments addressed --- .../controller/wo/LocationControllerWo.java | 6 +- .../service/choApp/CHOAppSyncServiceImpl.java | 165 ++++++++++-------- 2 files changed, 97 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/iemr/hwc/controller/wo/LocationControllerWo.java b/src/main/java/com/iemr/hwc/controller/wo/LocationControllerWo.java index 97ad555f..289d3fcb 100644 --- a/src/main/java/com/iemr/hwc/controller/wo/LocationControllerWo.java +++ b/src/main/java/com/iemr/hwc/controller/wo/LocationControllerWo.java @@ -198,19 +198,19 @@ public String updateGeolocationVillage(@RequestBody String requestObj) { public ResponseEntity getOutreachMasterForState(@PathVariable("stateID") Integer stateID) { logger.info("get Outreach programs for state with Id ..." + stateID); - OutputResponse outputResponse = new OutputResponse(); + OutputResponse response = new OutputResponse(); HttpStatus statusCode = HttpStatus.OK; MultiValueMap headers = new LinkedMultiValueMap<>(); headers.add("Content-Type", "application/json"); try { String resList = locationServiceImpl.getOutreachProgramsList(stateID); - outputResponse.setResponse(resList); + response.setResponse(resList); } catch (Exception e) { logger.error("Error while fetching outreach list for stateId" + stateID); response.setError(500, "Unable to fetch outreach list for stateId" + stateID + "Exception - " + e); statusCode = HttpStatus.INTERNAL_SERVER_ERROR; } - return new ResponseEntity<>(outputResponse.toStringWithSerializeNulls(), headers, statusCode); + return new ResponseEntity<>(response.toStringWithSerializeNulls(), headers, statusCode); } } \ No newline at end of file diff --git a/src/main/java/com/iemr/hwc/service/choApp/CHOAppSyncServiceImpl.java b/src/main/java/com/iemr/hwc/service/choApp/CHOAppSyncServiceImpl.java index 27b6219d..0065139a 100644 --- a/src/main/java/com/iemr/hwc/service/choApp/CHOAppSyncServiceImpl.java +++ b/src/main/java/com/iemr/hwc/service/choApp/CHOAppSyncServiceImpl.java @@ -604,36 +604,44 @@ public ResponseEntity savePrescriptionTemplatesToServer(List(outputResponse.toString(),headers,statusCode); } - @Override - public ResponseEntity savePrescriptionTemplatesToApp(Integer userID, String authorization) { - OutputResponse outputResponse = new OutputResponse(); - HttpStatus statusCode = HttpStatus.OK; - - MultiValueMap headers = new LinkedMultiValueMap<>(); - headers.add("Content-Type", "application/json"); - - List templateList = prescriptionTemplatesRepo.getPrescriptionTemplatesByUserID(userID); - - outputResponse.setResponse(new GsonBuilder().excludeFieldsWithoutExposeAnnotation().serializeNulls().create().toJson(templateList)); - - return new ResponseEntity<>(outputResponse.toStringWithSerializeNulls(),headers,statusCode); - } - - @Override - public ResponseEntity deletePrescriptionTemplates(Integer userID, Integer tempID) { - OutputResponse outputResponse = new OutputResponse(); - HttpStatus statusCode = HttpStatus.OK; - - MultiValueMap headers = new LinkedMultiValueMap<>(); - headers.add("Content-Type", "application/json"); - - prescriptionTemplatesRepo.deletePrescriptionTemplatesByUserIDAndTempID(userID, tempID); - - outputResponse.setResponse("Successfully deleted"); - - return new ResponseEntity<>(outputResponse.toString(),headers,statusCode); - } - + @Override + public ResponseEntity savePrescriptionTemplatesToApp(Integer userID, String authorization) { + OutputResponse outputResponse = new OutputResponse(); + HttpStatus statusCode = HttpStatus.OK; + + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", "application/json"); + try { + List templateList = prescriptionTemplatesRepo + .getPrescriptionTemplatesByUserID(userID); + outputResponse.setResponse(new GsonBuilder().excludeFieldsWithoutExposeAnnotation().serializeNulls() + .create().toJson(templateList)); + } catch (Exception e) { + logger.error("Error while fetching Prescription Templates userID : " + userID); + outputResponse.setError(500, "Unable to fetch Prescription Templates userID" + userID + "Exception - " + e); + statusCode = HttpStatus.INTERNAL_SERVER_ERROR; + + } + return new ResponseEntity<>(outputResponse.toStringWithSerializeNulls(), headers, statusCode); + } + + @Override + public ResponseEntity deletePrescriptionTemplates(Integer userID, Integer tempID) { + OutputResponse outputResponse = new OutputResponse(); + HttpStatus statusCode = HttpStatus.OK; + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", "application/json"); + try { + prescriptionTemplatesRepo.deletePrescriptionTemplatesByUserIDAndTempID(userID, tempID); + outputResponse.setResponse("Successfully deleted"); + } catch (Exception e) { + logger.error("Error while deleting Prescription Templates userID : " + userID + " tempID : " + tempID); + outputResponse.setError(500, "Unable to delete Prescription Templates userID : " + userID + " tempID " + + tempID + "Exception - " + e); + statusCode = HttpStatus.INTERNAL_SERVER_ERROR; + } + return new ResponseEntity<>(outputResponse.toString(), headers, statusCode); + } @Override public ResponseEntity createNewOutreachActivity(OutreachActivity activity, String authorization) { @@ -674,45 +682,60 @@ public ResponseEntity createNewOutreachActivity(OutreachActivity activit return new ResponseEntity<>(outputResponse.toString(),headers,statusCode); } - @Override - public ResponseEntity getActivitiesByUser(Integer userId, String authorization) { - OutputResponse outputResponse = new OutputResponse(); - HttpStatus statusCode = HttpStatus.OK; - - MultiValueMap headers = new LinkedMultiValueMap<>(); - headers.add("Content-Type", "application/json"); - - ArrayList activitiesObj = outreachActivityRepo.getActivitiesByUserID(userId); - - ArrayList activities = OutreachActivity.getActivitiesForUser(activitiesObj); - - outputResponse.setResponse(new GsonBuilder().excludeFieldsWithoutExposeAnnotation().serializeNulls().create().toJson(activities)); - - return new ResponseEntity<>(outputResponse.toStringWithSerializeNulls(),headers,statusCode); - } - - @Override - public ResponseEntity getActivityById(Integer activityId, String authorization) { - OutputResponse outputResponse = new OutputResponse(); - HttpStatus statusCode = HttpStatus.OK; - - MultiValueMap headers = new LinkedMultiValueMap<>(); - headers.add("Content-Type", "application/json"); - - OutreachActivity activity = outreachActivityRepo.findById(activityId).get(); - - if (activity != null && activity.getImg1Data() != null){ - String img1 = Base64.getEncoder().encodeToString(activity.getImg1Data()); - activity.setImg1(img1); - } - - if (activity != null && activity.getImg2Data() != null){ - String img2 = Base64.getEncoder().encodeToString(activity.getImg2Data()); - activity.setImg2(img2); - } - - outputResponse.setResponse(new GsonBuilder().excludeFieldsWithoutExposeAnnotation().serializeNulls().create().toJson(activity)); - - return new ResponseEntity<>(outputResponse.toStringWithSerializeNulls(),headers,statusCode); - } + @Override + public ResponseEntity getActivitiesByUser(Integer userId, String authorization) { + OutputResponse outputResponse = new OutputResponse(); + HttpStatus statusCode = HttpStatus.OK; + + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", "application/json"); + try { + ArrayList activitiesObj = outreachActivityRepo.getActivitiesByUserID(userId); + + ArrayList activities = OutreachActivity.getActivitiesForUser(activitiesObj); + + outputResponse.setResponse(new GsonBuilder().excludeFieldsWithoutExposeAnnotation().serializeNulls() + .create().toJson(activities)); + } catch (Exception e) { + logger.error("Encountered exception while fetching activity userId : " + userId); + outputResponse.setError(500, "Encountered exception while fetching activity. " + e); + statusCode = HttpStatus.INTERNAL_SERVER_ERROR; + } + return new ResponseEntity<>(outputResponse.toStringWithSerializeNulls(), headers, statusCode); + } + + @Override + public ResponseEntity getActivityById(Integer activityId, String authorization) { + OutputResponse outputResponse = new OutputResponse(); + HttpStatus statusCode = HttpStatus.OK; + + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", "application/json"); + try { + Optional activityOptional = outreachActivityRepo.findById(activityId); + if (activityOptional.isPresent()) { + OutreachActivity activity = activityOptional.get(); + if (activity.getImg1Data() != null) { + String img1 = Base64.getEncoder().encodeToString(activity.getImg1Data()); + activity.setImg1(img1); + } + + if (activity.getImg2Data() != null) { + String img2 = Base64.getEncoder().encodeToString(activity.getImg2Data()); + activity.setImg2(img2); + } + + outputResponse.setResponse(new GsonBuilder().excludeFieldsWithoutExposeAnnotation().serializeNulls() + .create().toJson(activity)); + }else { + outputResponse.setError(404, "Activity not found with ID : "+activityId); + statusCode = HttpStatus.NOT_FOUND; + } + } catch (Exception e) { + logger.error("Encountered exception while fetching activity activityId " + activityId); + outputResponse.setError(500, "Encountered exception while fetching activity. " + e); + statusCode = HttpStatus.INTERNAL_SERVER_ERROR; + } + return new ResponseEntity<>(outputResponse.toStringWithSerializeNulls(), headers, statusCode); + } } From 927e5b40d6b6fa2d8548977922bc70af98564535 Mon Sep 17 00:00:00 2001 From: ravishanigarapu <133210792+ravishanigarapu@users.noreply.github.com> Date: Fri, 18 Jul 2025 14:31:54 +0530 Subject: [PATCH 3/4] AMM-1473 NCDScreening confirmed API change (#144) * Update application.properties * Swagger changes * AMM-1456 : Skiped jwtToken validation if not present in Cookie or header from mobile request. * Jwtten and user-agent validation * null check * Constants added and null check * Empty check added * Optimized code * removed commented code * Exception Handled and Null conditions added * Coderabbit comments addressed * AMM-1473 --- .../iemr/hwc/service/ncdscreening/NCDScreeningServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/hwc/service/ncdscreening/NCDScreeningServiceImpl.java b/src/main/java/com/iemr/hwc/service/ncdscreening/NCDScreeningServiceImpl.java index a71dd78d..c7f58da6 100644 --- a/src/main/java/com/iemr/hwc/service/ncdscreening/NCDScreeningServiceImpl.java +++ b/src/main/java/com/iemr/hwc/service/ncdscreening/NCDScreeningServiceImpl.java @@ -1697,7 +1697,7 @@ public String fetchConfirmedScreeningDisease(Long beneficiaryRegId) throws IEMRE List resultSet = hypertensionScreeningRepo.fetchConfirmedScreening(beneficiaryRegId); if (resultSet != null && resultSet.size() > 0) { for (Object[] obj : resultSet) { - map.put("beneficiaryRegId", obj[0] != null ? ((BigInteger) obj[0]).longValue() : null); + map.put("beneficiaryRegId", obj[0] != null ? ((Long) obj[0]) : null); if (obj[1] != null && (Boolean) obj[1] == true) response.add("Diabetes Mellitus"); if (obj[2] != null && (Boolean) obj[2] == true) From f27f7be047b71c945c1148fbf5fcb83c158997e8 Mon Sep 17 00:00:00 2001 From: Helen Grace Karyamsetty <133211481+helenKaryamsetty@users.noreply.github.com> Date: Fri, 18 Jul 2025 18:43:16 +0530 Subject: [PATCH 4/4] fix(bug): added high_risk to worklist to show flw highrisk patients (#145) Co-authored-by: KA40094929 --- .../data/benFlowStatus/BeneficiaryFlowStatus.java | 5 +++++ .../benFlowStatus/BeneficiaryFlowStatusRepo.java | 14 ++++++++------ .../common/transaction/CommonNurseServiceImpl.java | 3 ++- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/iemr/hwc/data/benFlowStatus/BeneficiaryFlowStatus.java b/src/main/java/com/iemr/hwc/data/benFlowStatus/BeneficiaryFlowStatus.java index 581c8bd9..c99aeab0 100644 --- a/src/main/java/com/iemr/hwc/data/benFlowStatus/BeneficiaryFlowStatus.java +++ b/src/main/java/com/iemr/hwc/data/benFlowStatus/BeneficiaryFlowStatus.java @@ -296,6 +296,11 @@ public class BeneficiaryFlowStatus { @Column(name = "referred_visit_id") private Long referred_visit_id; + @Expose + @Column(name = "is_high_risk", insertable = false, updatable = false) + private Boolean is_high_risk; + + @Transient private I_bendemographics i_bendemographics; @Transient diff --git a/src/main/java/com/iemr/hwc/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java b/src/main/java/com/iemr/hwc/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java index 99717e9a..761db390 100644 --- a/src/main/java/com/iemr/hwc/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java +++ b/src/main/java/com/iemr/hwc/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java @@ -51,12 +51,14 @@ public interface BeneficiaryFlowStatusRepo extends CrudRepository getNurseWorklistNew( // @Param("providerServiceMapId") Integer providerServiceMapId, @Param("vanID") Integer vanID); - @Query("SELECT t from BeneficiaryFlowStatus t WHERE (t.nurseFlag = 1 OR t.nurseFlag = 100) AND (t.specialist_flag <> 100 OR t.specialist_flag is null) AND t.deleted = false " - + " AND Date(t.visitDate) >= Date(:fromDate) AND t.providerServiceMapId = :providerServiceMapId " - + " AND t.vanID = :vanID ORDER BY t.visitDate DESC ") - public ArrayList getNurseWorklistNew( - @Param("providerServiceMapId") Integer providerServiceMapId, @Param("vanID") Integer vanID, - @Param("fromDate") Timestamp fromDate); + @Query(value = "SELECT t.*, anc.is_high_risk as is_high_risk FROM i_ben_flow_outreach t " + + "INNER JOIN t_anc_visit anc ON t.beneficiary_id = anc.ben_id " + + "WHERE (t.nurse_flag = 1 OR t.nurse_flag = 100) " + + "AND (t.specialist_flag <> 100 OR t.specialist_flag IS NULL) " + "AND t.deleted = false " + + "AND DATE(t.created_date) >= DATE(:fromDate) " + "AND t.providerServiceMapId = :providerServiceMapId " + + "AND t.vanID = :vanID " + "ORDER BY t.created_date DESC", nativeQuery = true) + public ArrayList getNurseWorklistNew(@Param("providerServiceMapId") Integer providerServiceMapId, + @Param("vanID") Integer vanID, @Param("fromDate") Timestamp fromDate); // nurse worklist TC current date @Query("SELECT t from BeneficiaryFlowStatus t WHERE (t.specialist_flag != 0 AND t.specialist_flag != 100 AND t.specialist_flag is not null)" diff --git a/src/main/java/com/iemr/hwc/service/common/transaction/CommonNurseServiceImpl.java b/src/main/java/com/iemr/hwc/service/common/transaction/CommonNurseServiceImpl.java index 6224205b..cfb7e9b5 100644 --- a/src/main/java/com/iemr/hwc/service/common/transaction/CommonNurseServiceImpl.java +++ b/src/main/java/com/iemr/hwc/service/common/transaction/CommonNurseServiceImpl.java @@ -3541,9 +3541,10 @@ public String getNurseWorkListNew(Integer providerServiceMapId, Integer vanID) { else cal.add(Calendar.DAY_OF_YEAR, -7); long sevenDaysAgo = cal.getTimeInMillis(); + Timestamp fromDate = new Timestamp(sevenDaysAgo); ArrayList obj = beneficiaryFlowStatusRepo.getNurseWorklistNew(providerServiceMapId, - vanID, new Timestamp(sevenDaysAgo)); + vanID, fromDate); return new Gson().toJson(obj); }