85 $score = json_decode($requestData);
87 $userId = self::getUsrIdForObjectAndUsrIdent(
$objId, $score->userId);
88 if ($userId == null) {
90 throw new Exception(
'User not available', 404);
95 !isset($score->userId) ||
96 !isset($score->gradingProgress) ||
97 !isset($score->activityProgress) ||
98 !isset($score->timestamp) ||
99 isset($score->timestamp) && !self::validate_iso8601_date($score->timestamp) ||
100 (isset($score->scoreGiven) && !is_numeric($score->scoreGiven)) ||
101 (isset($score->scoreGiven) && !isset($score->scoreMaximum)) ||
102 (isset($score->scoreMaximum) && !is_numeric($score->scoreMaximum))
106 throw new Exception(
'Incorrect score received', 400);
110 if (!isset($score->scoreMaximum)) {
111 $score->scoreMaximum = 1;
113 if (isset($score->scoreGiven)) {
114 if ($score->gradingProgress !=
'FullyGraded') {
115 $score->scoreGiven = null;
118 $result = (float)$score->scoreGiven / (
float)$score->scoreMaximum;
123 $ltiObjRes->readProperties(
$objId);
125 if (!$ltiObjRes->isAvailable()) {
126 throw new Exception(
'Tool for Object not available', 404);
130 if ($result >= $ltiObjRes->getMasteryScore()) {
135 $lp_percentage = (
int) round(100 * $result);
138 if (empty($consRes)) {
143 if (!isset($consRes->id)) {
144 $consRes->id = $DIC->database()->nextId(
'lti_consumer_results');
146 $DIC->database()->replace(
147 'lti_consumer_results',
149 'id' => array(
'integer', $consRes->id)
152 'obj_id' => array(
'integer',
$objId),
153 'usr_id' => array(
'integer', $userId),
154 'result' => array(
'float', $result)
160 $ltiTimestamp = DateTimeImmutable::createFromFormat(DateTimeInterface::RFC3339_EXTENDED, $score->timestamp);
161 if (!$ltiTimestamp) {
162 $ltiTimestamp = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, $score->timestamp);
164 if (!$ltiTimestamp) {
165 $ltiTimestamp =
new DateTime(
'now');
168 'id' => array(
'integer', $DIC->database()->nextId(
'lti_consumer_grades')),
169 'obj_id' => array(
'integer',
$objId),
170 'usr_id' => array(
'integer', $userId),
171 'score_given' => array(
'float', $score->scoreGiven),
172 'score_maximum' => array(
'float', $score->scoreMaximum),
173 'activity_progress' => array(
'text', $score->activityProgress),
174 'grading_progress' => array(
'text', $score->gradingProgress),
175 'lti_timestamp' => array(
'timestamp',$ltiTimestamp->format(
"Y-m-d H:i:s")),
176 'stored' => array(
'timestamp', date(
"Y-m-d H:i:s"))
178 $DIC->database()->insert(
'lti_consumer_grades', $gradeValues);
const LP_STATUS_COMPLETED_NUM
const LP_STATUS_IN_PROGRESS_NUM
static getByKeys(int $a_obj_id, int $a_usr_id, ?bool $a_create=false)
Get a result by object and user key.
static writeStatus(int $a_obj_id, int $a_user_id, int $a_status, int $a_percentage=0, bool $a_force_per=false, ?int &$a_old_status=self::LP_STATUS_NOT_ATTEMPTED_NUM)
Write status for user and object.