aboutsummaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2026-07-05 19:16:51 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2026-07-05 19:16:51 +0200
commitfdd9a4aba9929ee21cb796b6696e64e96505447a (patch)
tree8414f9a065c51dfec3370c9dcc99e050738106bb /js
parentc250201362c64ff4a6b1e9d077d938d771d55205 (diff)
downloadbycs-sol-fdd9a4aba9929ee21cb796b6696e64e96505447a.tar.gz
bycs-sol-fdd9a4aba9929ee21cb796b6696e64e96505447a.zip
database: fix DB discovery and define public graduation fields
Diffstat (limited to 'js')
-rw-r--r--js/database.js30
-rw-r--r--js/graduation-common.js43
-rw-r--r--js/graduation-mock.js2
-rw-r--r--js/graduation-prod.js2
-rw-r--r--js/mock.js14
5 files changed, 74 insertions, 17 deletions
diff --git a/js/database.js b/js/database.js
index 627acbe..7fd3d47 100644
--- a/js/database.js
+++ b/js/database.js
@@ -1,3 +1,5 @@
+import { getCourseId } from "./config.js";
+
const DB_TEMPLATE_LIST_HEADER = `
<table class="table table-striped">
<thead>
@@ -19,26 +21,29 @@ const DB_TEMPLATE_LIST_FOOTER = `
</table>
`;
-let studentDbs = null;
+let studentDbs = populateStudentDbs();
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');
- studentDbs = new Map();
+ let dbs = new Map();
for (const link of courseDoc.querySelectorAll("div.activityname > a.aalink")) {
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=(\d+)/)[1]
- if (!studentDbs.has(studentId)) {
- studentDbs.set(studentId, {});
+ if (!dbs.has(studentId)) {
+ dbs.set(studentId, {});
}
- studentDbs.get(studentId)[dbType.lower()] = new DB(dbId);
+ dbs.get(studentId)[dbType.toLowerCase()] = new DB(dbId);
}
+
+ return dbs;
}
class DB {
@@ -55,9 +60,8 @@ class DB {
}
static async getStudentDbs(student) {
- if (!studentDbs)
- await populateStudentDbs();
- return studentDbs[student.id];
+ const dbs = await studentDbs;
+ return dbs.get(student.id);
}
}
@@ -87,7 +91,8 @@ async function loadFromDatabaseActivity(id, params) {
}
async function loadFromStudentDatabase(student, type) {
- const db = await DB.getStudentDbs(student)[type];
+ const dbs = await DB.getStudentDbs(student);
+ const db = dbs[type];
return await db.fetchEntries()
}
@@ -99,8 +104,8 @@ async function addEntryToDatabaseActivity(id, json) {
const formData = new FormData(form);
- for (const key in formData.keys()) {
- if (k.startsWith("field_")) {
+ for (const key of formData.keys()) {
+ if (key.startsWith("field_")) {
formData.set(key, json);
// We found our json key
break;
@@ -116,7 +121,8 @@ async function addEntryToDatabaseActivity(id, json) {
}
async function addEntryToStudentDatabase(student, type, json) {
- const db = await DB.getStudentDbs(student)[type];
+ const dbs = await DB.getStudentDbs(student);
+ const db = dbs[type];
await db.saveEntry(json);
}
diff --git a/js/graduation-common.js b/js/graduation-common.js
index 94fd0d6..3ab1fdd 100644
--- a/js/graduation-common.js
+++ b/js/graduation-common.js
@@ -19,6 +19,26 @@ class GraduationChange {
].includes(this.change);
}
+ publicDBFields () {
+ return {
+ "change": this.change,
+ };
+ }
+
+ dbFields () {
+ return {
+ "change": this.change,
+ "reason": this.reason,
+ "context": this.context,
+ };
+ }
+
+ static fromDBEntry(e) {
+ const {date, coach, json} = e;
+ const change = JSON.parse(json);
+ return new GraduationChange(new Date(date), change.change, change.reason, coach, change.context);
+ }
+
static newGreenPointChange(reason, coach) {
return new GraduationChange(new Date(), "GrĂ¼n", reason, coach, "");
}
@@ -178,8 +198,8 @@ class Observation {
}
}
-async function fetchGraduationChanges(student) {
- const data = await loadFromStudentDatabase(student, "shadow");
+async function fetchGraduationChangesFromDb(student, type) {
+ const data = await loadFromStudentDatabase(student, type);
let changes = [];
for (const e of data) {
@@ -189,11 +209,24 @@ async function fetchGraduationChanges(student) {
return changes;
}
+async function fetchGraduationChanges(student) {
+ return fetchGraduationChangesFromDb(student, "shadow");
+}
+
+async function fetchPublicGraduationChanges(student) {
+ return fetchGraduationChangesFromDb(student, "public");
+}
+
async function fetchGraduation(student) {
const changes = await fetchGraduationChanges(student);
return Graduation.from(student, changes);
}
+async function fetchPublicGraduation(student) {
+ const changes = await fetchPublicGraduationChanges(student);
+ return Graduation.from(student, changes);
+}
+
async function submitGraduationChange(student, change) {
student.graduation.addChange(change);
@@ -203,12 +236,12 @@ async function submitGraduationChange(student, change) {
if (change.isPublic()) {
promises.push(
// TODO(muhq): strip non public fields from changes
- addEntryToStudentDatabase(student, "public", JSON.stringify(change))
+ addEntryToStudentDatabase(student, "public", JSON.stringify(change.publicDBFields()))
);
}
promises.push(
- addEntryToStudentDatabase(student, "shadow", JSON.stringify(change))
+ addEntryToStudentDatabase(student, "shadow", JSON.stringify(change.dbFields()))
);
await Promise.all(promises);
@@ -224,7 +257,9 @@ export {
GraduationChange,
Graduation,
fetchGraduation,
+ fetchPublicGraduation,
fetchGraduationChanges,
+ fetchPublicGraduationChanges,
submitGraduationChange,
submitObservation,
diff --git a/js/graduation-mock.js b/js/graduation-mock.js
index eb8b3a4..1c84433 100644
--- a/js/graduation-mock.js
+++ b/js/graduation-mock.js
@@ -10,6 +10,7 @@ import {
import {
fetchGraduationMock as fetchGraduation,
+ fetchPublicGraduationMock as fetchPublicGraduation,
submitGraduationChangeMock as submitGraduationChange,
submitObservationMock as submitObservation
} from "./mock.js";
@@ -19,6 +20,7 @@ export {
GraduationChange,
Graduation,
fetchGraduation,
+ fetchPublicGraduation,
submitGraduationChange,
submitObservation,
diff --git a/js/graduation-prod.js b/js/graduation-prod.js
index 198be4d..0e86956 100644
--- a/js/graduation-prod.js
+++ b/js/graduation-prod.js
@@ -3,7 +3,9 @@ export {
GraduationChange,
Graduation,
fetchGraduation,
+ fetchPublicGraduation,
fetchGraduationChanges,
+ fetchPublicGraduationChanges,
submitGraduationChange,
submitObservation,
diff --git a/js/mock.js b/js/mock.js
index 803cffb..4bcd202 100644
--- a/js/mock.js
+++ b/js/mock.js
@@ -66,7 +66,18 @@ function fetchGraduationMock(s) {
if (!changes) {
resolve(null);
} else {
- resolve(Graduation.from(s, graduationChanges[s.name]));
+ resolve(Graduation.from(s, changes));
+ }
+ });
+}
+
+function fetchPublicGraduationMock(s) {
+ return new Promise((resolve) => {
+ const changes = graduationChanges[s.name];
+ if (!changes) {
+ resolve(null);
+ } else {
+ resolve(Graduation.from(s, changes.filter((change) => change.isPublic())));
}
});
}
@@ -87,6 +98,7 @@ export {
fetchSubjectsMock,
fetchProgressMock,
fetchGraduationMock,
+ fetchPublicGraduationMock,
submitGraduationChangeMock,
submitObservationMock,
};