PageRenderTime 54ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/api/classes/User.php

https://bitbucket.org/Aanesen/imt2291-prosjekt2-v2018
PHP | 311 lines | 168 code | 51 blank | 92 comment | 14 complexity | 72b3940c743d6d1f35be99c0eca3dc68 MD5 | raw file
  1. <?php
  2. class User {
  3. private static $KEY_SESSION_USERID = 'userid';
  4. private static $KEY_SESSION_USERTYPE = 'usertype';
  5. /**
  6. * @function create
  7. * @brief Create a valid new user in the database.
  8. * @param db: PDOConnection
  9. * @param fullname: string - Example: Jonas Testerson
  10. * @param email: string - Example: jonas.test@gmail.com
  11. * @param password: string - Example: "my secret awesome password is magic"
  12. * @param wannebeTeacher: bool - The user has requested the teacher role. An administrator has to
  13. * approve of the request, before the user gets the teacher role.
  14. * @return userid | 0
  15. */
  16. static function create($db, $fullname, $email, $password, $wannebeTeacher) {
  17. // Is email already registered?
  18. $query = "SELECT * FROM User WHERE email = ?";
  19. $param = array($email);
  20. $stmt = $db->prepare($query);
  21. $stmt->execute($param);
  22. // @error A user with that email already registered.
  23. if ($stmt->fetchColumn() > 0) {
  24. return 0;
  25. }
  26. $query = "INSERT INTO user (id, fullname, email, password, usertype, wannabe) VALUES (?, ?, ?, ?, ?, ?)";
  27. $userid = uniqid();
  28. $param = array($userid, $fullname, $email, User::getHashedPassword($password), "student", $wannebeTeacher);
  29. $stmt = $db->prepare($query);
  30. $stmt->execute($param);
  31. // @error There was an error when inserting the user
  32. if ($stmt->rowCount() !== 1) {
  33. return 0;
  34. }
  35. return $userid;
  36. }
  37. /**
  38. * @function login
  39. * @param db: PDOConnection
  40. * @param email: string - Example: jonas.test@gmail.com
  41. * @param password: string - Example: "my secret awesome password is magic"
  42. * @global $_SESSION
  43. * @return userid | 0
  44. */
  45. static function login($db, $email, $password) {
  46. // If logged in already
  47. $userid = User::getLoggedInUserid();
  48. if ($userid > 0) {
  49. return 0;
  50. }
  51. $query = "SELECT * FROM user WHERE email = (?)";
  52. $param = array($email);
  53. $stmt = $db->prepare($query);
  54. $stmt->execute($param);
  55. if($stmt->rowCount() !== 1) {
  56. return 0;
  57. }
  58. $user = $stmt->fetch(PDO::FETCH_ASSOC);
  59. if(!password_verify($password, $user['password'])){
  60. return 0;
  61. }
  62. User::requireSession();
  63. $_SESSION[User::$KEY_SESSION_USERID] = $user['id'];
  64. $_SESSION[User::$KEY_SESSION_USERTYPE] = $user['usertype'];
  65. return $_SESSION[User::$KEY_SESSION_USERID];
  66. }
  67. /**
  68. * @function logout
  69. * @brief Modified the $_SESSION to in effect log out the user.
  70. * @global $_SESSION
  71. */
  72. static function logout() {
  73. User::requireSession();
  74. unset($_SESSION[User::$KEY_SESSION_USERID]);
  75. unset($_SESSION[User::$KEY_SESSION_USERTYPE]);
  76. }
  77. /**
  78. * @function getLoggedInUserid
  79. * @global $_SESSION
  80. * @return userid | 0
  81. */
  82. static function getLoggedInUserid() {
  83. User::requireSession();
  84. if( !isset($_SESSION[User::$KEY_SESSION_USERID]) ) {
  85. return 0;
  86. }
  87. return $_SESSION[User::$KEY_SESSION_USERID];
  88. }
  89. /**
  90. * @function isAdmin
  91. * @global $_SESSION
  92. * @return bool | 0
  93. */
  94. static function isAdmin() {
  95. User::requireSession();
  96. if ( !isset($_SESSION[User::$KEY_SESSION_USERTYPE]) || $_SESSION[User::$KEY_SESSION_USERTYPE] !== 'admin' )
  97. return false;
  98. return true;
  99. }
  100. /**
  101. * @function isTeacher
  102. * @global $_SESSION
  103. * @return bool | 0
  104. */
  105. static function isTeacher() {
  106. User::requireSession();
  107. if ( !isset($_SESSION[User::$KEY_SESSION_USERTYPE]) || $_SESSION[User::$KEY_SESSION_USERTYPE] !== 'teacher' )
  108. return false;
  109. return true;
  110. }
  111. /**
  112. * @function updateUser
  113. * @param db: PDOConnection
  114. * @param userid: string
  115. * @param password: string
  116. * @param usertype: enum['admin', 'teacher', 'student']
  117. * @param wannabe: bool
  118. * @return if updated true | false
  119. */
  120. static function updateUser($db, $userid, $password, $usertype, $wannabe) {
  121. $query = "UPDATE user SET password = (?), usertype = (?), wannabe = (?) WHERE id = (?)";
  122. $param = array(User::getHashedPassword($password), $usertype, $wannabe, $userid);
  123. $stmt = $db->prepare($query);
  124. $stmt->execute($param);
  125. return ($stmt->rowCount() === 1);
  126. }
  127. /**
  128. * @function updateType
  129. * @param db: PDOConnection
  130. * @param userid: string
  131. * @param usertype: enum['admin', 'teacher', 'student']
  132. * @return bool
  133. */
  134. static function updateType($db, $userid, $usertype) {
  135. $query = "UPDATE user SET usertype = ?, wannabe = ? WHERE id = (?)";
  136. $param = array($usertype, false, $userid);
  137. $stmt = $db->prepare($query);
  138. $stmt->execute($param);
  139. return ($stmt->rowCount() == 1);
  140. }
  141. /**
  142. * @function getWannabeTeachers
  143. * @requires admin rights
  144. * @brief getWannabe grabs all wannabe's from the DB
  145. * @param db: PDOConnection
  146. * @return array of wannabeTeachers | null
  147. */
  148. static public function getWannabeTeachers($db){
  149. // @error - user is not admin
  150. if ( !User::isAdmin() ) {
  151. return null;
  152. }
  153. //SQL Injection SAFE query method:
  154. $query = "SELECT * FROM user WHERE wannabe = (?)";
  155. $param = array(true);
  156. $stmt = $db->prepare($query);
  157. $stmt->execute($param);
  158. return $stmt->fetchAll(PDO::FETCH_ASSOC);
  159. }
  160. /**
  161. * @function get
  162. * @param db: PDOConnection
  163. * @return user | null
  164. */
  165. static public function get($db, $userid) {
  166. //SQL Injection SAFE query method:
  167. $query = "SELECT * FROM user WHERE id = (?)";
  168. $param = array($userid);
  169. $stmt = $db->prepare($query);
  170. $stmt->execute($param);
  171. return $stmt->fetch(PDO::FETCH_ASSOC);
  172. }
  173. /**
  174. * @function requireSession
  175. */
  176. static private function requireSession() {
  177. if (session_status() == PHP_SESSION_NONE) {
  178. @session_start(); // @NOTE Ignoring error messages from session_start() seems dangerous, but I had to do
  179. // because there is an error in the PHPUnit-tests. - JSolsvik 27.02.18
  180. }
  181. }
  182. /**
  183. * @function getHasshedPassword
  184. * @brief returns hashed version of $password
  185. * @param $password
  186. * @return bool|string
  187. */
  188. static private function getHashedPassword($password) {
  189. return password_hash($password, PASSWORD_BCRYPT);
  190. }
  191. /**
  192. * @function delete
  193. * @brief deletes $userid and all the users playlists, videos in the playlists, subscriptions, likes, comments,
  194. * videos, likes on users videos, comments on users videos
  195. * @param $db
  196. * @param $userid
  197. * @return bool
  198. */
  199. static function delete($db, $userid){
  200. $db->beginTransaction();
  201. try {
  202. $sql = 'SELECT id FROM playlist WHERE userid = ?'; //gets users playlists
  203. $stmt = $db->prepare($sql);
  204. $param = array($userid);
  205. $stmt->execute($param);
  206. $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  207. foreach($rows as $row) {
  208. $sql = 'DELETE FROM videoplaylist WHERE playlistid = ?'; //deletes the video-playlist links
  209. $stmt = $db->prepare($sql);
  210. $param = array($row['id']);
  211. $stmt->execute($param);
  212. }
  213. $sql = 'DELETE FROM usersubscribe WHERE userid = ?'; //deletes the user-playlist links
  214. $stmt = $db->prepare($sql);
  215. $param = array($userid);
  216. $stmt->execute($param);
  217. $sql = 'DELETE FROM userlike WHERE userid = ?'; //deletes user-like links
  218. $stmt = $db->prepare($sql);
  219. $param = array($userid);
  220. $stmt->execute($param);
  221. $sql = 'DELETE FROM playlist WHERE userid = ?'; //deletes the users playlists
  222. $stmt = $db->prepare($sql);
  223. $param = array($userid);
  224. $stmt->execute($param);
  225. $sql = 'DELETE FROM comment WHERE userid = ?'; //deletes the users comments
  226. $stmt = $db->prepare($sql);
  227. $param = array($userid);
  228. $stmt->execute($param);
  229. $sql = 'SELECT id FROM video WHERE userid = ?'; //gets the users videos
  230. $stmt = $db->prepare($sql);
  231. $param = array($userid);
  232. $stmt->execute($param);
  233. $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  234. foreach($rows as $row) {
  235. $sql = 'DELETE FROM comment WHERE videoid = ?'; //deletes all comments on these videos
  236. $stmt = $db->prepare($sql);
  237. $param = array($row['id']);
  238. $stmt->execute($param);
  239. $sql = 'DELETE FROM userlike WHERE videoid = ?'; //deletes all comments on these videos
  240. $stmt = $db->prepare($sql);
  241. $param = array($row['id']);
  242. $stmt->execute($param);
  243. }
  244. $sql = 'DELETE FROM video WHERE userid = ?'; //deletes all users videos
  245. $stmt = $db->prepare($sql);
  246. $param = array($userid);
  247. $stmt->execute($param);
  248. $sql = 'DELETE FROM User WHERE id = ?'; //deletes user :)
  249. $stmt = $db->prepare($sql);
  250. $param = array($userid);
  251. $stmt->execute($param);
  252. } catch (PDOException $e) {
  253. print_r($e->errorInfo);
  254. $db->rollBack();
  255. return false;
  256. }
  257. $db->commit();
  258. return true;
  259. }
  260. }