From 805c912610903f71abe4842dbe9e29af07d19b8a Mon Sep 17 00:00:00 2001
From: Sinisa Veseli <sveseli@aps.anl.gov>
Date: Mon, 10 Oct 2016 15:09:37 +0000
Subject: [PATCH] added ability to update/add users via rest web service

---
 .../dm/ds_web_service/api/userRestApi.py      | 65 +++++++++++++++++++
 .../impl/userInfoSessionControllerImpl.py     |  8 +++
 .../service/userInfoSessionController.py      | 51 +++++++++++++++
 .../service/userRouteDescriptor.py            | 18 +++++
 4 files changed, 142 insertions(+)

diff --git a/src/python/dm/ds_web_service/api/userRestApi.py b/src/python/dm/ds_web_service/api/userRestApi.py
index 95dccf5a..3ed80831 100755
--- a/src/python/dm/ds_web_service/api/userRestApi.py
+++ b/src/python/dm/ds_web_service/api/userRestApi.py
@@ -37,6 +37,71 @@ class UserRestApi(DsRestApi):
         responseData = self.sendSessionRequest(url=url, method='GET')
         return UserInfo(responseData)
 
+    @DsRestApi.execute
+    def addUser(self, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate):
+        if username is None:
+            raise InvalidRequest('Username must be provided.')
+        if firstName is None:
+            raise InvalidRequest('firstName must be provided.')
+        if lastName is None:
+            raise InvalidRequest('lastName must be provided.')
+        url = '%s/users' % (self.getContextRoot())
+        url += '?username=%s' % username
+        url += '&firstName=%s' % Encoder.encode(firstName)
+        url += '&lastName=%s' % Encoder.encode(lastName)
+        if middleName:
+            url += '&middleName=%s' % Encoder.encode(middleName)
+        if email:
+            url += '&email=%s' % Encoder.encode(email)
+        if badge:
+            url += '&badge=%s' % Encoder.encode(badge)
+        if globusUsername:
+            url += '&globusUsername=%s' % Encoder.encode(globusUsername)
+        if description:
+            url += '&description=%s' % Encoder.encode(description)
+        if password:
+            url += '&password=%s' % Encoder.encode(password)
+        if isLocalUser:
+            url += '&isLocaUser=%s' % isLocalUser
+        if lastUpdate:
+            url += '&lastUpdate=%s' % lastUpdate
+        responseData = self.sendSessionRequest(url=url, method='POST')
+        return UserInfo(responseData)
+
+    @DsRestApi.execute
+    def updateUser(self, id, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate):
+        if id is None:
+            raise InvalidRequest('User id must be provided.')
+        url = ''
+        if username:
+            url += '&username=%s' % username
+        if firstName:
+            url += '&firstName=%s' % Encoder.encode(firstName)
+        if lastName:
+            url += '&lastName=%s' % Encoder.encode(lastName)
+        if middleName:
+            url += '&middleName=%s' % Encoder.encode(middleName)
+        if email:
+            url += '&email=%s' % Encoder.encode(email)
+        if badge:
+            url += '&badge=%s' % Encoder.encode(badge)
+        if globusUsername:
+            url += '&globusUsername=%s' % Encoder.encode(globusUsername)
+        if description:
+            url += '&description=%s' % Encoder.encode(description)
+        if password:
+            url += '&password=%s' % Encoder.encode(password)
+        if isLocalUser:
+            url += '&isLocaUser=%s' % isLocalUser
+        if lastUpdate:
+            url += '&lastUpdate=%s' % lastUpdate
+        if not url:
+            raise InvalidRequest('No user attributes have been modified.')
+        # Remove first '&' character
+        url = '%s/users/%s?%s' % (self.getContextRoot(), id, url[1:])
+        responseData = self.sendSessionRequest(url=url, method='POST')
+        return UserInfo(responseData)
+
     @DsRestApi.execute
     def addUserExperimentRole(self, username, experimentName, roleName):
         if not username:
diff --git a/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py b/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py
index 1cc0aec6..6a973d35 100755
--- a/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py
+++ b/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py
@@ -25,6 +25,14 @@ class UserInfoSessionControllerImpl(DmObjectManager):
     def getUserByUsername(self, username):
         return self.userDbApi.getUserByUsername(username)
 
