public ResponseEntity processActivityResponseForParticipant()

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);
      }
    }
  }