public function save()

in locallib.php [200:366]


    public function save(stdClass $submission, stdClass $data) {
        global $USER, $DB, $COURSE;

        // Get OneNote page id.
        $record = $DB->get_record('local_onenote_assign_pages',
                array("assign_id" => $submission->assignment, "user_id" => $submission->userid));

        if (!$record || !$record->submission_student_page_id) {
            $this->set_error(get_string('submissionnotstarted', 'assignsubmission_onenote'));
            return false;
        }

        try {
            $onenoteapi = \local_onenote\api\base::getinstance();
        } catch (\Exception $e) {
            // Display error.
            $this->set_error($e->getMessage());
            return false;
        }

        $tempfolder = $onenoteapi->create_temp_folder();
        $tempfile = join(DIRECTORY_SEPARATOR, array(rtrim($tempfolder, DIRECTORY_SEPARATOR), uniqid('asg_'))) . '.zip';

        // Create zip file containing onenote page and related files.
        $o365userid = \local_o365\utils::get_o365_userid($USER->id);
        $downloadinfo = $onenoteapi->download_page($record->submission_student_page_id, $tempfile, $o365userid);

        if (!$downloadinfo) {
            if ($onenoteapi->is_logged_in()) {
                $this->set_error(get_string('submissiondownloadfailed', 'assignsubmission_onenote'));
            } else {
                $this->set_error(get_string('notsignedin', 'assignsubmission_onenote'));
            }
            return false;
        }

        // Retrieve OneNote page metadata and save the last time modified.
        $pagemetadata = $onenoteapi->get_page_metadata($record->submission_student_page_id);
        if (\local_o365\rest\unified::is_configured() === true) {
            $modtimeparam = 'lastModifiedDateTime';
        } else {
            $modtimeparam = 'lastModifiedTime';
        }
        $pagemetadata = $onenoteapi->process_apicall_response($pagemetadata, [$modtimeparam => null]);
        if (!empty($pagemetadata)) {
            $record->student_lastmodified = strtotime($pagemetadata[$modtimeparam]);
            $DB->update_record('local_onenote_assign_pages', $record);
        }

        // Get assignment submission size limit.
        $submissionlimit = $this->get_config('maxsubmissionsizebytes');

        // Get submission zip size.
        $submissionsize = filesize($downloadinfo['path']);

        // Check if assignment submission limit is zero, i.e. when user selected course upload limit.
        if ($submissionlimit == 0) {

            // Check if submission size is greater than course upload limit.
            if (($COURSE->maxbytes > 0) && ($submissionsize > $COURSE->maxbytes)) {

                // Display error if true.
                $this->set_error(get_string('submissionlimitexceed', 'assignsubmission_onenote'));
                return false;
            }

            // Check if submission size is greater assignment submission limit.
        } else if ($submissionsize > $submissionlimit) {

            // Display error if true.
            $this->set_error(get_string('submissionlimitexceed', 'assignsubmission_onenote'));
            return false;
        }

        $fs = get_file_storage();

        // Delete any previous attempts.
        $fs->delete_area_files($this->assignment->get_context()->id, 'assignsubmission_onenote',
                \local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA, $submission->id);

        // Prepare file record object.
        $fileinfo = array(
            'contextid' => $this->assignment->get_context()->id,
            'component' => 'assignsubmission_onenote',
            'filearea' => \local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA,
            'itemid' => $submission->id,
            'filepath' => '/',
            'filename' => 'OneNote_' . time() . '.zip'
        );

        // Save it.
        $fs->create_file_from_pathname($fileinfo, $downloadinfo['path']);
        fulldelete($tempfolder);

        $filesubmission = $this->get_file_submission($submission->id);

        // Plagiarism code event trigger when files are uploaded.
        $files = $fs->get_area_files($this->assignment->get_context()->id, 'assignsubmission_onenote',
                \local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA, $submission->id, 'id', false);

        $count = $this->count_files($submission->id, \local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA);

        $params = array(
            'context' => context_module::instance($this->assignment->get_course_module()->id),
            'courseid' => $this->assignment->get_course()->id,
            'objectid' => $submission->id,
            'other' => array(
                'content' => '',
                'pathnamehashes' => array_keys($files)
            )
        );

        if (!empty($submission->userid) && ($submission->userid != $USER->id)) {
            $params['relateduserid'] = $submission->userid;
        }

        $event = \assignsubmission_onenote\event\assessable_uploaded::create($params);
        $event->set_legacy_files($files);
        $event->trigger();

        $groupname = null;
        $groupid = 0;
        // Get the group name as other fields are not transcribed in the logs and this information is important.
        if (empty($submission->userid) && !empty($submission->groupid)) {
            $groupname = $DB->get_field('groups', 'name', array('id' => $submission->groupid), '*', MUST_EXIST);
            $groupid = $submission->groupid;
        } else {
            $params['relateduserid'] = $submission->userid;
        }

        // Unset the objectid and other field from params for use in submission events.
        unset($params['objectid']);
        unset($params['other']);
        $params['other'] = array(
            'submissionid' => $submission->id,
            'submissionattempt' => $submission->attemptnumber,
            'submissionstatus' => $submission->status,
            'filesubmissioncount' => $count,
            'groupid' => $groupid,
            'groupname' => $groupname
        );

        if ($filesubmission) {
            $filesubmission->numfiles =
              $this->count_files($submission->id, \local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA);
            $updatestatus = $DB->update_record('assignsubmission_onenote', $filesubmission);
            $params['objectid'] = $filesubmission->id;

            $event = \assignsubmission_onenote\event\submission_updated::create($params);
            $event->set_assign($this->assignment);
            $event->trigger();
            return $updatestatus;
        } else {
            $filesubmission = new stdClass();
            $filesubmission->numfiles =
              $this->count_files($submission->id, \local_onenote\api\base::ASSIGNSUBMISSION_ONENOTE_FILEAREA);
            $filesubmission->submission = $submission->id;
            $filesubmission->assignment = $this->assignment->get_instance()->id;
            $filesubmission->id = $DB->insert_record('assignsubmission_onenote', $filesubmission);
            $params['objectid'] = $filesubmission->id;

            $event = \assignsubmission_onenote\event\submission_created::create($params);
            $event->set_assign($this->assignment);
            $event->trigger();
            return $filesubmission->id > 0;
        }
    }