PageRenderTime 64ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/api/v0/Tasks.php

https://github.com/TheRosettaFoundation/SOLAS-Match
PHP | 360 lines | 299 code | 58 blank | 3 comment | 4 complexity | 3e93e3d28383e3d35172d076bca49387 MD5 | raw file
  1. <?php
  2. namespace SolasMatch\API\V0;
  3. use \SolasMatch\Common as Common;
  4. use \SolasMatch\API\DAO as DAO;
  5. use \SolasMatch\API\Lib as Lib;
  6. use \SolasMatch\API as API;
  7. use Psr\Http\Message\ResponseInterface as Response;
  8. use Psr\Http\Message\ServerRequestInterface as Request;
  9. require_once __DIR__."/../DataAccessObjects/TaskDao.class.php";
  10. require_once __DIR__."/../../Common/protobufs/models/TaskMetadata.php";
  11. require_once __DIR__."/../../Common/protobufs/emails/UserFeedback.php";
  12. require_once __DIR__."/../../Common/protobufs/emails/OrgFeedback.php";
  13. require_once __DIR__."/../lib/IO.class.php";
  14. require_once __DIR__."/../lib/Upload.class.php";
  15. require_once __DIR__."/../../Common/lib/SolasMatchException.php";
  16. class Tasks
  17. {
  18. public static function init()
  19. {
  20. global $app;
  21. $app->put(
  22. '/api/v0/tasks/{taskId}/prerequisites/{preReqId}/',
  23. '\SolasMatch\API\V0\Tasks:addTaskPreReq')
  24. ->add('\SolasMatch\API\Lib\Middleware:authUserOrOrgForTaskCreationPassingTaskId');
  25. $app->delete(
  26. '/api/v0/tasks/{taskId}/prerequisites/{preReqId}/',
  27. '\SolasMatch\API\V0\Tasks:removeTaskPreReq')
  28. ->add('\SolasMatch\API\Lib\Middleware:authenticateUserForOrgTask');
  29. $app->put(
  30. '/api/v0/tasks/{taskId}/orgFeedback/',
  31. '\SolasMatch\API\V0\Tasks:sendOrgFeedback')
  32. ->add('\SolasMatch\API\Lib\Middleware:authenticateUserForOrgTask');
  33. $app->put(
  34. '/api/v0/tasks/{taskId}/sendOrgFeedbackDeclined/',
  35. '\SolasMatch\API\V0\Tasks:sendOrgFeedbackDeclined');
  36. $app->put(
  37. '/api/v0/tasks/{taskId}/userFeedback/',
  38. '\SolasMatch\API\V0\Tasks:sendUserFeedback')
  39. ->add('\SolasMatch\API\Lib\Middleware:authUserForClaimedTask');
  40. $app->get(
  41. '/api/v0/tasks/{taskId}/alsoViewedTasks/{limit}/{offset}/',
  42. '\SolasMatch\API\V0\Tasks:getAlsoViewedTasks')
  43. ->add('\SolasMatch\API\Lib\Middleware:isloggedIn');
  44. $app->get(
  45. '/api/v0/tasks/{taskId}/prerequisites/',
  46. '\SolasMatch\API\V0\Tasks:getTaskPreReqs')
  47. ->add('\SolasMatch\API\Lib\Middleware:authUserOrOrgForClaimedTask');
  48. $app->get(
  49. '/api/v0/tasks/{taskId}/reviews/',
  50. '\SolasMatch\API\V0\Tasks:getTaskReview')
  51. ->add('\SolasMatch\API\Lib\Middleware:authUserOrOrgForClaimedTask');
  52. $app->get(
  53. '/api/v0/tasks/{taskId}/tags/',
  54. '\SolasMatch\API\V0\Tasks:getTasksTags');
  55. $app->get(
  56. '/api/v0/tasks/{taskId}/version/',
  57. '\SolasMatch\API\V0\Tasks:getTaskVersion')
  58. ->add('\SolasMatch\API\Lib\Middleware:isloggedIn');
  59. $app->get(
  60. '/api/v0/tasks/{taskId}/info/',
  61. '\SolasMatch\API\V0\Tasks:getTaskInfo')
  62. ->add('\SolasMatch\API\Lib\Middleware:isloggedIn');
  63. $app->get(
  64. '/api/v0/tasks/{taskId}/claimed/',
  65. '\SolasMatch\API\V0\Tasks:getTaskClaimed')
  66. ->add('\SolasMatch\API\Lib\Middleware:isloggedIn');
  67. $app->get(
  68. '/api/v0/tasks/{taskId}/user/',
  69. '\SolasMatch\API\V0\Tasks:getUserClaimedTask')
  70. ->add('\SolasMatch\API\Lib\Middleware:isloggedIn');
  71. $app->get(
  72. '/api/v0/tasks/{taskId}/timeClaimed/',
  73. '\SolasMatch\API\V0\Tasks:getClaimedTime')
  74. ->add('\SolasMatch\API\Lib\Middleware:isloggedIn');
  75. $app->put(
  76. '/api/v0/tasks/archiveTask/{taskId}/user/{userId}/',
  77. '\SolasMatch\API\V0\Tasks:archiveTask')
  78. ->add('\SolasMatch\API\Lib\Middleware:authenticateSiteAdmin');
  79. $app->put(
  80. '/api/v0/tasks/recordView/{taskId}/user/{userId}/',
  81. '\SolasMatch\API\V0\Tasks:recordTaskView')
  82. ->add('\SolasMatch\API\Lib\Middleware:isloggedIn');
  83. $app->get(
  84. '/api/v0/tasks/proofreadTask/{taskId}/',
  85. '\SolasMatch\API\V0\Tasks:getProofreadTask')
  86. ->add('\SolasMatch\API\Lib\Middleware:isloggedIn');
  87. $app->post(
  88. '/api/v0/tasks/reviews/',
  89. '\SolasMatch\API\V0\Tasks:submitReview')
  90. ->add('\SolasMatch\API\Lib\Middleware:authenticateUserToSubmitReview');
  91. $app->get(
  92. '/api/v0/tasks/topTasksCount/',
  93. '\SolasMatch\API\V0\Tasks:getTopTasksCount');
  94. $app->get(
  95. '/api/v0/tasks/topTasks/',
  96. '\SolasMatch\API\V0\Tasks:getTopTasks');
  97. $app->get(
  98. '/api/v0/tasks/{taskId}/',
  99. '\SolasMatch\API\V0\Tasks:getTask');
  100. $app->put(
  101. '/api/v0/tasks/{taskId}/',
  102. '\SolasMatch\API\V0\Tasks:updateTask')
  103. ->add('\SolasMatch\API\Lib\Middleware:authUserOrOrgForTaskCreationPassingTaskId');
  104. $app->delete(
  105. '/api/v0/tasks/{taskId}/',
  106. '\SolasMatch\API\V0\Tasks:deleteTask')
  107. ->add('\SolasMatch\API\Lib\Middleware:authUserOrOrgForTaskCreationPassingTaskId');
  108. $app->get(
  109. '/api/v0/tasks/',
  110. '\SolasMatch\API\V0\Tasks:getTasks');
  111. $app->post(
  112. '/api/v0/tasks/',
  113. '\SolasMatch\API\V0\Tasks:createTask')
  114. ->add('\SolasMatch\API\Lib\Middleware:authUserOrOrgForTaskCreation');
  115. }
  116. public static function addTaskPreReq(Request $request, Response $response, $args)
  117. {
  118. $taskId = $args['taskId'];
  119. $preReqId = $args['preReqId'];
  120. return API\Dispatcher::sendResponse($response, Lib\Upload::addTaskPreReq($taskId, $preReqId), null);
  121. }
  122. public static function removeTaskPreReq(Request $request, Response $response, $args)
  123. {
  124. $taskId = $args['taskId'];
  125. $preReqId = $args['preReqId'];
  126. return API\Dispatcher::sendResponse($response, Lib\Upload::removeTaskPreReq($taskId, $preReqId), null);
  127. }
  128. // Org Feedback, feedback sent from the organisation to the user who claimed the task
  129. public static function sendOrgFeedback(Request $request, Response $response, $args)
  130. {
  131. $taskId = $args['taskId'];
  132. $data = (string)$request->getBody();
  133. $client = new Common\Lib\APIHelper('.json');
  134. $feedbackData = $client->deserialize($data, "\SolasMatch\Common\Protobufs\Emails\OrgFeedback");
  135. Lib\Notify::sendOrgFeedback($feedbackData);
  136. return API\Dispatcher::sendResponse($response, null, null);
  137. }
  138. // If DECLINED status comes from Memsource, notify claimant
  139. public static function sendOrgFeedbackDeclined(Request $request, Response $response, $args)
  140. {
  141. $taskId = $args['taskId'];
  142. $data = (string)$request->getBody();
  143. $client = new Common\Lib\APIHelper('.json');
  144. $feedbackData = $client->deserialize($data, '\SolasMatch\Common\Protobufs\Emails\OrgFeedback');
  145. $task_id = $feedbackData->getTaskId();
  146. $claimant_id = $feedbackData->getClaimantId();
  147. $user_id = $feedbackData->getUserId();
  148. $feedback = $feedbackData->getFeedback();
  149. $pos = strpos($feedback, '::');
  150. $data = substr($feedback, 0, $pos);
  151. $feedback = substr($feedback, $pos + 2);
  152. $feedbackData->setFeedback($feedback);
  153. $task_claimant_user = DAO\TaskDao::decrypt_to_verify_integrity($data);
  154. if ($task_claimant_user === "$task_id,$claimant_id,$user_id") Lib\Notify::sendOrgFeedback($feedbackData);
  155. else error_log("Security mismatch: $task_claimant_user !== $task_id,$claimant_id,$user_id");
  156. return API\Dispatcher::sendResponse($response, null, null);
  157. }
  158. // User Feedback, feedback sent from the user who claimed the task to the organisation
  159. public static function sendUserFeedback(Request $request, Response $response, $args)
  160. {
  161. $taskId = $args['taskId'];
  162. $data = (string)$request->getBody();
  163. $client = new Common\Lib\APIHelper('.json');
  164. $feedbackData = $client->deserialize($data, "\SolasMatch\Common\Protobufs\Emails\UserFeedback");
  165. Lib\Notify::sendUserFeedback($feedbackData);
  166. return API\Dispatcher::sendResponse($response, null, null);
  167. }
  168. public static function getAlsoViewedTasks(Request $request, Response $response, $args)
  169. {
  170. $taskId = $args['taskId'];
  171. $limit = $args['limit'];
  172. $offset = $args['offset'];
  173. return API\Dispatcher::sendResponse($response,
  174. DAO\TaskDao::getAlsoViewedTasks(
  175. $taskId,
  176. $limit,
  177. $offset
  178. ),
  179. null
  180. );
  181. }
  182. public static function getTaskPreReqs(Request $request, Response $response, $args)
  183. {
  184. $taskId = $args['taskId'];
  185. return API\Dispatcher::sendResponse($response, DAO\TaskDao::getTaskPreReqs($taskId), null);
  186. }
  187. public static function getTaskReview(Request $request, Response $response, $args)
  188. {
  189. $taskId = $args['taskId'];
  190. $review = DAO\TaskDao::getTaskReviews(null, $taskId);
  191. return API\Dispatcher::sendResponse($response, $review, null);
  192. }
  193. public static function getTasksTags(Request $request, Response $response, $args)
  194. {
  195. $taskId = $args['taskId'];
  196. return API\Dispatcher::sendResponse($response, DAO\TaskDao::getTags($taskId), null);
  197. }
  198. public static function getTaskVersion(Request $request, Response $response, $args)
  199. {
  200. $taskId = $args['taskId'];
  201. $userId = API\Dispatcher::clenseArgs($request, 'userId', null);
  202. return API\Dispatcher::sendResponse($response, DAO\TaskDao::getLatestFileVersion($taskId, $userId), null);
  203. }
  204. public static function getTaskInfo(Request $request, Response $response, $args)
  205. {
  206. $taskId = $args['taskId'];
  207. $version = API\Dispatcher::clenseArgs($request, 'version', 0);
  208. $taskMetadata = Common\Lib\ModelFactory::buildModel(
  209. "TaskMetadata",
  210. DAO\TaskDao::getTaskFileInfo($taskId, $version)
  211. );
  212. return API\Dispatcher::sendResponse($response, $taskMetadata, null);
  213. }
  214. public static function getTaskClaimed(Request $request, Response $response, $args)
  215. {
  216. $taskId = $args['taskId'];
  217. $data = null;
  218. $userId = API\Dispatcher::clenseArgs($request, 'userId', null);
  219. if (is_numeric($userId)) {
  220. $data = DAO\TaskDao::hasUserClaimedTask($userId, $taskId);
  221. } else {
  222. $data = DAO\TaskDao::taskIsClaimed($taskId);
  223. }
  224. return API\Dispatcher::sendResponse($response, $data, null);
  225. }
  226. public static function getUserClaimedTask(Request $request, Response $response, $args)
  227. {
  228. $taskId = $args['taskId'];
  229. $data = DAO\TaskDao::getUserClaimedTask($taskId);
  230. return API\Dispatcher::sendResponse($response, $data, null);
  231. }
  232. public static function getClaimedTime(Request $request, Response $response, $args)
  233. {
  234. $taskId = $args['taskId'];
  235. $data = DAO\TaskDao::getClaimedTime($taskId);
  236. return API\Dispatcher::sendResponse($response, $data, null);
  237. }
  238. public static function archiveTask(Request $request, Response $response, $args)
  239. {
  240. $taskId = $args['taskId'];
  241. $userId = $args['userId'];
  242. return API\Dispatcher::sendResponse($response, DAO\TaskDao::moveToArchiveByID($taskId, $userId), null);
  243. }
  244. public static function recordTaskView(Request $request, Response $response, $args)
  245. {
  246. $taskId = $args['taskId'];
  247. $userId = $args['userId'];
  248. return API\Dispatcher::sendResponse($response, DAO\TaskDao::recordTaskView($taskId, $userId), null);
  249. }
  250. public static function getProofreadTask(Request $request, Response $response, $args)
  251. {
  252. $taskId = $args['taskId'];
  253. return API\Dispatcher::sendResponse($response, DAO\TaskDao::getProofreadTask($taskId), null);
  254. }
  255. public static function submitReview(Request $request, Response $response)
  256. {
  257. $data = (string)$request->getBody();
  258. $client = new Common\Lib\APIHelper('.json');
  259. $review = $client->deserialize($data, "\SolasMatch\Common\Protobufs\Models\TaskReview");
  260. return API\Dispatcher::sendResponse($response, DAO\TaskDao::submitReview($review), null);
  261. }
  262. public static function getTopTasks(Request $request, Response $response)
  263. {
  264. $limit = API\Dispatcher::clenseArgs($request, 'limit', 15);
  265. $offset = API\Dispatcher::clenseArgs($request, 'offset', 0);
  266. return API\Dispatcher::sendResponse($response, DAO\TaskDao::getLatestAvailableTasks($limit, $offset), null);
  267. }
  268. public static function getTopTasksCount(Request $request, Response $response)
  269. {
  270. return API\Dispatcher::sendResponse($response, DAO\TaskDao::getLatestAvailableTasksCount(), null);
  271. }
  272. public static function getTask(Request $request, Response $response, $args)
  273. {
  274. $taskId = $args['taskId'];
  275. return API\Dispatcher::sendResponse($response, DAO\TaskDao::getTask($taskId), null);
  276. }
  277. public static function updateTask(Request $request, Response $response, $args)
  278. {
  279. $taskId = $args['taskId'];
  280. $data = (string)$request->getBody();
  281. $client = new Common\Lib\APIHelper('.json');
  282. $data = $client->deserialize($data, "\SolasMatch\Common\Protobufs\Models\Task");
  283. return API\Dispatcher::sendResponse($response, DAO\TaskDao::save($data), null);
  284. }
  285. public static function deleteTask(Request $request, Response $response, $args)
  286. {
  287. $taskId = $args['taskId'];
  288. return API\Dispatcher::sendResponse($response, DAO\TaskDao::delete($taskId), null);
  289. }
  290. public static function getTasks(Request $request, Response $response)
  291. {
  292. return API\Dispatcher::sendResponse($response, DAO\TaskDao::getTasks(), null);
  293. }
  294. public static function createTask(Request $request, Response $response)
  295. {
  296. $data = (string)$request->getBody();
  297. $client = new Common\Lib\APIHelper('.json');
  298. $data = $client->deserialize($data, "\SolasMatch\Common\Protobufs\Models\Task");
  299. return API\Dispatcher::sendResponse($response, DAO\TaskDao::save($data), null);
  300. }
  301. }
  302. Tasks::init();