Move assurer challenge action logic into model
authorMichael Tänzer <neo@nhng.de>
Tue, 28 Jun 2011 18:11:03 +0000 (20:11 +0200)
committerMichael Tänzer <neo@nhng.de>
Tue, 28 Jun 2011 18:11:03 +0000 (20:11 +0200)
Signed-off-by: Michael Tänzer <neo@nhng.de>
manager/application/controllers/ManageAccountController.php
manager/application/models/User.php

index a9be220..f89b177 100644 (file)
@@ -93,7 +93,7 @@ class ManageAccountController extends Zend_Controller_Action
         // Form is valid -> get values for processing
         $values = $form->getValues();
         
-        // Get user data
+        // Get current user
         $user = Default_Model_User::findCurrentUser();
         
         $this->view->adminIncreasesDone = array();
@@ -129,19 +129,9 @@ class ManageAccountController extends Zend_Controller_Action
         $values = $form->getValues();
         
         // Get user data
-        $user['id'] = $this->getUserId();
-        
-        // Assign the assurer challenge
-        $challenge = array(); // Make sure the array is empty
-        $challenge['user_id'] = $user['id'];
-        $challenge['variant_id'] = $values['variant'];
-        $challenge['pass_date'] = date('Y-m-d H:i:s');
-        $this->db->insert('cats_passed', $challenge);
-        
-        // Maybe user is now assurer
-        $this->fixAssurerFlag($user['id']);
+        $user = Default_Model_User::findCurrentUser();
         
-        return;
+        $user->assignChallenge(1, $values['variant']);
     }
     
     public function flagsAction()
@@ -251,10 +241,8 @@ class ManageAccountController extends Zend_Controller_Action
         
         $variant = new Zend_Form_Element_Select('variant');
         $variant->setLabel(I18n::_('Variant'));
-        // Get the available variants from the database
-        $query = 'select `id`, `test_text` from `cats_variant`
-            where `type_id` = 1';
-        $options = $this->db->fetchPairs($query);
+        $options =
+            Default_Model_User::getAvailableChallengeVariants($this->db, 1);
         $variant->setMultiOptions($options)
             ->setRequired(true);
         $form->addElement($variant);
index 86556de..7bf4030 100644 (file)
@@ -333,4 +333,77 @@ class Default_Model_User {
         throw new Exception(
             __METHOD__ . ': '.$this->id.' We have reached unreachable code');
     }
+    
+    /**
+     * Get the challenge types that are available in the database
+     * 
+     * @param $db Zend_Db_Adapter_Abstract
+     *         The database connection to use
+     * 
+     * @return array(int => string)
+     */
+    public static function getAvailableChallengeTypes(
+                Zend_Db_Adapter_Abstract $db) {
+        $query = 'select `id`, `type_text` from `cats_type`';
+        return $db->fetchPairs($query);
+    }
+    
+    /**
+     * Get the challenge variants for this type that are available in the
+     * database
+     * 
+     * @param $db Zend_Db_Adapter_Abstract
+     *         The database connection to use
+     * @param $type int
+     *  The type of challenge you want to get the variants of
+     * 
+     * @return array(int => string)
+     */
+    public static function getAvailableChallengeVariants(
+                Zend_Db_Adapter_Abstract $db, $type) {
+        $query = 'select `id`, `test_text` from `cats_variant`
+            where `type_id` = :type';
+        $query_params['type'] = $type;
+        return $db->fetchPairs($query, $query_params);
+    }
+    
+    /**
+     * Assign the challenge to the user
+     * 
+     * @param $type int
+     *         The type of the challenge, has to be one of the keys returned by
+     *  getAvailableChallengeTypes()
+     * @param $variant int
+     *         The variant of the challenge, has to be one of the keys returned by
+     *  getAvailableChallengeVariants()
+     * @param $date Zend_Date
+     *  The date the challenge was passed, defaults to current time
+     */
+    public function assignChallenge($type, $variant, Zend_Date $date = null) {
+        $types = self::getAvailableChallengeTypes($this->db);
+        if (!isset($types[$type])) {
+            throw new Exception(
+                __METHOD__ . ': got wrong challenge type '.$type.' when '.
+                'assigning challenge to user '.$this->id);
+        }
+        
+        $variants = self::getAvailableChallengeVariants($this->db, $type);
+        if (!isset($variants[$variant])) {
+            throw new Exception(
+                __METHOD__ . ': got wrong challenge variant '.$variant.' when '.
+                'assigning challenge to user '.$this->id);
+        }
+        
+        if ($date === null) {
+            $date = new Zend_Date();
+        }
+        
+        $challenge = array();
+        $challenge['user_id'] = $this->id;
+        $challenge['variant_id'] = $variant;
+        $challenge['pass_date'] = $date->toString('Y-m-d H:i:s');
+        $this->db->insert('cats_passed', $challenge);
+        
+        $this->fixAssurerFlag();
+    }
 }
\ No newline at end of file