PageRenderTime 27ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/app/models/user.php

https://github.com/cgajardo/repositorium
PHP | 265 lines | 189 code | 20 blank | 56 comment | 16 complexity | 207f4fab749e9ad3c0da15076d7d8262 MD5 | raw file
  1. <?php
  2. class User extends AppModel {
  3. var $name = 'User';
  4. var $displayField = 'email';
  5. var $virtualFields = array(
  6. 'full_name' => 'CONCAT(first_name, \' \', last_name)'
  7. );
  8. var $validate = array(
  9. 'email' => array(
  10. 'email' => array(
  11. 'rule' => array('email'),
  12. 'message' => 'Give a valid email',
  13. //'allowEmpty' => false,
  14. //'required' => false,
  15. //'last' => false, // Stop validation after this rule
  16. //'on' => 'create', // Limit validation to 'create' or 'update' operations
  17. ),
  18. ),
  19. 'first_name' => array(
  20. 'notempty' => array(
  21. 'rule' => array('notempty'),
  22. 'message' => 'Please give your first name',
  23. //'allowEmpty' => false,
  24. //'required' => false,
  25. //'last' => false, // Stop validation after this rule
  26. //'on' => 'create', // Limit validation to 'create' or 'update' operations
  27. ),
  28. ),
  29. 'last_name' => array(
  30. 'notempty' => array(
  31. 'rule' => array('notempty'),
  32. 'message' => 'Please give your last name',
  33. //'allowEmpty' => false,
  34. //'required' => false,
  35. //'last' => false, // Stop validation after this rule
  36. //'on' => 'create', // Limit validation to 'create' or 'update' operations
  37. ),
  38. ),
  39. 'password' => array(
  40. 'notempty' => array(
  41. 'rule' => array('notempty'),
  42. 'message' => 'Password cannot be empty',
  43. //'allowEmpty' => false,
  44. //'required' => false,
  45. //'last' => false, // Stop validation after this rule
  46. //'on' => 'create', // Limit validation to 'create' or 'update' operations
  47. ),
  48. ),
  49. 'is_administrator' => array(
  50. 'boolean' => array(
  51. 'rule' => array('boolean'),
  52. //'message' => 'Your custom message here',
  53. //'allowEmpty' => false,
  54. //'required' => false,
  55. //'last' => false, // Stop validation after this rule
  56. //'on' => 'create', // Limit validation to 'create' or 'update' operations
  57. ),
  58. ),
  59. 'active' => array(
  60. 'boolean' => array(
  61. 'rule' => array('boolean'),
  62. //'message' => 'Your custom message here',
  63. //'allowEmpty' => false,
  64. //'required' => false,
  65. //'last' => false, // Stop validation after this rule
  66. //'on' => 'create', // Limit validation to 'create' or 'update' operations
  67. ),
  68. ),
  69. );
  70. //The Associations below have been created with all possible keys, those that are not needed can be removed
  71. var $hasMany = array(
  72. 'Document' => array(
  73. 'className' => 'Document',
  74. 'foreignKey' => 'user_id',
  75. 'dependent' => false,
  76. 'conditions' => '',
  77. 'fields' => '',
  78. 'order' => '',
  79. 'limit' => '',
  80. 'offset' => '',
  81. 'exclusive' => '',
  82. 'finderQuery' => '',
  83. 'counterQuery' => ''
  84. ),
  85. 'Expert' => array(
  86. 'className' => 'Expert',
  87. 'foreignKey' => 'user_id',
  88. 'dependent' => true,
  89. 'conditions' => '',
  90. 'fields' => '',
  91. 'order' => '',
  92. 'limit' => '',
  93. 'offset' => '',
  94. 'exclusive' => '',
  95. 'finderQuery' => '',
  96. 'counterQuery' => ''
  97. ),
  98. 'Repository' => array(
  99. 'className' => 'Repository',
  100. 'foreignKey' => 'user_id',
  101. 'dependent' => false,
  102. 'conditions' => '',
  103. 'fields' => '',
  104. 'order' => '',
  105. 'limit' => '',
  106. 'offset' => '',
  107. 'exclusive' => '',
  108. 'finderQuery' => '',
  109. 'counterQuery' => ''
  110. ),
  111. 'CriteriasUser' => array(
  112. 'className' => 'CriteriasUser',
  113. 'foreignKey' => 'user_id',
  114. 'dependent' => true,
  115. 'conditions' => '',
  116. 'fields' => '',
  117. 'order' => '',
  118. 'limit' => '',
  119. 'offset' => '',
  120. 'finderQuery' => '',
  121. 'deleteQuery' => '',
  122. 'insertQuery' => ''
  123. ),
  124. 'RepositoriesUser' => array(
  125. 'className' => 'RepositoriesUser',
  126. 'foreignKey' => 'user_id',
  127. 'dependent' => true,
  128. )
  129. );
  130. /* ==================== METHODS ====================== */
  131. /**
  132. * DO NOT change this method unless you know what are you doing
  133. *
  134. */
  135. function beforeSave($options) {
  136. if(!empty($this->data['User']['password'])) {
  137. $this->data['User']['salt'] = mt_rand();
  138. $this->data['User']['password'] = sha1($this->data['User']['password'] . $this->data['User']['salt']);
  139. }
  140. return true;
  141. }
  142. /**
  143. * Registers a new user
  144. * @param array $data
  145. * @return true on success, false otherwise
  146. */
  147. function register($data=array()) {
  148. if(empty($data) || !array_key_exists('User', $data))
  149. return false;
  150. $t = array(
  151. array_key_exists('email', $data['User']),
  152. array_key_exists('first_name', $data['User']),
  153. array_key_exists('last_name', $data['User']),
  154. array_key_exists('password', $data['User']),
  155. );
  156. if(!($t[0] and $t[1] and $t[2] and $t[3]))
  157. return false;
  158. $data['User']['is_administrator'] = false;
  159. // register user
  160. $user = $this->save($data);
  161. return $user;
  162. }
  163. /**
  164. * checks user credential
  165. * @param array $data with email and password as subkeys of User, eg $data['User']['email']
  166. * @return the corresponding user object, null otherwise
  167. */
  168. function getUser($data = array()) {
  169. if(empty($data) or !isset($data['User']['email']) or !isset($data['User']['password'])) {
  170. return null;
  171. }
  172. $d = $this->findByEmail($data['User']['email']);
  173. $pass_to_check = $d['User']['password'];
  174. $pass_from_login = sha1($data['User']['password'] . $d['User']['salt']);
  175. if(strcmp($pass_to_check,$pass_from_login) == 0) {
  176. return $d;
  177. }
  178. return null;
  179. }
  180. /**
  181. * @TODO EXPERTS AND REPOSITORIES!!!
  182. */
  183. function afterSave($created) {
  184. if($created) {
  185. /* on create */
  186. if(!empty($this->data['User']['es_experto'])) {
  187. $this->_expert_create($this->id);
  188. }
  189. $this->CriteriasUser->massCreateAfterUser($this->id);
  190. $this->RepositoriesUser->massCreateAfterUser($this->id);
  191. CakeLog::write('activity', 'User '.$this->id. ' created');
  192. } else {
  193. /* on update */
  194. if($this->data['User']['es_experto'] == 1) {
  195. $this->_expert_create($this->id);
  196. } else {
  197. $this->_expert_delete($this->id);
  198. }
  199. CakeLog::write('activity', 'User '.$this->id. ' updated');
  200. }
  201. }
  202. function _expert_create($id) {
  203. $this->Expert->create();
  204. $this->Expert->set(array(
  205. 'user_id' => $this->id,
  206. 'repository_id' => 1
  207. ));
  208. $this->Expert->save();
  209. }
  210. function _expert_delete($id) {
  211. $this->Expert->deleteAll(array('Expert.user_id' => $id));
  212. }
  213. function afterFind($results, $primary) {
  214. $i = 0;
  215. foreach($results as $r) {
  216. if(!empty($r['Expert'])) {
  217. $results[$i]['User']['es_experto'] = 1;
  218. }
  219. $i += 1;
  220. }
  221. return $results;
  222. }
  223. /**
  224. * UNTESTED
  225. *
  226. *
  227. * @param integer or string $user_id
  228. * @param integer or string $repo_id
  229. * @return integer or null
  230. */
  231. function get_user_points($user_id, $repo_id) {
  232. if(is_null($user_id) || is_null($repo_id))
  233. return null;
  234. $points = $this->RepositoriesUser->find('first', array(
  235. 'conditions' => array(
  236. 'user_id' => $user_id,
  237. 'repository_id' => $repo_id
  238. ),
  239. 'fields' => array('points'),
  240. 'recursirve' => -1,
  241. ));
  242. return $points['RepositoriesUser']['points'];
  243. }
  244. }
  245. ?>