api.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. <?php
  2. require_once('php/include.php');
  3. // TODO - Add API handling.
  4. $method = $_SERVER['REQUEST_METHOD'];
  5. $ret = array();
  6. if(isset($_GET['type'])){
  7. if(isset($_GET['id'])){
  8. $id = $_GET['id'];
  9. switch($_GET['type']){
  10. case 'user':
  11. back(true);
  12. if(!isset($_GET['template'])){
  13. $ret['template'] = file_get_contents(PATH_DATA.'pages/user.template');
  14. }
  15. if($user = userObj($id)){
  16. $context = array(
  17. 'name'=>$user['name'],
  18. 'email'=>$user['email']
  19. );
  20. if($LOGGEDIN){
  21. $context['key'] = true;
  22. $context['user'] = userObj($_SESSION['username']);
  23. };
  24. $ret['context'] = $context;
  25. }else{
  26. $ret['state'] = array(
  27. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  28. );
  29. }
  30. retj($ret,'User - '.$context['name']);
  31. break;
  32. case 'group':
  33. back(true);
  34. // TODO - handle group requests
  35. if(false){
  36. // TODO
  37. }else{
  38. $ret['state'] = array(
  39. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  40. );
  41. }
  42. retj($ret,'Project - '.$context['title']);
  43. break;
  44. case 'issue':
  45. back(true);
  46. // TODO - handle issue requests
  47. if(false){
  48. // TODO
  49. }else{
  50. $ret['state'] = array(
  51. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  52. );
  53. }
  54. retj($ret,'Project - '.$context['title']);
  55. break;
  56. case 'scrum':
  57. back(true);
  58. // TODO - handle scrum requests
  59. if(false){
  60. // TODO
  61. }else{
  62. $ret['state'] = array(
  63. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  64. );
  65. }
  66. retj($ret,'Project - '.$context['title']);
  67. break;
  68. case 'project':
  69. back(true);
  70. if(!isset($_GET['template'])){
  71. $ret['template'] = file_get_contents(PATH_DATA.'pages/project.template');
  72. }
  73. if($context = projectObj($id)){
  74. $context['user'] = userObj($context['user']);
  75. if($LOGGEDIN){
  76. $context['key'] = true;
  77. $context['user'] = userObj($_SESSION['username']);
  78. };
  79. $ret['context'] = $context;
  80. }else{
  81. $ret['state'] = array(
  82. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  83. );
  84. }
  85. retj($ret,'Project - '.$context['title']);
  86. break;
  87. case 'message':
  88. // TODO - handle message requests
  89. if(false){
  90. // TODO
  91. }else{
  92. $ret['state'] = array(
  93. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  94. );
  95. }
  96. retj($ret,'Project - '.$context['title']);
  97. break;
  98. case 'admin':
  99. back(true);
  100. // TODO - handle admin requests
  101. if(false){
  102. // TODO
  103. }else{
  104. $ret['state'] = array(
  105. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  106. );
  107. }
  108. retj($ret,'Project - '.$context['title']);
  109. break;
  110. case 'page':
  111. $title = $id;
  112. if(file_exists(PATH_DATA.'pages/'.$id.'.template')){
  113. $context = array();
  114. $ret['template'] = $id;
  115. if($LOGGEDIN){
  116. $context['key'] = true;
  117. $context['user'] = userObj($_SESSION['username']);
  118. };
  119. if(file_exists(PATH_DATA.'pages/'.$id.'.options')){
  120. $options = objectToarray(json_decode(file_get_contents(PATH_DATA.'pages/'.$id.'.options'),true));
  121. if(isset($options['secure'])&&$options['secure']&&!$LOGGEDIN){
  122. back(true);
  123. }
  124. if(isset($options['title'])){
  125. $title = $options['title'];
  126. }
  127. if(isset($options['context'])){
  128. foreach($options['context'] as $key){
  129. switch($key){
  130. case 'users':
  131. if($res = query("SELECT name FROM `users`;")){
  132. $context['users'] = fetch_all($res,MYSQLI_ASSOC);
  133. }
  134. break;
  135. case 'projects':
  136. if($res = query("SELECT p.title,p.id,p.description,u.name as user FROM `projects` p JOIN `users` u ON u.id = p.u_id")){
  137. $context['projects'] = fetch_all($res,MYSQLI_ASSOC);
  138. foreach($context['projects'] as $key => $project){
  139. $context['projects'][$key]['user'] = userObj($project['user']);
  140. }
  141. }
  142. break;
  143. case 'messages':
  144. if($LOGGEDIN){
  145. $context['messages'] = messages($context['user']['id'],'user');
  146. }else{
  147. $context['messages'] = array();
  148. }
  149. break;
  150. }
  151. }
  152. }
  153. if(isset($options['actions'])){
  154. foreach($options['actions'] as $key){
  155. switch($key){
  156. case 'pm_mark_read':
  157. query("UPDATE `users` SET last_pm_check=CURRENT_TIMESTAMP WHERE id='%d'; ",array(userId($_SESSION['username'])));
  158. break;
  159. }
  160. }
  161. }
  162. }
  163. $ret['context'] = $context;
  164. }else{
  165. $ret['error'] = 'That page does not exist';
  166. }
  167. retj($ret,$title);
  168. break;
  169. case 'manifest':
  170. case 'pages':
  171. if(isset($_GET['id'])){
  172. $manifest = array();
  173. $files = array_diff(scandir(PATH_DATA.'/'.$_GET['id']),array('..', '.','.htaccess','version'));
  174. foreach($files as $k => $file){
  175. if(pathinfo(PATH_DATA.'/'.$_GET['id'].'/'.$file,PATHINFO_EXTENSION) == 'template'){
  176. array_push($manifest,basename($file,'.template'));
  177. }
  178. }
  179. retj(array(
  180. 'manifest'=>$manifest
  181. ));
  182. }else{
  183. retj(array(
  184. 'error'=>'Manifest ID not defined'
  185. ));
  186. }
  187. break;
  188. break;
  189. case 'template':
  190. if(isset($_GET['name'])){
  191. retj(array(
  192. 'template'=>file_get_contents(PATH_DATA.'/'.$_GET['id'].'/'.$_GET['name'].'.template'),
  193. 'name'=>$_GET['name']
  194. ));
  195. }else{
  196. retj(array(
  197. 'error'=>'Template name missing'
  198. ));
  199. }
  200. break;
  201. case 'action':
  202. switch($id){
  203. case 'login':
  204. $ret['state'] = array(
  205. 'data'=>array(
  206. 'type'=>'page',
  207. 'id'=>'login',
  208. )
  209. );
  210. if(isset($_GET['username'])&&isset($_GET['password'])){
  211. $key = login($_GET['username'],$_GET['password']);
  212. if($key){
  213. $_SESSION['username'] = $_GET['username'];
  214. }else{
  215. $ret['error'] = "Login failed. Username or Password didn't match.";
  216. }
  217. }else{
  218. $ret['error'] = "Please provide a valid username and password.";
  219. }
  220. retj($ret,$id);
  221. break;
  222. case 'register':
  223. $ret['state'] = array(
  224. 'data'=>array(
  225. 'type'=>'page',
  226. 'id'=>'register'
  227. )
  228. );
  229. if(is_valid('username')&&is_valid('password')&&is_valid('password1')&&is_valid('email')&&is_valid('captcha')){
  230. if($_GET['password']==$_GET['password1']){
  231. if(compare_captcha($_GET['captcha'])){
  232. if(addUser($_GET['username'],$_GET['password'],$_GET['email'])){
  233. $key = login($_GET['username'],$_GET['password']);
  234. $_SESSION['username'] = $_GET['username'];
  235. sendMail('welcome','Welcome!',$_GET['email'],get('email'),array($_GET['username'],$_GET['password'],get('email')));
  236. }else{
  237. $ret['error'] = "Could not add user. ".$mysqli->error;
  238. }
  239. }else{
  240. $ret['error'] = "Captcha did not match.";
  241. }
  242. }else{
  243. $ret['error'] = "Passwords didn't match.";
  244. }
  245. }else{
  246. $ret['error'] = "Please fill in all the fields.";
  247. }
  248. retj($ret,$id);
  249. break;
  250. case 'project':
  251. back(true);
  252. $ret['state'] = array(
  253. 'data'=>array(
  254. 'type'=>'page',
  255. 'id'=>$id,
  256. )
  257. );
  258. if(isset($_GET['pid'])){
  259. $ret['error'] = 'Invalid Action';
  260. }elseif(is_valid('title')&&is_valid('description')){
  261. if(!newProject($_GET['title'],$_GET['description'])){
  262. $ret['error'] = 'Unable to create project.';
  263. }
  264. }else{
  265. $ret['error'] = 'Fill in all the details.';
  266. }
  267. retj($ret,$id);
  268. break;
  269. case 'message':
  270. back(true);
  271. if(isset($_GET['to'])&&isset($_GET['message'])){
  272. if($uid = userId($_GET['to'])){
  273. if(!personal_message($uid,$_GET['message'])){
  274. $ret['error'] = 'Could not send message';
  275. }
  276. }else{
  277. $ret['error'] = "That user doesn't exist";
  278. }
  279. }else{
  280. $ret['error'] = 'Empty details';
  281. }
  282. retj($ret,$id);
  283. break;
  284. case 'notifications':
  285. if($LOGGEDIN){
  286. if($res = query("SELECT count(m.id) as notifications,UNIX_TIMESTAMP(max(m.timestamp)) as timestamp FROM `messages` m JOIN `users` u ON u.id = m.to_id WHERE u.id = %d AND u.last_pm_check < m.timestamp;",array(userId($_SESSION['username'])))){
  287. $res = $res->fetch_assoc();
  288. $ret['count'] = $res['notifications'];
  289. $ret['timestamp'] = $res['timestamp'];
  290. }
  291. }
  292. retj($ret,$_GET['title']);
  293. break;
  294. case 'comment':
  295. if(isset($_GET['comment_type'])&&isset($_GET['comment_id'])&&isset($_GET['message'])){
  296. $cid = $_GET['comment_id'];
  297. $ret = array(
  298. 'state'=>stateObj($_GET['comment_type'],$cid)
  299. );
  300. switch($_GET['comment_type']){
  301. case 'project':
  302. if(!function_exists('project_comment')){
  303. $ret['error'] = "fn doesn't exist!";
  304. }
  305. if(!project_comment($cid,$_GET['message'])){
  306. $ret = array(
  307. 'error'=>'Could not comment on project'
  308. );
  309. }
  310. break;
  311. default:
  312. $ret['error'] = 'Comment type not implemented';
  313. }
  314. }else{
  315. $ret['error'] = 'Missing comment paremeters';
  316. $ret['state'] = array(
  317. 'title'=>'error'
  318. );
  319. }
  320. retj($ret,$ret['state']['title']);
  321. break;
  322. default:
  323. retj(array(
  324. 'error'=>'Invalid action.'
  325. ));
  326. }
  327. break;
  328. default:
  329. retj(array(
  330. 'error'=>'Invalid type.'
  331. ));
  332. }
  333. }else{
  334. retj(array(
  335. 'error'=>'ID missing.'
  336. ));
  337. }
  338. }else{
  339. $_GET['type'] = '';
  340. retj(array(
  341. 'error'=>'Type missing.'
  342. ));
  343. }
  344. ?>