Example #1
0
 public function submissions(SubmissionsRequest $request)
 {
     switch ($request->getActionType()) {
         case ActionType::GET:
             $result;
             switch ($request->getLms()) {
                 case Lms::CANVAS:
                     $canvas = new CanvasHelper(DataType::SUBMISSIONS);
                     $result = $canvas->processSubmissionsRequest($request);
                     break;
                 default:
                     $canvas = new CanvasHelper(DataType::SUBMISSIONS);
                     $result = $canvas->processSubmissionsRequest($request);
                     break;
             }
             return $result;
         default:
             throw new InvalidActionException($request->getActionType(), get_class($request));
     }
 }
 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());
     }
 }
Example #3
0
 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());
 }