api.php 9.7 KB

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