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