Skip to content

Commit

Permalink
Convert the response to a simple object
Browse files Browse the repository at this point in the history
  • Loading branch information
jayasanka-sack committed Oct 25, 2024
1 parent 612175d commit 0828b67
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 70 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.openmrs.module.emrapi.db;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.openmrs.Diagnosis;
import org.openmrs.Patient;
Expand All @@ -25,20 +26,22 @@ public class HibernateVisitDAO implements VisitDAO {
public List<VisitWithDiagnoses> getVisitsByPatientId(Patient patient, int startIndex, int limit) {

String visitNoteEncounterTypeUuid = "d7151f82-c1f3-4152-a605-2f9ea7414a79";



String hqlVisit="SELECT DISTINCT v FROM Visit v " +
"JOIN FETCH v.encounters enc " +
"JOIN enc.encounterType et " +
"WHERE v.patient.id = :patientId " +
"AND et.uuid = :encounterTypeUuid " +
"ORDER BY v.startDatetime DESC "+
"LIMIT :startIndex, :limit";
"ORDER BY v.startDatetime DESC";

Query visitQuery = sessionFactory.getCurrentSession().createQuery(hqlVisit);

visitQuery.setParameter("patientId", patient.getId());
visitQuery.setParameter("encounterTypeUuid", visitNoteEncounterTypeUuid);
visitQuery.setFirstResult(startIndex);
visitQuery.setMaxResults(limit);

List<Visit> visits = sessionFactory.getCurrentSession()
.createQuery(hqlVisit)
.setParameter("patientId", patient.getId())
.setParameter("encounterTypeUuid", visitNoteEncounterTypeUuid).list();
List<Visit> visits = visitQuery.list();

String hqlDiagnosis = "SELECT DISTINCT diag FROM Diagnosis diag " +
"JOIN diag.encounter e " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@ public VisitWithDiagnoses(Visit visit, Set<Diagnosis> diagnoses) {
this.setStartDatetime(visit.getStartDatetime());
this.setStopDatetime(visit.getStopDatetime());
this.setEncounters(visit.getEncounters());
this.uuid = visit.getUuid();
this.diagnoses = diagnoses;
}

private String uuid;
private Set<Diagnosis> diagnoses;


Expand Down
16 changes: 14 additions & 2 deletions api/src/test/java/org/openmrs/module/emrapi/db/VisitDAOTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ public class VisitDAOTest extends EmrApiContextSensitiveTest {

@Before
public void setup() {
// executeDataSet("baseMetaData.xml");
executeDataSet("pastVisitSetup.xml");
}

Expand All @@ -33,7 +32,7 @@ public void shouldFetchVisitsByPatientId() {
Patient patient = new Patient();
patient.setPatientId(109);

List<VisitWithDiagnoses> visits = visitDAO.getVisitsByPatientId(patient);
List<VisitWithDiagnoses> visits = visitDAO.getVisitsByPatientId(patient,0,10);
assertNotNull(visits);
assert visits.size() == 2;

Expand Down Expand Up @@ -63,5 +62,18 @@ public void shouldFetchVisitsByPatientId() {
assert encounter.getEncounterType().getUuid().equals(visitNoteEncounterTypeUuid);
}
}

@Test
public void shouldFetchVisitsByPatientIdWithPagination() {
Patient patient = new Patient();
patient.setPatientId(109);

List<VisitWithDiagnoses> visits = visitDAO.getVisitsByPatientId(patient,0,1);
assertNotNull(visits);
assert visits.size() == 1;

VisitWithDiagnoses mostRecentVisit = visits.get(0);
assert mostRecentVisit.getId() == 1015;
}

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package org.openmrs.module.emrapi.web.controller;

import org.hibernate.ObjectNotFoundException;
import org.openmrs.Diagnosis;
import org.openmrs.module.emrapi.visit.VisitWithDiagnoses;
import org.openmrs.module.emrapi.visit.VisitWithDiagnosesService;
import org.openmrs.module.webservices.rest.SimpleObject;
import org.openmrs.module.webservices.rest.web.ConversionUtil;
import org.openmrs.module.webservices.rest.web.RequestContext;
import org.openmrs.module.webservices.rest.web.RestUtil;
import org.openmrs.module.webservices.rest.web.representation.Representation;
Expand All @@ -17,6 +20,7 @@

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

@Controller
Expand All @@ -32,13 +36,20 @@ public ResponseEntity<?> getVisitsByPatientId(
@PathVariable String patientUuid) {
RequestContext context = RestUtil.getRequestContext(request, response, Representation.DEFAULT);
List<VisitWithDiagnoses> visits;
try {
visits = visitWithDiagnosesService.getVisitsByPatientId(patientUuid, context.getStartIndex(), context.getLimit());
}
catch (ObjectNotFoundException e) {
return ResponseEntity.badRequest().body(e.getMessage());
visits = visitWithDiagnosesService.getVisitsByPatientId(patientUuid, context.getStartIndex(), context.getLimit());

List<SimpleObject> convertedVisits = new ArrayList<>();

for (VisitWithDiagnoses visit : visits) {
SimpleObject visitObject = (SimpleObject) ConversionUtil.convertToRepresentation(visit, context.getRepresentation());
List<SimpleObject> convertedDiagnoses = new ArrayList<>();
for (Diagnosis diagnosis : visit.getDiagnoses()) {
convertedDiagnoses.add((SimpleObject) ConversionUtil.convertToRepresentation(diagnosis, context.getRepresentation()));
}
visitObject.put("diagnoses", convertedDiagnoses);
convertedVisits.add(visitObject);
}

return new ResponseEntity<>(new NeedsPaging<>(visits, context), HttpStatus.OK);
return new ResponseEntity<>(new NeedsPaging<>(convertedVisits, context), HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
@@ -1,88 +1,119 @@
package org.openmrs.module.emrapi.web.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.Diagnosis;
import org.openmrs.Encounter;
import org.openmrs.api.PatientService;
import org.openmrs.module.emrapi.visit.VisitWithDiagnoses;
import org.openmrs.module.emrapi.visit.VisitWithDiagnosesService;
import org.junit.runner.RunWith;
import org.openmrs.web.test.BaseModuleWebContextSensitiveTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import java.util.List;
import java.util.Set;
import java.util.Map;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class VisitControllerTest extends BaseModuleWebContextSensitiveTest {

@Autowired
VisitController visitController;

@Autowired
VisitWithDiagnosesService customVisitService;


@Autowired
PatientService patientService;


private WebApplicationContext webApplicationContext;

private MockMvc mockMvc;

@Before
public void setUp() throws Exception {
executeDataSet("baseMetaData.xml");
executeDataSet("pastVisitSetup.xml");
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();

}

@Test
public void shouldGetVisitsByPatientId() {
public void shouldGetVisitsByPatientId() throws Exception {

String visitNoteEncounterTypeUuid = "d7151f82-c1f3-4152-a605-2f9ea7414a79";
String patientUuid = "8604d42e-3ca8-11e3-bf2b-0d0c09861e97";

ResponseEntity<List<VisitWithDiagnoses>> visitsResponse = (ResponseEntity<List<VisitWithDiagnoses>>)
visitController.getVisitsByPatientId(patientUuid);
assertNotNull(visitsResponse);

List<VisitWithDiagnoses> visits = visitsResponse.getBody();

assertNotNull(visits);
String firstVisitUuid = "1esd5218-6b78-11e0-93c3-18a905e044dc";
String secondVisitUuid = "1c72e1ac-9b18-11e0-93c3-18a905e044dc";

// extract the response from the mockMvc

MvcResult response = mockMvc.perform(get("/rest/v1/emrapi/patient/" + patientUuid + "/visit")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andReturn();

String jsonResponse = response.getResponse().getContentAsString();
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> result = objectMapper.readValue(jsonResponse, Map.class);

assertNotNull(result);
assert result.get("totalCount").equals(2);

List<Map<String, Object>> visits = (List<Map<String, Object>>) result.get("pageOfResults");
assert visits.size() == 2;

VisitWithDiagnoses firstVisit = visits.get(1);
Set<Encounter> firstVisitEncounters = firstVisit.getEncounters();
Set<Diagnosis> firstVisitDiagnoses = firstVisit.getDiagnoses();

assert firstVisit.getId() == 1014;
assertEquals(firstVisit.getPatient().getUuid(), patientUuid);
// extract the first visit and check its properties
Map<String, Object> firstVisit = visits.get(1);
List<Map<String, Object>> firstVisitEncounters = (List<Map<String, Object>>) firstVisit.get("encounters");
List<Map<String, Object>> firstVisitDiagnoses = (List<Map<String, Object>>) firstVisit.get("diagnoses");

assert firstVisit.get("uuid").equals(firstVisitUuid);
assert firstVisitEncounters.size() == 2;
assert firstVisitDiagnoses.size() == 3;

for (Encounter encounter : firstVisitEncounters) {
assert encounter.getEncounterType().getUuid().equals(visitNoteEncounterTypeUuid);
for (Map<String, Object> encounter : firstVisitEncounters) {
assert ((String) encounter.get("display")).startsWith("Visit Note");
}

VisitWithDiagnoses secondVisit = visits.get(0);
Set<Encounter> secondVisitEncounters = secondVisit.getEncounters();
Set<Diagnosis> secondVisitDiagnoses = secondVisit.getDiagnoses();

assert secondVisit.getId() == 1015;
assertEquals(secondVisit.getPatient().getUuid(), patientUuid);
// extract the second visit and check its properties
Map<String, Object> secondVisit = visits.get(0);
List<Map<String, Object>> secondVisitEncounters = (List<Map<String, Object>>) secondVisit.get("encounters");
List<Map<String, Object>> secondVisitDiagnoses = (List<Map<String, Object>>) secondVisit.get("diagnoses");

assert secondVisit.get("uuid").equals(secondVisitUuid);
assert secondVisitEncounters.size() == 1;
assert secondVisitDiagnoses.size() == 2;

for (Encounter encounter : secondVisitEncounters) {
assert encounter.getEncounterType().getUuid().equals(visitNoteEncounterTypeUuid);
for (Map<String, Object> encounter : secondVisitEncounters) {
assert ((String) encounter.get("display")).startsWith("Visit Note");
}

}

@Test
public void shouldThrowExceptionWhenPatientUuidIsInvalid() {
String invalidPatientUuid = "invalid-uuid";
ResponseEntity<?> visitsResponse = visitController.getVisitsByPatientId(invalidPatientUuid);
assertNotNull(visitsResponse);
assert visitsResponse.getStatusCode().is4xxClientError();
public void shouldGetVisitsByPatientIdWithPagination() throws Exception {

String patientUuid = "8604d42e-3ca8-11e3-bf2b-0d0c09861e97";
String mostRecentVisitUuid = "1c72e1ac-9b18-11e0-93c3-18a905e044dc";

MvcResult response = mockMvc.perform(get("/rest/v1/emrapi/patient/" + patientUuid + "/visit")
.param("startIndex", "0")
.param("limit", "1")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andReturn();

String jsonResponse = response.getResponse().getContentAsString();
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> result = objectMapper.readValue(jsonResponse, Map.class);

assertNotNull(result);
assert result.get("totalCount").equals(1);

List<Map<String, Object>> visits = (List<Map<String, Object>>) result.get("pageOfResults");
assert visits.size() == 1;

Map<String, Object> recentVisit = visits.get(0);
assert recentVisit.get("uuid").equals(mostRecentVisitUuid);
}
}

0 comments on commit 0828b67

Please sign in to comment.