From fdd9a4aba9929ee21cb796b6696e64e96505447a Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Sun, 5 Jul 2026 19:16:51 +0200 Subject: database: fix DB discovery and define public graduation fields --- js/database.js | 30 ++++++++++++++++++------------ js/graduation-common.js | 43 +++++++++++++++++++++++++++++++++++++++---- js/graduation-mock.js | 2 ++ js/graduation-prod.js | 2 ++ js/mock.js | 14 +++++++++++++- 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 = ` @@ -19,26 +21,29 @@ const DB_TEMPLATE_LIST_FOOTER = `
`; -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, }; -- cgit v1.2.3