project.class.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <?php
  2. require_once('issue.class.php');
  3. class Project implements JsonSerializable{
  4. public $id;
  5. public $cache = array(
  6. 'p_id'=>null,
  7. 's_id'=>null,
  8. 'u_id'=>null,
  9. 'name'=>null,
  10. 'description'=>null,
  11. 'date_created'=>null,
  12. 'date_modified'=>null
  13. );
  14. public function __construct($id){
  15. switch(func_num_args()){
  16. // name, description, user
  17. case 3:
  18. $user = func_get_arg(2)?func_get_arg(2):Bugs::$user;
  19. $name= func_get_arg(0);
  20. Bugs::$sql->query("
  21. INSERT INTO projects (name,description,u_id,s_id)
  22. VALUES (?,?,?,getsetting('project.default.status'))
  23. ",'ssi',
  24. func_get_arg(0),
  25. func_get_arg(1),
  26. $user->id
  27. )->execute();
  28. $id = Bugs::$sql->insert_id;
  29. if($id === 0){
  30. trigger_error("Failed to create project with name {$name}.");
  31. }
  32. // id
  33. case 1:
  34. $this->id = intval($id);
  35. $cache = Bugs::$sql->query("
  36. SELECT p_id,
  37. s_id,
  38. u_id,
  39. name,
  40. description,
  41. date_created,
  42. date_modified
  43. FROM projects
  44. WHERE id = ?;
  45. ",'i',$this->id)->assoc_result;
  46. if($cache){
  47. foreach($cache as $key => $value){
  48. $this->cache[$key] = $value;
  49. }
  50. }else{
  51. trigger_error("Project with id {$id} does not exist");
  52. }
  53. break;
  54. default:
  55. trigger_error("Invalid Arguments");
  56. }
  57. }
  58. public function jsonSerialize(){
  59. return array(
  60. 'id'=> $this->id,
  61. 'name'=> $this->name,
  62. 'description'=> $this->description,
  63. 'date_created'=> $this->date_created,
  64. 'date_modified'=> $this->date_modified
  65. );
  66. }
  67. public function __toString(){
  68. return $this->path;
  69. }
  70. public function __set($name,$value){
  71. switch($name){
  72. case 'name':case 'description':
  73. Bugs::$sql->query("
  74. UPDATE projects
  75. SET {$name} = ?
  76. WHERE id = ?
  77. ",'si',$value,$this->id)->execute();
  78. $this->cache[$name] = $value;
  79. break;
  80. case 'p_id':case 's_id':case 'u_id':
  81. Bugs::$sql->query("
  82. UPDATE projects
  83. SET {$name} = ?
  84. WHERE id = ?
  85. ",'ii',$value,$this->id)->execute();
  86. $this->cache[$name] = $value;
  87. break;
  88. case 'parent':
  89. if($value instanceof Project){
  90. $this->p_id = $value->id;
  91. }
  92. break;
  93. case 'user':
  94. if($value instanceof User){
  95. $this->u_id = $value->id;
  96. }
  97. break;
  98. default:
  99. if(isset($this->cache[$name])){
  100. $this->cache[$name] = $value;
  101. }
  102. }
  103. }
  104. public function __get($name){
  105. switch($name){
  106. case 'parent':
  107. if(isset($this->p_id)){
  108. return Bugs::Project($this->p_id);
  109. }
  110. break;
  111. case 'date_created':case 'date_modified':
  112. return strtotime($this->cache[$name]);
  113. break;
  114. case 'user':
  115. return Bugs::user($this->u_id);
  116. break;
  117. case 'users':
  118. $users = Bugs::$sql->query("
  119. SELECT r.u_id,
  120. pr.name
  121. FROM r_project_user r
  122. RIGHT JOIN project_roles pr
  123. ON pr.id = r.r_id
  124. WHERE r.p_id = ?
  125. ",'i',$this->id)->assoc_results;
  126. $ret = array();
  127. foreach($users as $user){
  128. if(!isset($ret[$user['name']])){
  129. $ret[$user['name']] = array();
  130. }
  131. if(!is_null($user['u_id'])){
  132. array_push($ret[$user['name']],Bugs::user($user['u_id']));
  133. }
  134. }
  135. return $ret;
  136. break;
  137. case 'user_ids':
  138. return array_column(
  139. Bugs::$sql->query("
  140. SELECT distinct r.u_id
  141. FROM r_project_user r
  142. RIGHT JOIN project_roles pr
  143. ON pr.id = r.r_id
  144. WHERE r.p_id = ?
  145. ",'i',$this->id)->assoc_results,
  146. 'u_id'
  147. );
  148. break;
  149. case 'roles':
  150. return $this->roles(Bugs::$user);
  151. break;
  152. case 'issue_ids':
  153. return array_column(
  154. Bugs::$sql->query("
  155. SELECT i.id
  156. FROM issues i
  157. JOIN statuses s
  158. ON s.id = i.s_id
  159. WHERE i.p_id = ?
  160. AND s.open = 1
  161. ",'i',$this->id)->assoc_results,
  162. 'id'
  163. );
  164. break;
  165. case 'closed_issue_ids':
  166. return array_column(
  167. Bugs::$sql->query("
  168. SELECT i.id
  169. FROM issues i
  170. JOIN statuses s
  171. ON s.id = i.s_id
  172. WHERE i.p_id = ?
  173. AND s.open = 0
  174. ",'i',$this->id)->assoc_results,
  175. 'id'
  176. );
  177. break;
  178. case 'issues':
  179. $issues = array();
  180. foreach($this->issue_ids as $id){
  181. array_push($issues,Bugs::issue($id));
  182. }
  183. return $issues;
  184. break;
  185. case 'closed_issues':
  186. $issues = array();
  187. foreach($this->closed_issue_ids as $id){
  188. array_push($issues,Bugs::issue($id));
  189. }
  190. return $issues;
  191. break;
  192. case 'status':
  193. return Bugs::status($this->s_id);
  194. break;
  195. default:
  196. if(isset($this->cache)){
  197. return $this->cache[$name];
  198. }
  199. }
  200. }
  201. public function permission($permission,$user=null){
  202. $user = is_null($user)?Bugs::$user:$user;
  203. return $user->admin ||
  204. $user->permission('project.'.$permission) ||
  205. Bugs::$sql->query("
  206. SELECT count(1) count
  207. FROM r_project_role_permission r
  208. JOIN permissions p
  209. ON p.id = r.per_id
  210. AND p.name IN (?,'*')
  211. JOIN r_project_user pu
  212. ON pu.r_id = r.r_id
  213. AND pu.u_id = ?
  214. AND pu.p_id = ?
  215. ",'sii','project.'.$permission,$user->id,$this->id)->assoc_result['count']!==0;
  216. }
  217. public function roles($user){
  218. return array_column(
  219. Bugs::$sql->query("
  220. SELECT distinct pr.name
  221. FROM r_project_user r
  222. RIGHT JOIN project_roles pr
  223. ON pr.id = r.r_id
  224. WHERE r.p_id = ?
  225. AND r.u_id = ?
  226. ",'ii',$this->id,$user->id)->assoc_results,
  227. 'name'
  228. );
  229. }
  230. public function role($role,$user=null){
  231. return Bugs::$sql->query("
  232. SELECT count(1) count
  233. FROM r_project_user r
  234. RIGHT JOIN project_roles pr
  235. ON pr.id = r.r_id
  236. AND pr.name = ?
  237. WHERE r.p_id = ?
  238. AND r.u_id = ?
  239. ",'sii',$role,$this->id,$user?$user->id:Bugs::$user->id)->assoc_result['count']!==0;
  240. }
  241. public function issue($name,$description,$priority=null,$user=null){
  242. return Bugs::issue($name,$description,$priority,$user,$this);
  243. }
  244. }
  245. ?>