+    def addUser(self, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate):
+        userInfo = self.userDbApi.addUser(username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate)
+        return userInfo
+
+    def updateUser(self, id, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate):
+        userInfo = self.userDbApi.updateUser(id, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate)
+        return userInfo
+
     def addUserExperimentRole(self, username, experimentName, roleName):
         userInfo = self.userDbApi.addUserExperimentRole(username, experimentName, roleName)
         ExperimentManager.getInstance().addUserToGroup(username, experimentName)
diff --git a/src/python/dm/ds_web_service/service/userInfoSessionController.py b/src/python/dm/ds_web_service/service/userInfoSessionController.py
index 533c2080..52756f87 100755
--- a/src/python/dm/ds_web_service/service/userInfoSessionController.py
+++ b/src/python/dm/ds_web_service/service/userInfoSessionController.py
@@ -36,6 +36,57 @@ class UserInfoSessionController(DmSessionController):
         self.logger.debug('Returning user info for %s: %s' % (username,response))
         return response
 
+    @cherrypy.expose
+    @DmSessionController.require(DmSessionController.isAdministrator())
+    @DmSessionController.execute
+    def addUser(self, **kwargs):
+        username = kwargs.get('username')
+        if not username:
+            raise InvalidRequest('Invalid username provided.')
+        firstName = kwargs.get('firstName')
+        if not firstName:
+            raise InvalidRequest('Invalid first name provided.')
+        firstName = Encoder.decode(firstName)
+        lastName = kwargs.get('lastName')
+        if not lastName:
+            raise InvalidRequest('Invalid last name provided.')
+        lastName = Encoder.decode(lastName)
+        middleName = Encoder.decode(kwargs.get('middleName'))
+        email = Encoder.decode(kwargs.get('email'))
+        badge = Encoder.decode(kwargs.get('badge'))
+        globusUsername = Encoder.decode(kwargs.get('globusUsername'))
+        description = Encoder.decode(kwargs.get('description'))
+        password = Encoder.decode(kwargs.get('password'))
+        isLocalUser = kwargs.get('isLocalUser')
+        lastUpdate = Encoder.decode(kwargs.get('lastUpdate'))
+
+        response = self.userInfoSessionControllerImpl.addUser(username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate).getFullJsonRep()
+        return response
+
+    @cherrypy.expose
+    @DmSessionController.require(DmSessionController.isAdministrator())
+    @DmSessionController.execute
+    def updateUser(self, id, **kwargs):
+        if not id:
+            raise InvalidRequest('Invalid user id provided.')
+        username = kwargs.get('username')
+        firstName = Encoder.decode(kwargs.get('firstName'))
+        lastName = Encoder.decode(kwargs.get('lastName'))
+        middleName = Encoder.decode(kwargs.get('middleName'))
+        email = Encoder.decode(kwargs.get('email'))
+        badge = Encoder.decode(kwargs.get('badge'))
+        globusUsername = Encoder.decode(kwargs.get('globusUsername'))
+        description = Encoder.decode(kwargs.get('description'))
+        password = Encoder.decode(kwargs.get('password'))
+        isLocalUser = kwargs.get('isLocalUser')
+        lastUpdate = Encoder.decode(kwargs.get('lastUpdate'))
+
+        response = self.userInfoSessionControllerImpl.updateUser(id, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate).getFullJsonRep()
+        return response
+
+    @cherrypy.expose
+    @DmSessionController.require(DmSessionController.isAdministrator())
+    @DmSessionController.execute
     @cherrypy.expose
     @DmSessionController.require(DmSessionController.isAdministrator())
     @DmSessionController.execute
diff --git a/src/python/dm/ds_web_service/service/userRouteDescriptor.py b/src/python/dm/ds_web_service/service/userRouteDescriptor.py
index 004b4739..ddffb965 100755
--- a/src/python/dm/ds_web_service/service/userRouteDescriptor.py
+++ b/src/python/dm/ds_web_service/service/userRouteDescriptor.py
@@ -46,6 +46,24 @@ class UserRouteDescriptor:
                 'method' : ['GET']
             },
 
+            # Add user
+            {
+                'name' : 'addUser',
+                'path' : '%s/users' % contextRoot,
+                'controller' : userInfoSessionController,
+                'action' : 'addUser',
+                'method' : ['POST']
+            },
+
+            # Update user
+            {
+                'name' : 'updateUser',
+                'path' : '%s/users/:(id)' % contextRoot,
+                'controller' : userInfoSessionController,
+                'action' : 'updateUser',
+                'method' : ['PUT']
+            },
+
             # Add user experiment role
             {
                 'name' : 'addUserExperimentRole',
-- 
GitLab