in response-datastore/response-server-service/src/main/java/com/google/cloud/healthcare/fdamystudies/controller/ProcessActivityResponseController.java [117:431]
public ResponseEntity<?> processActivityResponseForParticipant(
@RequestBody ActivityResponseBean questionnaireActivityResponseBean,
@RequestHeader String userId,
HttpServletRequest request) {
logger.entry(String.format(BEGIN_REQUEST_LOG, request.getRequestURI()));
AuditLogEventRequest auditRequest = AuditEventMapper.fromHttpServletRequest(request);
Locale locale = request.getLocale();
auditRequest.setUserId(userId);
String applicationId = null;
String studyId = null;
String studyVersion = null;
String activityId = null;
String activityVersion = null;
String participantId = null;
String secureEnrollmentToken = null;
boolean savedResponseData = false;
try {
applicationId = questionnaireActivityResponseBean.getApplicationId();
studyId = questionnaireActivityResponseBean.getMetadata().getStudyId();
studyVersion = questionnaireActivityResponseBean.getMetadata().getStudyVersion();
activityId = questionnaireActivityResponseBean.getMetadata().getActivityId();
activityVersion = questionnaireActivityResponseBean.getMetadata().getVersion();
participantId = questionnaireActivityResponseBean.getParticipantId();
secureEnrollmentToken = questionnaireActivityResponseBean.getTokenIdentifier();
logger.debug(
"Input values are :\n Study Id: "
+ studyId
+ "\n Activity Id: "
+ activityId
+ "\n Activity Version: "
+ activityVersion);
logger.debug("DiscardFHIR : \n : " + appConfig.getDiscardFhirAfterDid());
logger.debug("EnableFHI : \n : " + appConfig.getEnableFhirApi());
if (StringUtils.isBlank(applicationId)
|| StringUtils.isBlank(secureEnrollmentToken)
|| StringUtils.isBlank(studyId)
|| StringUtils.isBlank(activityId)
|| StringUtils.isBlank(activityVersion)) {
logger.error(
"Input values are :\n Study Id: "
+ studyId
+ "\n Activity Id: "
+ activityId
+ "\n Activity Version: "
+ activityVersion);
ErrorBean errorBean =
AppUtil.dynamicResponse(
ErrorCode.EC_701.code(),
ErrorCode.EC_701.errorMessage(),
AppConstants.ERROR_STR,
ErrorCode.EC_701.errorMessage());
return new ResponseEntity<>(errorBean, HttpStatus.BAD_REQUEST);
}
auditRequest.setStudyId(studyId);
auditRequest.setParticipantId(participantId);
auditRequest.setUserId(userId);
auditRequest.setStudyVersion(studyVersion);
Map<String, String> activityMap = new HashedMap<>();
activityMap.put(ACTIVITY_TYPE, questionnaireActivityResponseBean.getType());
activityMap.put(ACTIVITY_ID, activityId);
activityMap.put(ACTIVITY_VERSION, activityVersion);
activityMap.put(RUN_ID, questionnaireActivityResponseBean.getMetadata().getActivityRunId());
responseServerAuditLogHelper.logEvent(ACTIVITY_RESPONSE_RECEIVED, auditRequest, activityMap);
// Check if participant is valid
ParticipantInfoEntity participantBo = new ParticipantInfoEntity();
participantBo.setTokenId(secureEnrollmentToken);
participantBo.setParticipantId(participantId);
if (participantService.isValidParticipant(participantBo)) {
// Get ActivityMetadata from the WCP - we map the metadata information to the activity
// response information to come up with a consolidated response object
StudyActivityMetadataRequestBean studyActivityMetadataRequestBean =
new StudyActivityMetadataRequestBean();
studyActivityMetadataRequestBean.setStudyId(studyId);
studyActivityMetadataRequestBean.setActivityId(activityId);
studyActivityMetadataRequestBean.setActivityVersion(activityVersion);
QuestionnaireActivityStructureBean activityMetadatFromWcp =
studyMetadataService.getStudyActivityMetadata(
applicationId, studyActivityMetadataRequestBean, auditRequest);
if (activityMetadatFromWcp == null) {
logger.error(
"Input values are :\n Study Id: "
+ studyId
+ "\n Activity Id: "
+ activityId
+ "\n Activity Version: "
+ activityVersion);
Map<String, String> receiptMap = new HashedMap<>();
receiptMap.put(
"questionnaire_or_active_task", questionnaireActivityResponseBean.getType());
receiptMap.put(ACTIVITY_ID, activityId);
receiptMap.put(ACTIVITY_VERSION, activityVersion);
receiptMap.put(
RUN_ID, questionnaireActivityResponseBean.getMetadata().getActivityRunId());
responseServerAuditLogHelper.logEvent(
ACTIVITY_RESPONSE_RECEIPT_FAILED, auditRequest, receiptMap);
Map<String, String> map = new HashedMap<>();
map.put(ACTIVITY_TYPE, questionnaireActivityResponseBean.getType());
map.put(ACTIVITY_ID, activityId);
map.put(ACTIVITY_VERSION, activityVersion);
responseServerAuditLogHelper.logEvent(
ACTIVTY_METADATA_RETRIEVAL_FAILED, auditRequest, map);
map.put(RUN_ID, questionnaireActivityResponseBean.getMetadata().getActivityRunId());
responseServerAuditLogHelper.logEvent(
ACTIVITY_RESPONSE_DATA_PROCESSING_FAILED, auditRequest, map);
ErrorBean errorBean =
AppUtil.dynamicResponse(
ErrorCode.EC_705.code(),
ErrorCode.EC_705.errorMessage(),
AppConstants.ERROR_STR,
ErrorCode.EC_705.errorMessage());
return new ResponseEntity<>(errorBean, HttpStatus.BAD_REQUEST);
}
Map<String, String> map = new HashedMap<>();
map.put(ACTIVITY_TYPE, questionnaireActivityResponseBean.getType());
map.put(ACTIVITY_ID, activityId);
map.put(ACTIVITY_VERSION, activityVersion);
responseServerAuditLogHelper.logEvent(ACTIVTY_METADATA_RETRIEVED, auditRequest, map);
// Get ParticipantStudyInfo from Registration Server
String flag = appConfig.getEnableConsentManagementAPI();
ParticipantStudyInformation partStudyInfo =
!StringUtils.isEmpty(flag) && Boolean.valueOf(flag)
? partStudyInfoService.getParticipantStudyInfoFromConsent(
studyId, participantId, auditRequest)
: partStudyInfoService.getParticipantStudyInfo(
studyId, participantId, auditRequest);
if (partStudyInfo == null) {
logger.error("GetParticipantStudyInfo() - ParticipantInfo is null. Study Id: " + studyId);
responseServerAuditLogHelper.logEvent(
DATA_SHARING_CONSENT_VALUE_RETRIEVAL_FAILED, auditRequest);
responseServerAuditLogHelper.logEvent(
WITHDRAWAL_INFORMATION_RETREIVAL_FAILED, auditRequest);
ErrorBean errorBean =
AppUtil.dynamicResponse(
ErrorCode.EC_715.code(),
ErrorCode.EC_715.errorMessage(),
AppConstants.ERROR_STR,
ErrorCode.EC_715.errorMessage());
return new ResponseEntity<>(errorBean, HttpStatus.BAD_REQUEST);
}
String sharingConsent = partStudyInfo.getSharing();
Map<String, String> consentMap = new HashedMap<>();
consentMap.put("datasharing_consent_value", sharingConsent);
responseServerAuditLogHelper.logEvent(
DATA_SHARING_CONSENT_VALUE_RETRIEVED, auditRequest, consentMap);
questionnaireActivityResponseBean.setSharingConsent(sharingConsent);
Map<String, String> sharingMap = new HashedMap<>();
sharingMap.put(ACTIVITY_TYPE, questionnaireActivityResponseBean.getType());
sharingMap.put(ACTIVITY_ID, activityId);
sharingMap.put(ACTIVITY_VERSION, activityVersion);
sharingMap.put(RUN_ID, questionnaireActivityResponseBean.getMetadata().getActivityRunId());
responseServerAuditLogHelper.logEvent(
DATA_SHARING_CONSENT_VALUE_CONJOINED_WITH_ACTIVITY_RESPONSE_DATA,
auditRequest,
sharingMap);
boolean withdrawalStatus = !StringUtils.isBlank(partStudyInfo.getWithdrawal());
Map<String, String> withdrawMap = new HashedMap<>();
withdrawMap.put("withdrawn_status", String.valueOf(withdrawalStatus));
responseServerAuditLogHelper.logEvent(
WITHDRAWAL_INFORMATION_RETRIEVED, auditRequest, withdrawMap);
if (!withdrawalStatus) {
activityResponseProcessorService.saveActivityResponseDataForParticipant(
activityMetadatFromWcp, questionnaireActivityResponseBean, auditRequest, locale);
savedResponseData = true;
// Update Participant Activity State
ActivityStateRequestBean activityStateRequestBean = new ActivityStateRequestBean();
activityStateRequestBean.setParticipantId(participantId);
activityStateRequestBean.setStudyId(studyId);
ParticipantActivityBean participantActivityBean = new ParticipantActivityBean();
participantActivityBean.setActivityId(activityId);
participantActivityBean.setActivityVersion(activityVersion);
participantActivityBean.setActivityState(AppConstants.COMPLETED);
if (questionnaireActivityResponseBean.getActivityRun() != null) {
ActivityRunBean activityRun = new ActivityRunBean();
activityRun.setCompleted(
questionnaireActivityResponseBean.getActivityRun().getCompleted());
activityRun.setMissed(questionnaireActivityResponseBean.getActivityRun().getMissed());
activityRun.setTotal(questionnaireActivityResponseBean.getActivityRun().getTotal());
participantActivityBean.setActivityRun(activityRun);
}
List<ParticipantActivityBean> activity = new ArrayList<>();
activity.add(participantActivityBean);
activityStateRequestBean.setActivity(activity);
participantActivityStateResponseService.saveParticipantActivities(
activityStateRequestBean);
Map<String, String> activityStateMap = new HashedMap<>();
activityStateMap.put("activity_state", participantActivityBean.getActivityState());
activityStateMap.put(ACTIVITY_ID, activityId);
activityStateMap.put(ACTIVITY_VERSION, activityVersion);
activityStateMap.put(
RUN_ID, questionnaireActivityResponseBean.getMetadata().getActivityRunId());
responseServerAuditLogHelper.logEvent(
ACTIVITY_STATE_SAVED_OR_UPDATED_AFTER_RESPONSE_SUBMISSION,
auditRequest,
activityStateMap);
SuccessResponseBean srBean = new SuccessResponseBean();
srBean.setMessage(AppConstants.SUCCESS_MSG);
Map<String, String> activityResponseMap = new HashedMap<>();
activityResponseMap.put(ACTIVITY_TYPE, questionnaireActivityResponseBean.getType());
activityResponseMap.put(ACTIVITY_ID, activityId);
activityResponseMap.put(ACTIVITY_VERSION, activityVersion);
activityResponseMap.put(
RUN_ID, questionnaireActivityResponseBean.getMetadata().getActivityRunId());
responseServerAuditLogHelper.logEvent(
ACTIVITY_RESPONSE_SAVED, auditRequest, activityResponseMap);
return new ResponseEntity<>(srBean, HttpStatus.OK);
} else {
ErrorBean errorBean =
AppUtil.dynamicResponse(
ErrorCode.EC_716.code(),
ErrorCode.EC_716.errorMessage(),
AppConstants.ERROR_STR,
"Could not save response for withdrawn participant.\n Study Id: "
+ studyId
+ "\n Activity Id: "
+ activityId
+ "\n Activity Version: "
+ activityVersion
+ "\n Particpant Id: "
+ participantId);
Map<String, String> notSaveMap = new HashedMap<>();
notSaveMap.put(ACTIVITY_TYPE, questionnaireActivityResponseBean.getType());
notSaveMap.put(ACTIVITY_ID, activityId);
notSaveMap.put(ACTIVITY_VERSION, activityVersion);
notSaveMap.put(
"submission_timestamp", questionnaireActivityResponseBean.getCreatedTimestamp());
responseServerAuditLogHelper.logEvent(
ACTIVITY_RESPONSE_NOT_SAVED, auditRequest, notSaveMap);
logger.error(
"Could not save response for withdrawn participant.\n Study Id: "
+ studyId
+ "\n Activity Id: "
+ activityId
+ "\n Activity Version: "
+ activityVersion);
return new ResponseEntity<>(errorBean, HttpStatus.BAD_REQUEST);
}
} else {
ErrorBean errorBean =
AppUtil.dynamicResponse(
ErrorCode.EC_706.code(),
ErrorCode.EC_706.errorMessage(),
AppConstants.ERROR_STR,
"Could not save response for invalid participant.\n Study Id: "
+ studyId
+ "\n Activity Id: "
+ activityId
+ "\n Activity Version: "
+ activityVersion
+ "\n Particpant Id: "
+ participantId);
logger.error(
"Could not save response for invalid participant.\n Study Id: "
+ studyId
+ "\n Activity Id: "
+ activityId
+ "\n Activity Version: "
+ activityVersion);
return new ResponseEntity<>(errorBean, HttpStatus.BAD_REQUEST);
}
} catch (Exception e) {
if (!savedResponseData) {
ErrorBean errorBean =
AppUtil.dynamicResponse(
ErrorCode.EC_707.code(),
ErrorCode.EC_707.errorMessage(),
AppConstants.ERROR_STR,
e.getMessage());
logger.error(
"An error occured while saving response for participant.\n Study Id: "
+ studyId
+ "\n Activity Id: "
+ activityId
+ "\n Activity Version: "
+ activityVersion);
responseServerAuditLogHelper.logEvent(PARTICIPANT_ID_INVALID, auditRequest);
return new ResponseEntity<>(errorBean, HttpStatus.BAD_REQUEST);
} else {
ErrorBean errorBean =
AppUtil.dynamicResponse(
ErrorCode.EC_714.code(),
ErrorCode.EC_714.errorMessage(),
AppConstants.ERROR_STR,
e.getMessage());
logger.error(
"Could not update participant activity data for participant.\n Study Id: "
+ studyId
+ "\n Activity Id: "
+ activityId
+ "\n Activity Version: "
+ activityVersion);
return new ResponseEntity<>(errorBean, HttpStatus.BAD_REQUEST);
}
}
}