@Transactional(propagation = Propagation.REQUIRED)
  public Patient savePatient(Patient patient) throws ParseException {
    UserDetailEntity patientEntity = userDetailMapper.patientToUserDetailEntity(patient);

    if (patientEntity.getId() != null) {
      patientEntity = userDetailRepository.save(patientEntity);
    } else {
      UserCredentialsEntity userCredentialsEntity = new UserCredentialsEntity();
      userCredentialsEntity.setRoleId(roleRepository.findByRole("PATIENT").getId());
      userCredentialsEntity = userCredentialsRepository.save(userCredentialsEntity);

      patientEntity.setId(userCredentialsEntity.getId());
      patientEntity = userDetailRepository.save(patientEntity);

      UserDetailEntity doctor =
          userDetailRepository.findOne(iamService.getAuthenticatedUser().getId());
      DoctorPatientMappingId doctorPatientMappingId =
          new DoctorPatientMappingId(doctor.getId(), patientEntity.getId());
      DoctorPatientMappingEntity doctorPatientMappingEntity =
          new DoctorPatientMappingEntity(doctorPatientMappingId);

      doctorPatientMappingRepository.save(doctorPatientMappingEntity);
    }
    return userDetailMapper.userDetailEntityToPatient(patientEntity);
  }
  // TODO service should throw appropriate exception to controller, like not found for null pointer.
  public List<Patient> getAllPatient(
      final Integer pageNumber, final Integer pageSize, final Boolean loadTreatment) {

    Pageable pageable =
        new PageRequest(calculatePageNumber(pageNumber), calculatePageSize(pageSize));
    UserCredentialsEntity doctor = iamService.getAuthenticatedUser();
    Page<UserDetailEntity> userDetailEntities =
        userDetailRepository.findAllPatientOfLoggedInDoctor(doctor.getId(), pageable);

    List<Patient> patients = userDetailMapper.userDetailEntitiesToPatients(userDetailEntities);

    if (loadTreatment) {
      patients = loadTreatments(patients);
    }

    return patients;
  }