import { getCourseId } from "./utils-ENV.js"; const DB_TEMPLATE_LIST_HEADER = ` `; const DB_TEMPLATE_LIST_ENTRY = ` `; const DB_TEMPLATE_LIST_FOOTER = `
Json
##timeadded## ##user## [[Json]]
`; let studentDbs = populateStudentDbs(); const ID_QUERY_PARAM_REGEX = /[?&]id=(\d+)/ async function populateStudentDbs() { const courseUrl = `https://lernplattform.bycs.de/course/view.php?id=${getCourseId()}`; const courseRes = await fetch(courseUrl); const courseDoc = new DOMParser().parseFromString(await courseRes.text(), 'text/html'); let dbs = new Map(); for (const link of courseDoc.querySelectorAll("div.activityname a.aalink")) { if (link.textContent.trim() === "Submit Datenbank") { const dbId = link.href.match(ID_QUERY_PARAM_REGEX)[1] dbs.set("submit", new DB(dbId)); continue; } const match = link.textContent.match(/(\d+)(Shadow|Public|Submit)/); if (!match) continue; const studentId = match[1]; const dbType = match[2]; const dbId = link.href.match(ID_QUERY_PARAM_REGEX)[1] if (!dbs.has(studentId)) { dbs.set(studentId, {}); } dbs.get(studentId)[dbType.toLowerCase()] = new DB(dbId); } return dbs; } async function getSubmitDb() { const dbs = await studentDbs; return dbs.get("submit"); } class DB { constructor(id) { this.id = id; } async fetchEntries(params) { return loadFromDatabaseActivity(this.id, params) } async saveEntry(json) { return addEntryToDatabaseActivity(this.id, json); } static async getStudentDbs(student) { const dbs = await studentDbs; return dbs.get(student.id); } } async function loadFromDatabaseActivity(id, params) { let dbUrl = `${window.location.origin}/mod/data/view.php?id=${id}&mode=list&perpage=1000`; // TODO(muhq): Why does this not include entries? if (params) { dbUrl += "&filter=1&advanced=1"; for (const param in params) { dbUrl += `&${param}=${encodeURIComponent(params[param])}` } } const dbRes = await fetch(encodeURI(dbUrl)); const dbDoc = new DOMParser().parseFromString(await dbRes.text(), 'text/html'); let data = []; dbDoc.querySelectorAll('.db-row').forEach(row => { let entry = {}; row.querySelectorAll('.db-cell').forEach(field => { const key = field.dataset.key; let value; // Moodle includes the full date in the title attribute of the included span if (key === "date") { value = field.querySelector("span").title; } else { value = field.innerText.trim(); } entry[key] = value; }); data.push(entry); }); return data; } async function loadFromStudentDatabase(student, type) { const dbs = await DB.getStudentDbs(student); const db = dbs[type]; return await db.fetchEntries() } async function addEntryToDatabaseActivity(id, json) { const url = `/mod/data/edit.php?id=${id}`; const editRes = await fetch(url); const editDoc = new DOMParser().parseFromString(await editRes.text(), 'text/html'); const form = editDoc.querySelector('div[role="main"] > form'); const formData = new FormData(form); for (const key of formData.keys()) { if (key.startsWith("field_")) { formData.set(key, json); // We found our json key break; } } formData.set("saveandview", "Speichern"); return await fetch("/mod/data/edit.php", { method: "POST", // Set the FormData instance as the request body body: formData, }); } async function addEntryToStudentDatabase(student, type, json) { let db; // global submit database if (type === "submit") { db = await getSubmitDb(); // individuell databases } else { const dbs = await DB.getStudentDbs(student); db = dbs[type]; } await db.saveEntry(json); } export { DB, getSubmitDb, loadFromDatabaseActivity, loadFromStudentDatabase, addEntryToDatabaseActivity, addEntryToStudentDatabase, };