public function processSubmissionsRequest(SubmissionsRequest $request) { $asynch = false; //this variable will determine whether we'll send the request asynchronously or not. if (!isset($_SESSION)) { session_start(); } $domain = $_SESSION['domain']; $token = \Crypt::decrypt($_SESSION['userToken']); $courseId = $_SESSION['courseID']; $userId = $_SESSION['userID']; $urlPieces = array(); $urlArgs = array(); $urlPieces[] = "https://{$domain}/api/v1/courses/{$courseId}"; //MULTIPLE ASSIGNMENTS AND POTENTIALLY MULTIPLE USERS if ($request->getMultipleAssignments()) { //GET /api/v1/courses/:course_id/students/submissions $urlPieces[] = "students/submissions"; //STUDENT IDS //student_ids can be "All", or a list of actual studentIds if ($request->getMultipleStudents() && $request->getAllStudents()) { //if all students were requested, we will retrieve them by chunks so as to speed up the request $allUsers = $this->dbHelper->getUsersInCourseWithRole($courseId, 'Learner'); $count = count($allUsers); $asynch = !$count <= 20; $masterArr = array(); //this var will store al the requests we will make $requests = array(); for ($i = 0; $i <= $count - 1; $i++) { $urlArgs[] = "student_ids[]={$allUsers[$i]->user_id}"; $result = fmod($i, 10); if ($result == 0 && $asynch && $i > 0) { //we'll send the request every 10 students if ($request->getGrouped()) { $urlArgs[] = "grouped=true"; } $urlArgs[] = "access_token={$token}&per_page=100"; $url = GuzzleHelper::constructUrl($urlPieces, $urlArgs); $req = new \GuzzleHttp\Psr7\Request('GET', $url); $requests[] = $req; $urlArgs = array(); } } //for //at the end we'll have requests left that need to be sent if ($request->getGrouped()) { $urlArgs[] = "grouped=true"; } $urlArgs[] = "access_token={$token}&per_page=100"; $url = GuzzleHelper::constructUrl($urlPieces, $urlArgs); $req = new \GuzzleHttp\Psr7\Request('GET', $url); $requests[] = $req; $client = new Client(); $returnData = array(); $pool = new Pool($client, $requests, ['concurrency' => count($requests), 'fulfilled' => function ($response, $index) use(&$returnData, $request) { $newData = json_decode($response->getBody()); $processedData = $this->processCanvasSubmissionData($newData, $request->getIncludeTags(), $request->getGrouped()); $returnData = array_merge($returnData, $processedData); }, 'rejected' => function ($reason, $index) { //TODO: figure out what to do here }]); // Initiate the transfers and create a promise $promise = $pool->promise(); // Force the pool of requests to complete. $promise->wait(); return $returnData; } else { if ($request->getMultipleStudents() && count($request->getStudentIds() > 1)) { $ids = json_encode($request->getStudentIds()); $urlArgs[] = "student_ids[]={$ids}"; } else { $urlArgs[] = "student_ids[]={$request->getStudentIds()[0]}"; } } //ASSIGNMENT IDS //assignment_ids can be a list of assignmentIds, or if empty, all assignments will be returned $assignmentIds = implode(',', $request->getAssignmentIds()); if (count($request->getAssignmentIds()) > 0) { $urlArgs[] = "assignment_ids[]={$assignmentIds}"; } } else { if ($request->getMultipleStudents()) { // GET /api/v1/courses/:course_id/assignments/:assignment_id/submissions $urlPieces[] = "assignments"; //grab the first assignment id. Shouldn't have more than one (all this has been validated in the SubmissionsRequest constructor) $urlPieces[] = $request->getAssignmentIds()[0]; $urlPieces[] = "submissions"; } else { //GET /api/v1/courses/:course_id/assignments/:assignment_id/submissions if ($request->getAssignmentIds()) { $urlPieces[] = "assignments"; //input1 $urlPieces[] = $request->getAssignmentIds()[0]; // get the first assignment id from the array (there shouldn't be more than one anyway) $urlPieces[] = "submissions"; $urlPieces[] = $request->getStudentIds()[0]; } } } if (!$asynch) { if ($request->getGrouped()) { $urlArgs[] = "grouped=true"; } $urlArgs[] = "access_token={$token}&per_page=100"; $url = GuzzleHelper::constructUrl($urlPieces, $urlArgs); $response = GuzzleHelper::recursiveGet($url); return $this->processCanvasSubmissionData($response, $request->getIncludeTags(), $request->getGrouped()); } }
public function processSubmissionsRequest(SubmissionsRequest $request) { if (!isset($_SESSION)) { session_start(); } $domain = $_SESSION['domain']; $token = \Crypt::decrypt($_SESSION['userToken']); $courseId = $_SESSION['courseID']; $userId = $_SESSION['userID']; $urlPieces = array(); $urlArgs = array(); $urlPieces[] = "https://{$domain}/api/v1/courses/{$courseId}"; //MULTIPLE ASSIGNMENTS AND POTENTIALLY MULTIPLE USERS if ($request->getMultipleAssignments()) { //GET /api/v1/courses/:course_id/students/submissions $urlPieces[] = "students/submissions"; //STUDENT IDS //student_ids can be "All", or a list of actual studentIds if ($request->getMultipleStudents() && $request->getAllStudents()) { $urlArgs[] = "student_ids[]=all"; } else { if ($request->getMultipleStudents() && count($request->getStudentIds() > 1)) { $ids = json_encode($request->getStudentIds()); $urlArgs[] = "student_ids[]={$ids}"; } else { $urlArgs[] = "student_ids[]={$request->getStudentIds()[0]}"; } } //ASSIGNMENT IDS //assignment_ids can be a list of assignmentIds, or if empty, all assignments will be returned $assignmentIds = implode(',', $request->getAssignmentIds()); if (count($request->getAssignmentIds()) > 0) { $urlArgs[] = "assignment_ids[]={$assignmentIds}"; } } else { if ($request->getMultipleStudents()) { // GET /api/v1/courses/:course_id/assignments/:assignment_id/submissions $urlPieces[] = "assignments"; //grab the first assignment id. Shouldn't have more than one (all this has been validated in the SubmissionsRequest constructor) $urlPieces[] = $request->getAssignmentIds()[0]; $urlPieces[] = "submissions"; } else { //GET /api/v1/courses/:course_id/assignments/:assignment_id/submissions if ($request->getAssignmentIds()) { $urlPieces[] = "assignments"; //input1 $urlPieces[] = $request->getAssignmentIds()[0]; // get the first assignment id from the array (there shouldn't be more than one anyway) $urlPieces[] = "submissions"; $urlPieces[] = $request->getStudentIds()[0]; } } } if ($request->getGrouped()) { $urlArgs[] = "grouped=true"; } // $urlArgs[]="include[]=assignment"; //Attach token $urlArgs[] = "access_token={$token}&per_page=5000"; $url = GuzzleHelper::constructUrl($urlPieces, $urlArgs); $response = GuzzleHelper::makeRequest($request, $url); return $this->processCanvasSubmissionData(json_decode($response->getBody()), $request->getIncludeTags(), $request->getGrouped()); }