use of org.hl7.gravity.refimpl.sdohexchange.dto.response.GoalDto in project Gravity-SDOH-Exchange-RI by FHIR.
the class GoalBundleToDtoConverter method convert.
@Override
public List<GoalDto> convert(Bundle bundle) {
List<GoalDto> result = FhirUtil.getFromBundle(bundle, Goal.class).stream().map(goal -> {
GoalDto goalDto = new GoalDto();
goalDto.setId(goal.getIdElement().getIdPart());
if (goal.hasDescription() && goal.getDescription().hasText()) {
goalDto.setName(goal.getDescription().getText());
} else {
goalDto.getErrors().add("Goal description.text not found. Name cannot be set.");
}
if (goal.hasAchievementStatus()) {
goalDto.setAchievementStatus(GoalAchievement.fromCode(goal.getAchievementStatus().getCodingFirstRep().getCode()));
} else {
goalDto.getErrors().add("No achievement status available.");
}
// TODO reused from HealthConcernBundleToDtoConverter class. Refactor!
Coding categoryCoding = FhirUtil.findCoding(goal.getCategory(), SDOHMappings.getInstance().getSystem());
// TODO remove this in future. Fow now two different categories might be used before discussed.
if (categoryCoding == null) {
categoryCoding = FhirUtil.findCoding(goal.getCategory(), "http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes");
}
if (categoryCoding == null) {
goalDto.getErrors().add("SDOH category is not found.");
} else {
goalDto.setCategory(new CodingDto(categoryCoding.getCode(), categoryCoding.getDisplay()));
}
Optional<Coding> snomedCodeCodingOptional = findCode(goal.getDescription(), System.SNOMED);
if (snomedCodeCodingOptional.isPresent()) {
Coding snomedCodeCoding = snomedCodeCodingOptional.get();
goalDto.setSnomedCode(new CodingDto(snomedCodeCoding.getCode(), snomedCodeCoding.getDisplay()));
} else {
goalDto.getErrors().add("SNOMED-CT code is not found.");
}
if (goal.hasExpressedBy()) {
Reference expressedBy = goal.getExpressedBy();
goalDto.setAddedBy(new ReferenceDto(expressedBy.getReferenceElement().getIdPart(), expressedBy.getDisplay()));
} else {
goalDto.getErrors().add("Goal expressedBy property is missing. addedBy will be null.");
}
goalDto.setStartDate(FhirUtil.toLocalDate(goal.getStartDateType()));
// TODO this is invalid. To clarify!
if (goal.getLifecycleStatus() == Goal.GoalLifecycleStatus.COMPLETED) {
if (goal.hasStatusDate()) {
goalDto.setEndDate(FhirUtil.toLocalDate(goal.getStatusDateElement()));
} else {
goalDto.getErrors().add("Goal statusDate must be set when the lifecycleStatus is COMPLETED. endDate will be null.");
}
}
goalDto.setComments(goal.getNote().stream().map(annotationToDtoConverter::convert).collect(Collectors.toList()));
goalDto.setProblems(goal.getAddresses().stream().filter(ref -> Condition.class.getSimpleName().equals(ref.getReferenceElement().getResourceType())).map(ref -> (Condition) ref.getResource()).map(cond -> new ConditionDto(cond.getIdElement().getIdPart(), codeableConceptToStringConverter.convert(cond.getCode()))).collect(Collectors.toList()));
return goalDto;
}).collect(Collectors.toList());
// TODO refactor. method too long.
// TODO refactor. Almost the same fragmen exists in a ProblemInfoBundleExtractor
Map<String, GoalDto> idToDtoMap = result.stream().collect(Collectors.toMap(g -> g.getId(), Function.identity()));
for (Task task : FhirUtil.getFromBundle(bundle, Task.class)) {
if (!task.hasFocus() || !(task.getFocus().getResource() instanceof ServiceRequest)) {
continue;
}
ServiceRequest sr = (ServiceRequest) task.getFocus().getResource();
sr.getSupportingInfo().stream().filter(ref -> Goal.class.getSimpleName().equals(ref.getReferenceElement().getResourceType()) && idToDtoMap.containsKey(ref.getReferenceElement().getIdPart())).forEach(ref -> idToDtoMap.get(ref.getReferenceElement().getIdPart()).getTasks().add(new TaskInfoDto(task.getIdElement().getIdPart(), task.getDescription(), task.getStatus())));
}
return result;
}
use of org.hl7.gravity.refimpl.sdohexchange.dto.response.GoalDto in project Gravity-SDOH-Exchange-RI by FHIR.
the class GoalService method create.
public GoalDto create(NewGoalDto newGoalDto, UserDto user) {
Assert.notNull(SmartOnFhirContext.get().getPatient(), "Patient id cannot be null.");
GoalPrepareBundleFactory goalPrepareBundleFactory = new GoalPrepareBundleFactory(SmartOnFhirContext.get().getPatient(), user.getId(), newGoalDto.getProblemIds());
Bundle goalRelatedResources = ehrClient.transaction().withBundle(goalPrepareBundleFactory.createPrepareBundle()).execute();
GoalPrepareBundleExtractor.GoalPrepareInfoHolder goalPrepareInfoHolder = new GoalPrepareBundleExtractor().extract(goalRelatedResources);
GoalBundleFactory bundleFactory = new GoalBundleFactory();
bundleFactory.setName(newGoalDto.getName());
String category = newGoalDto.getCategory();
bundleFactory.setCategory(sdohMappings.findCategoryCoding(category));
bundleFactory.setSnomedCode(sdohMappings.findCoding(category, Goal.class, System.SNOMED, newGoalDto.getSnomedCode()));
bundleFactory.setAchievementStatus(newGoalDto.getAchievementStatus());
bundleFactory.setPatient(goalPrepareInfoHolder.getPatient());
bundleFactory.setPractitioner(goalPrepareInfoHolder.getPractitioner());
bundleFactory.setUser(user);
bundleFactory.setComment(newGoalDto.getComment());
bundleFactory.setProblems(goalPrepareInfoHolder.getProblems(newGoalDto.getProblemIds()));
bundleFactory.setStartDate(newGoalDto.getStart());
Bundle goalCreateBundle = ehrClient.transaction().withBundle(bundleFactory.createPrepareBundle()).execute();
IdType goalId = FhirUtil.getFromResponseBundle(goalCreateBundle, Goal.class);
Bundle responseBundle = searchGoalQuery(Goal.GoalLifecycleStatus.ACTIVE).where(Condition.RES_ID.exactly().code(goalId.getIdPart())).returnBundle(Bundle.class).execute();
Bundle merged = addConditionsToGoalBundle(responseBundle);
return new GoalBundleToDtoConverter().convert(merged).stream().findFirst().orElseThrow(() -> new HealthConcernCreateException("goal is not found in the response bundle."));
}
use of org.hl7.gravity.refimpl.sdohexchange.dto.response.GoalDto in project Gravity-SDOH-Exchange-RI by FHIR.
the class GoalService method listCompleted.
public List<GoalDto> listCompleted() {
Assert.notNull(SmartOnFhirContext.get().getPatient(), "Patient id cannot be null.");
Bundle responseBundle = searchGoalQuery(Goal.GoalLifecycleStatus.COMPLETED).returnBundle(Bundle.class).execute();
responseBundle = addConditionsToGoalBundle(responseBundle);
responseBundle = addTasksAndSRsToGoalBundle(responseBundle);
return new GoalBundleToDtoConverter().convert(responseBundle);
}
use of org.hl7.gravity.refimpl.sdohexchange.dto.response.GoalDto in project Gravity-SDOH-Exchange-RI by FHIR.
the class GoalService method listActive.
public List<GoalDto> listActive() {
Assert.notNull(SmartOnFhirContext.get().getPatient(), "Patient id cannot be null.");
Bundle responseBundle = searchGoalQuery(Goal.GoalLifecycleStatus.ACTIVE).returnBundle(Bundle.class).execute();
responseBundle = addConditionsToGoalBundle(responseBundle);
responseBundle = addTasksAndSRsToGoalBundle(responseBundle);
return new GoalBundleToDtoConverter().convert(responseBundle);
}
Aggregations