From d73bc2d0cceb1b97f15d2f32cd76e01e62200245 Mon Sep 17 00:00:00 2001
From: tendongeryanawo-nasako <tenasryan@yahoo.com>
Date: Wed, 21 Aug 2019 21:27:59 -0400
Subject: [PATCH] Modify user resource to include email property which would
 enable a user email to be edited from reference application, fixed failing
 tests.

---
 .../resource/openmrs1_8/UserResource1_8.java  |  2 +-
 .../resource/openmrs2_0/UserResource2_0.java  |  2 +-
 .../resource/openmrs2_2/UserResource2_2.java  | 87 +++++++++++++++++++
 3 files changed, 89 insertions(+), 2 deletions(-)
 create mode 100644 omod-2.2/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs2_2/UserResource2_2.java

diff --git a/omod-1.8/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs1_8/UserResource1_8.java b/omod-1.8/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs1_8/UserResource1_8.java
index 4a00e2a76..7b3563cb6 100644
--- a/omod-1.8/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs1_8/UserResource1_8.java
+++ b/omod-1.8/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs1_8/UserResource1_8.java
@@ -247,7 +247,7 @@ public void purge(UserAndPassword1_8 user, RequestContext context) throws Respon
 	 */
 	@Override
 	protected NeedsPaging<UserAndPassword1_8> doSearch(RequestContext context) {
-		// determine roles 
+		// determine roles
 		List<Role> foundRoles = null;
 		final String requestedRolesParameter = context.getParameter(PARAMETER_ROLES);
 		if (requestedRolesParameter != null) {
diff --git a/omod-2.0/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs2_0/UserResource2_0.java b/omod-2.0/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs2_0/UserResource2_0.java
index ecedeecb9..7f1be988c 100644
--- a/omod-2.0/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs2_0/UserResource2_0.java
+++ b/omod-2.0/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs2_0/UserResource2_0.java
@@ -22,7 +22,7 @@
  * {@link Resource} for User, supporting standard CRUD operations
  */
 @Resource(name = RestConstants.VERSION_1 + "/user", supportedClass = UserAndPassword1_8.class, supportedOpenmrsVersions = {
-        "2.0.*", "2.1.*", "2.2.*", "2.3.*" })
+        "2.0.*", "2.1.*" })
 public class UserResource2_0 extends UserResource1_8 {
 	
 	/**
diff --git a/omod-2.2/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs2_2/UserResource2_2.java b/omod-2.2/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs2_2/UserResource2_2.java
new file mode 100644
index 000000000..fcc8b22c9
--- /dev/null
+++ b/omod-2.2/src/main/java/org/openmrs/module/webservices/rest/web/v1_0/resource/openmrs2_2/UserResource2_2.java
@@ -0,0 +1,87 @@
+/**
+ * This Source Code Form is subject to the terms of the Mozilla Public License,
+ * v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
+ * the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
+ *
+ * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
+ * graphic logo is a trademark of OpenMRS Inc.
+ */
+package org.openmrs.module.webservices.rest.web.v1_0.resource.openmrs2_2;
+
+import io.swagger.models.Model;
+import io.swagger.models.ModelImpl;
+import io.swagger.models.properties.StringProperty;
+import org.openmrs.User;
+import org.openmrs.api.context.Context;
+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.Representation;
+import org.openmrs.module.webservices.rest.web.resource.impl.DelegatingResourceDescription;
+import org.openmrs.module.webservices.rest.web.v1_0.resource.openmrs1_8.UserResource1_8;
+import org.openmrs.module.webservices.rest.web.v1_0.resource.openmrs2_0.UserResource2_0;
+import org.openmrs.module.webservices.rest.web.v1_0.wrapper.openmrs1_8.UserAndPassword1_8;
+
+/**
+ * {@link Resource} for User, supporting standard CRUD operations
+ */
+@Resource(name = RestConstants.VERSION_1 + "/user", supportedClass = UserAndPassword1_8.class, supportedOpenmrsVersions = {
+        "2.2.*", "2.3.*" })
+public class UserResource2_2 extends UserResource1_8 {
+	
+	/**
+	 * @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) {
+		DelegatingResourceDescription description = super.getRepresentationDescription(rep);
+		if (rep instanceof DefaultRepresentation) {
+			description.addProperty("email");
+		}
+		else if (rep instanceof FullRepresentation) {
+			description.addProperty("email");
+		}
+		return description;
+	}
+	
+	@Override
+	public DelegatingResourceDescription getCreatableProperties() {
+		DelegatingResourceDescription description = super.getCreatableProperties();
+		description.addRequiredProperty("email");
+		return description;
+	}
+	
+	@Override
+	public Model getGETModel(Representation rep) {
+		ModelImpl model = (ModelImpl) super.getGETModel(rep);
+		if (rep instanceof DefaultRepresentation || rep instanceof FullRepresentation) {
+			model.property("email", new StringProperty());
+		}
+		return model;
+	}
+	
+	@Override
+	public Model getCREATEModel(Representation rep) {
+		return ((ModelImpl) super.getCREATEModel(rep))
+		        .property("email", new StringProperty());
+	}
+	
+	/**
+	 * @see org.openmrs.module.webservices.rest.web.resource.impl.DelegatingCrudResource#save(java.lang.Object)
+	 */
+	@Override
+	public UserAndPassword1_8 save(UserAndPassword1_8 user) {
+		User openmrsUser = new User();
+		if (user.getUser().getUserId() == null) {
+			openmrsUser = Context.getUserService().createUser(user.getUser(), user.getPassword());
+		} else {
+			openmrsUser = Context.getUserService().saveUser(user.getUser());
+			Context.refreshAuthenticatedUser();
+		}
+		
+		return new UserAndPassword1_8(openmrsUser);
+		
+	}
+}