From f962de8a8a2c6d00b4f8cb79227b4d83233edb96 Mon Sep 17 00:00:00 2001
From: Peter Rotich <peter@enhancesoft.com>
Date: Wed, 27 Nov 2013 15:09:14 +0000
Subject: [PATCH] Refactor user create Change fromForm routine takes the actual
 form and do validation and call fromVars with clean data

Add fromVars to do the actual user creation (previously named fromForm.
---
 include/ajax.tickets.php | 12 +++++++-----
 include/ajax.users.php   | 14 +-------------
 include/class.ticket.php |  2 +-
 include/class.user.php   | 30 +++++++++++++++++++++++++-----
 4 files changed, 34 insertions(+), 24 deletions(-)

diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php
index cdf20fb30..efadebca3 100644
--- a/include/ajax.tickets.php
+++ b/include/ajax.tickets.php
@@ -457,11 +457,13 @@ class TicketsAjaxAPI extends AjaxController {
                 || !$ticket->checkStaffAccess($thisstaff))
             Http::response(404, 'No such ticket');
 
-        $errors = $info = array();
-        $user = null;
-        $form = UserForm::getInstance();
-        if ($form->isValid())
-            $user = User::fromForm($form->getClean());
+        $user = $form = null;
+        if (isset($_POST['id']) && $_POST['id']) { //Existing user/
+            $user =  User::lookup($_POST['id']);
+        } else { //We're creating a new user!
+            $form = UserForm::getUserForm()->getForm($_POST);
+            $user = User::fromForm($form);
+        }
 
         if ($user && ($c=$ticket->addCollaborator($user, $errors))) {
             $info +=array('msg' => sprintf('%s added as a collaborator',
diff --git a/include/ajax.users.php b/include/ajax.users.php
index bbc19fc72..5126ca121 100644
--- a/include/ajax.users.php
+++ b/include/ajax.users.php
@@ -66,22 +66,10 @@ class UsersAjaxAPI extends AjaxController {
 
     function addUser() {
 
-        $valid = true;
         $form = UserForm::getUserForm()->getForm($_POST);
-        if (!$form->isValid())
-            $valid  = false;
-
-        if (($field=$form->getField('email'))
-                && $field->getClean()
-                && User::lookup(array('emails__address'=>$field->getClean()))) {
-            $field->addError('Email is assigned to another user');
-            $valid = false;
-        }
-
-        if ($valid && ($user = User::fromForm($form->getClean())))
+        if (($user = User::fromForm($form)))
             Http::response(201, $user->to_json());
 
-
         $info = array('error' =>'Error adding user - try again!');
 
         return self::_lookupform($form, $info);
diff --git a/include/class.ticket.php b/include/class.ticket.php
index aab67fb65..e61bdf05d 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -2111,7 +2111,7 @@ class Ticket {
             if (!$user) {
                 $user_form = UserForm::getUserForm()->getForm($vars);
                 if (!$user_form->isValid($field_filter)
-                        || !($user=User::fromForm($user_form->getClean())))
+                        || !($user=User::fromVars($user_form->getClean())))
                     $errors['user'] = 'Incomplete client information';
             }
         }
diff --git a/include/class.user.php b/include/class.user.php
index 36823db84..85a01d784 100644
--- a/include/class.user.php
+++ b/include/class.user.php
@@ -76,26 +76,46 @@ class User extends UserModel {
             $this->default_email = UserEmail::lookup($ht['default_email_id']);
     }
 
-    static function fromForm($data=false) {
+    static function fromVars($vars=false) {
         // Try and lookup by email address
-        $user = User::lookup(array('emails__address'=>$data['email']));
+        $user = User::lookup(array('emails__address'=>$vars['email']));
         if (!$user) {
             $user = User::create(array(
-                'name'=>$data['name'],
+                'name'=>$vars['name'],
                 'created'=>new SqlFunction('NOW'),
                 'updated'=>new SqlFunction('NOW'),
                 'default_email'=>
-                    UserEmail::create(array('address'=>$data['email']))
+                    UserEmail::create(array('address'=>$vars['email']))
             ));
             $user->save(true);
             $user->emails->add($user->default_email);
             // Attach initial custom fields
-            $user->addDynamicData($data);
+            $user->addDynamicData($vars);
         }
 
         return $user;
     }
 
+    static function fromForm($form) {
+
+        if(!$form) return null;
+
+        //Validate the form
+        $valid = true;
+        if (!$form->isValid())
+            $valid  = false;
+
+        //Make sure the email is not in-use
+        if (($field=$form->getField('email'))
+                && $field->getClean()
+                && User::lookup(array('emails__address'=>$field->getClean()))) {
+            $field->addError('Email is assigned to another user');
+            $valid = false;
+        }
+
+        return $valid ? self::fromVars($form->getClean()) : null;
+    }
+
     function getEmail() {
         return $this->default_email->address;
     }
-- 
GitLab