import { getCourseId } from "./utils-ENV.js";
const DB_TEMPLATE_LIST_HEADER = `
| Json |
`;
const DB_TEMPLATE_LIST_ENTRY = `
| ##timeadded## |
##user## |
[[Json]] |
`;
const DB_TEMPLATE_LIST_FOOTER = `
`;
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,
};