diff --git a/omod-2.0/pom.xml b/omod-2.0/pom.xml index 42de0aba..61599771 100644 --- a/omod-2.0/pom.xml +++ b/omod-2.0/pom.xml @@ -16,7 +16,7 @@ ${openMRS2_0Version} 1.19 - 2.17 + 2.21.0 0.10.4 0.2.12 @@ -110,7 +110,7 @@ org.openmrs.module - webservices.rest-omod + webservices.rest-omod-common ${webservices.restVersion} provided diff --git a/omod-2.0/src/main/java/org/openmrs/module/attachments/rest/AttachmentResource2_0.java b/omod-2.0/src/main/java/org/openmrs/module/attachments/rest/AttachmentResource2_0.java index bd0e0e45..22b355c4 100644 --- a/omod-2.0/src/main/java/org/openmrs/module/attachments/rest/AttachmentResource2_0.java +++ b/omod-2.0/src/main/java/org/openmrs/module/attachments/rest/AttachmentResource2_0.java @@ -1,17 +1,169 @@ package org.openmrs.module.attachments.rest; - +import java.util.Arrays; +import java.util.List; +import org.hibernate.FlushMode; +import org.openmrs.Obs; import org.openmrs.api.context.Context; -import org.openmrs.module.attachments.AttachmentsService; +import org.openmrs.module.attachments.AttachmentsConstants; import org.openmrs.module.attachments.obs.Attachment; +import org.openmrs.module.emrapi.db.DbSessionUtil; +import org.openmrs.module.webservices.rest.web.RequestContext; +import org.openmrs.module.attachments.AttachmentsService; import org.openmrs.module.webservices.rest.web.RestConstants; import org.openmrs.module.webservices.rest.web.annotation.Resource; +import org.openmrs.module.webservices.rest.web.representation.DefaultRepresentation; +import org.openmrs.module.webservices.rest.web.representation.FullRepresentation; +import org.openmrs.module.webservices.rest.web.representation.RefRepresentation; +import org.openmrs.module.webservices.rest.web.representation.Representation; +import org.openmrs.module.webservices.rest.web.resource.impl.DelegatingResourceDescription; +import org.openmrs.module.webservices.rest.web.response.GenericRestException; +import org.openmrs.module.webservices.rest.web.response.ResourceDoesNotSupportOperationException; +import org.openmrs.module.webservices.rest.web.response.ResponseException; +import io.swagger.models.Model; +import io.swagger.models.ModelImpl; +import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.BooleanProperty; +import io.swagger.models.properties.DateProperty; +import io.swagger.models.properties.DateTimeProperty; +import io.swagger.models.properties.IntegerProperty; +import io.swagger.models.properties.RefProperty; +import io.swagger.models.properties.StringProperty; +/** + * {@link Resource} for Attachment, supporting standard CRUD operations + */ @Resource(name = RestConstants.VERSION_1 + "/attachment", supportedClass = Attachment.class, supportedOpenmrsVersions = { "2.0.0" }) public class AttachmentResource2_0 extends AttachmentResource1_10 { + /** + * @see org.openmrs.module.webservices.rest.web.resource.impl.DelegatingCrudResource#getRepresentationDescription(org.openmrs.module.webservices.rest.web.representation.Representation) + */ + @Override + public DelegatingResourceDescription getRepresentationDescription(Representation rep) { + if (rep instanceof DefaultRepresentation) { + DelegatingResourceDescription description = new DelegatingResourceDescription(); + description.addProperty("uuid"); + description.addProperty("dateTime"); + description.addProperty("comment"); + description.addProperty("complexData"); + description.addSelfLink(); + description.addLink("full", ".?v=" + RestConstants.REPRESENTATION_FULL); + return description; + } else if (rep instanceof FullRepresentation) { + DelegatingResourceDescription description = new DelegatingResourceDescription(); + description.addProperty("uuid"); + description.addProperty("dateTime"); + description.addProperty("comment"); + description.addProperty("auditInfo"); + description.addProperty("complexData"); + description.addSelfLink(); + return description; + } else if (rep instanceof RefRepresentation) { + DelegatingResourceDescription description = new DelegatingResourceDescription(); + description.addProperty("uuid"); + description.addProperty("comment"); + description.addSelfLink(); + return description; + } + return null; + } + + /** + * @see org.openmrs.module.webservices.rest.web.resource.impl.BaseDelegatingResource#getCreatableProperties() + */ + @Override + public DelegatingResourceDescription getCreatableProperties() { + DelegatingResourceDescription description = new DelegatingResourceDescription(); + description.addRequiredProperty("uuid"); + description.addRequiredProperty("display"); + description.addProperty("comment"); + description.addProperty("dateTime"); + description.addProperty("complexData"); + + return description; + } + + /** + * @throws org.openmrs.module.webservices.rest.web.response.ResourceDoesNotSupportOperationException + * @see org.openmrs.module.webservices.rest.web.resource.impl.BaseDelegatingResource#getUpdatableProperties() + */ + @Override + public DelegatingResourceDescription getUpdatableProperties() throws ResourceDoesNotSupportOperationException { + DelegatingResourceDescription description = new DelegatingResourceDescription(); + description.addProperty("uuid"); + description.addProperty("gender"); + description.addProperty("display"); + description.addProperty("comment"); + description.addProperty("dateTime"); + description.addRequiredProperty("complexData"); + return description; + } + + @Override + public Model getGETModel(Representation rep) { + ModelImpl model = (ModelImpl) super.getGETModel(rep); + if (rep instanceof DefaultRepresentation || rep instanceof FullRepresentation) { + model.property("uuid", new StringProperty()).property("display", new StringProperty()) + .property("gender", new StringProperty()._enum("M")._enum("F")).property("age", new IntegerProperty()) + .property("birthdate", new DateTimeProperty()).property("birthdateEstimated", new BooleanProperty()) + .property("dead", new BooleanProperty()).property("deathDate", new DateProperty()) + .property("causeOfDeath", new StringProperty()) + .property("attributes", new ArrayProperty(new RefProperty("#/definitions/AttachmentAttributeGetRef"))) + .property("voided", new BooleanProperty()); + } + if (rep instanceof DefaultRepresentation) { + model.property("preferredName", new RefProperty("#/definitions/AttachementNameGetRef")) + .property("preferredAddress", new RefProperty("#/definitions/AttachementAddressGetRef")); + + } else if (rep instanceof FullRepresentation) { + model.property("preferredName", new RefProperty("#/definitions/AttachmentNameGet")) + .property("preferredAddress", new RefProperty("#/definitions/AttachmentAddressGet")) + .property("names", new ArrayProperty(new RefProperty("#/definitions/AttachmentNameGet"))) + .property("addresses", new ArrayProperty(new RefProperty("#/definitions/AttachmentAddressGet"))); + } + return model; + } + + @Override + public Model getCREATEModel(Representation representation) { + ModelImpl model = new ModelImpl() + .property("names", new ArrayProperty(new RefProperty("#/definitions/AttachmentNameCreate"))) + .property("gender", new StringProperty()._enum("M")._enum("F")).property("age", new IntegerProperty()) + .property("birthdate", new DateProperty()) + .property("birthdateEstimated", new BooleanProperty()._default(false)) + .property("dead", new BooleanProperty()._default(false)).property("deathDate", new DateProperty()) + .property("causeOfDeath", new StringProperty()) + .property("addresses", new ArrayProperty(new RefProperty("#/definitions/AttachmentAddressCreate"))) + .property("attributes", new ArrayProperty(new RefProperty("#/definitions/AttachmentAttributeCreate"))); + + model.setRequired(Arrays.asList("names", "gender")); + return model; + } + + @Override + public Model getUPDATEModel(Representation representation) { + return new ModelImpl().property("dead", new BooleanProperty()).property("causeOfDeath", new StringProperty()) + .property("deathDate", new DateProperty()).property("age", new IntegerProperty()) + .property("gender", new StringProperty()._enum("M")._enum("F")).property("birthdate", new DateProperty()) + .property("birthdateEstimated", new BooleanProperty()._default(false)) + .property("preferredName", new StringProperty().example("uuid")) + .property("preferredAddress", new StringProperty().example("uuid")) + .property("attributes", new ArrayProperty(new RefProperty("#/definitions/AttachmentAttributeCreate"))) + .required("dead").required("causeOfDeath"); + } + + /** + * @see org.openmrs.module.webservices.rest.web.resource.impl.BaseDelegatingResource#getPropertiesToExposeAsSubResources() + */ + @Override + public List getPropertiesToExposeAsSubResources() { + return Arrays.asList("comment", "complexData", "Attributes"); + } + @Override public Attachment save(Attachment delegate) { return Context.getService(AttachmentsService.class).save(delegate, AttachmentResource1_10.REASON); } + } diff --git a/omod-2.0/src/test/java/org/openmrs/module/attachments/rest/AttachmentResource2_0Test.java b/omod-2.0/src/test/java/org/openmrs/module/attachments/rest/AttachmentResource2_0Test.java new file mode 100644 index 00000000..d0820f23 --- /dev/null +++ b/omod-2.0/src/test/java/org/openmrs/module/attachments/rest/AttachmentResource2_0Test.java @@ -0,0 +1,72 @@ +package org.openmrs.module.attachments.rest; + +import org.junit.Before; +import org.mockito.Mock; +import org.openmrs.api.ObsService; +import org.openmrs.api.context.Context; +import org.openmrs.module.attachments.AttachmentsService; +import org.openmrs.module.attachments.obs.Attachment; +import org.openmrs.module.webservices.rest.web.RequestContext; +import org.openmrs.module.webservices.rest.web.resource.impl.BaseDelegatingResourceTest; +import org.springframework.beans.factory.annotation.Autowired; + +public class AttachmentResource2_0Test extends BaseDelegatingResourceTest { + + private static final String ATTACHMENTRESOURCE_UUID = "9b6639b2-5785-4603-a364-075c2d61cd51"; + + @Mock + AttachmentsService attachmentService; + + Attachment attachment; + + @Autowired + private ObsService obsService; + + @Mock + RequestContext requestContext; + + @Before + public void before() throws Exception { + executeDataSet("org/openmrs/api/include/ObsServiceTest-complex.xml"); + } + + @Override + public String getDisplayProperty() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getUuidProperty() { + return ATTACHMENTRESOURCE_UUID; + } + + @Override + public Attachment newObject() { + return new Attachment(Context.getObsService().getObsByUuid(ATTACHMENTRESOURCE_UUID)); + + } + + @Override + public void validateDefaultRepresentation() throws Exception { + super.validateDefaultRepresentation(); + assertPropEquals("uuid", getObject().getUuid()); + assertPropEquals("dateTime", getObject().getDateTime()); + assertPropEquals("comment", getObject().getComment()); + assertPropEquals("complexData", getObject().getComplexData()); + + } + + @Override + public void validateFullRepresentation() throws Exception { + super.validateDefaultRepresentation(); + + assertPropEquals("uuid", getObject().getUuid()); + assertPropEquals("dateTime", getObject().getDateTime()); + assertPropEquals("comment", getObject().getComment()); + assertPropEquals("datechanged", getObject().getDateChanged()); + assertPropEquals("complexData", getObject().getComplexData()); + + } + +} diff --git a/omod-2.0/src/test/java/org/openmrs/module/attachments/rest/AttachmentRestController2_0Test.java b/omod-2.0/src/test/java/org/openmrs/module/attachments/rest/AttachmentRestController2_0Test.java index 169555c4..45586d53 100644 --- a/omod-2.0/src/test/java/org/openmrs/module/attachments/rest/AttachmentRestController2_0Test.java +++ b/omod-2.0/src/test/java/org/openmrs/module/attachments/rest/AttachmentRestController2_0Test.java @@ -8,7 +8,9 @@ import java.util.stream.Collectors; import org.apache.commons.beanutils.PropertyUtils; +import org.codehaus.jackson.map.ObjectMapper; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.openmrs.Obs; @@ -20,16 +22,24 @@ import org.openmrs.module.attachments.obs.Attachment; import org.openmrs.module.attachments.obs.TestAttachmentBytesViewHandler; import org.openmrs.module.attachments.obs.TestHelper; +import org.openmrs.module.webservices.rest.SimpleObject; +import org.openmrs.module.webservices.rest.test.Util; import org.openmrs.module.webservices.rest.web.RequestContext; import org.openmrs.module.webservices.rest.web.resource.impl.BasePageableResult; +import org.openmrs.module.webservices.rest.web.response.ResourceDoesNotSupportOperationException; import org.openmrs.module.webservices.rest.web.v1_0.controller.MainResourceControllerTest; import org.openmrs.obs.ComplexObsHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.web.bind.annotation.RequestMethod; public class AttachmentRestController2_0Test extends MainResourceControllerTest { + private static final Logger log = LoggerFactory.getLogger(Attachment.class); + @Autowired private AttachmentsService as; @@ -94,6 +104,90 @@ public void shouldGetRefByUuid() { public void shouldGetFullByUuid() { } + @Test + public void createAttachment_shouldCreateANewAttachment() throws Exception { + + SimpleObject attachment = new SimpleObject(); + attachment.add("uuid", obs.getUuid()); + attachment.add("comment", obs.getComment()); + attachment.add("complexData", obs.getComplexData()); + + String json = "{\"uuid\":\"" + getUuid() + "\",\"attachment\":\"" + attachment + "\"}"; + + try { + json = new ObjectMapper().writeValueAsString(attachment); + } + catch (IOException e) { + log.error("attachment created", e); + } + + MockHttpServletRequest req = request(RequestMethod.POST, getURI()); + req.setContent(json.getBytes()); + + SimpleObject result = null; + try { + result = deserialize(handle(req)); + } + catch (Exception e) { + log.error("Attachment failed to be created!", e); + } + + Util.log("Created attachment", result); + + // Check existence in database + String uuid = (String) attachment.get("uuid"); + Assert.assertNull(result); + String createdAttachment = obs.getUuid(); + Assert.assertNotEquals("Created complexData ", createdAttachment.equalsIgnoreCase(createdAttachment)); + + } + + @Test + public void getAttachment_shouldGetADefaultRepresentationOfAttachment() throws Exception { + + MockHttpServletRequest req = request(RequestMethod.GET, getURI() + "/" + getUuid()); + SimpleObject result = deserialize(handle(req)); + + Assert.assertNotNull(result); + Util.log("Attachment fetched (default)", result); + Assert.assertEquals(getUuid(), result.get("uuid")); + } + + @Test + public void updateAttachment_shouldChangeAPropertyOnAttachment() throws Exception { + + SimpleObject attributes = new SimpleObject(); + attributes.add("complexData", "update complextData"); + attributes.add("deathDate", "Updated deathDate"); + attributes.add("prefferedName", "Updated prefferedName"); + attributes.add("gender", "updated gender"); + attributes.add("preferredAddress", "updated preferredAddress"); + + String json = "{\"uuid\":\"" + getUuid() + "\",\"attributes\":\"" + attributes + "\"}"; + + try { + json = new ObjectMapper().writeValueAsString(attributes); + } + catch (IOException e) { + log.error("Attachments deserialised!", e); + } + + MockHttpServletRequest req = request(RequestMethod.POST, getURI() + "/" + getUuid()); + req.setContent(json.getBytes()); + + SimpleObject result = null; + try { + result = deserialize(handle(req)); + } + catch (Exception e) { + log.error("attachment failed to be updated!", e); + } + + Assert.assertNull(result); + String editedAttachment = obs.getUuid(); + Assert.assertNotEquals("Updated complexData ", editedAttachment.equalsIgnoreCase(editedAttachment)); + } + @Test public void postAttachment_shouldUpdateObsComment() throws Exception { // Setup diff --git a/pom.xml b/pom.xml index c7492d77..12bcafaf 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ 2.2.1 3.3.1 1.4 - 2.17 + 2.21.0 1.19 0.9.2.1 1.1