aboutsummaryrefslogtreecommitdiff
path: root/src/database.js
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2026-08-05 11:51:51 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2026-08-05 11:51:51 +0200
commit582df8885a3573a728394b473b826616f8969316 (patch)
tree9c21db03f4fbfd9956ee398e0d9194ebfa5b3234 /src/database.js
parent46ac53e11b49a7f9cdb92c3559b05f41ce90122f (diff)
downloadbycs-sol-582df8885a3573a728394b473b826616f8969316.tar.gz
bycs-sol-582df8885a3573a728394b473b826616f8969316.zip
convert a lot of js to typescript and use a single graduation DB
Diffstat (limited to 'src/database.js')
-rw-r--r--src/database.js160
1 files changed, 0 insertions, 160 deletions
diff --git a/src/database.js b/src/database.js
deleted file mode 100644
index e929896..0000000
--- a/src/database.js
+++ /dev/null
@@ -1,160 +0,0 @@
-import { getCourseId } from "./utils-ENV.js";
-
-const DB_TEMPLATE_LIST_HEADER = `
-<table class="table table-striped">
- <thead>
- <tr>
- <th>Json</th>
- </tr>
- </thead>
- <tbody>
-`;
-const DB_TEMPLATE_LIST_ENTRY = `
-<tr class="db-row">
- <td class="db-cell" data-key="date">##timeadded##</td>
- <td class="db-cell" data-key="coach">##user##</td>
- <td class="db-cell" data-key="json">[[Json]]</td>
-</tr>
-`;
-const DB_TEMPLATE_LIST_FOOTER = `
- </tbody>
-</table>
-`;
-
-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,
-};