@webhare/moodle-webservice
Version:
Moodle Web Service API client with intellisense and typechecking
68 lines (67 loc) • 3.53 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const MoodleAttemptUpdate_1 = __importDefault(require("./MoodleAttemptUpdate"));
const MoodleQuestion_1 = __importDefault(require("./MoodleQuestion"));
const debug_1 = __importDefault(require("debug"));
class MoodleAttempt {
//TODO: Replace with Custom Error class in the future
static _error(message) {
return new Error(message);
}
static parse(attempt) {
MoodleAttempt._debug(`Parsing attempt: ${attempt.attempt.id}...`);
const parsedQuestions = MoodleQuestion_1.default.parseQuestions(attempt.questions);
MoodleAttempt._debug(`Successfully parsed attempt: ${attempt.attempt.id}.`);
return { ...attempt, questions: parsedQuestions };
}
/**Returns attempt data as new update object that can be passed to `saveAttempt` or `processAttempt` */
static toUpdate(attempt) {
MoodleAttempt._debug(`Converting attempt with id: <${attempt.attempt.id}> to update object...`);
const questionUpdates = [];
const questions = attempt.questions;
for (const question of questions) {
questionUpdates.push(MoodleQuestion_1.default.toUpdate(question));
}
const update = new MoodleAttemptUpdate_1.default(questionUpdates);
MoodleAttempt._debug(`Successfully converted attempt with id: <${attempt.attempt.id}> to update object.`);
return update;
}
/**Cheats answers from one moodle attempt review and returns new moodle attempt data with solved questions*/
static cheatFrom(destination, source) {
if (destination.attempt.quiz !== source.attempt.quiz)
throw MoodleAttempt._error(`Trying to cheat solution from an attempt of a different quiz.`);
MoodleAttempt._debug(`Cheating solution from attempt: <${source.attempt.id}>, to attempt: <${destination.attempt.id}>...`);
const newQuestions = [];
const destQuestions = destination.questions;
const sourceQuestions = [...source.questions];
for (const destQuestion of destQuestions) {
let matchingQuestion;
let matchingQIndex;
for (let i = 0; i < sourceQuestions.length; i++) {
const sourceQuestion = sourceQuestions[i];
const match = MoodleQuestion_1.default.match(destQuestion, sourceQuestion);
if (match) {
matchingQuestion = sourceQuestion;
matchingQIndex = i;
break;
}
}
if (matchingQuestion) {
sourceQuestions.splice(matchingQIndex, 1);
const solvedQuestion = MoodleQuestion_1.default.cheatFrom(destQuestion, matchingQuestion, false);
newQuestions.push(solvedQuestion);
}
else {
MoodleAttempt._debug(`Could not find matching question for question with instance: <${destQuestion.instance}>, cannot cheat answer.`);
newQuestions.push(destQuestion);
}
}
MoodleAttempt._debug(`Successfully cheated solution from attempt: <${source.attempt.id}>, to attempt: <${destination.attempt.id}>.`);
return { ...destination, questions: newQuestions };
}
}
MoodleAttempt._debug = (0, debug_1.default)("moodle:helper:attempt");
exports.default = MoodleAttempt;