From e19f1dc6c1f262d01e3806f95563a072ead6e512 Mon Sep 17 00:00:00 2001
From: alex <alex@alexloehr.net>
Date: Sun, 06 Jul 2025 16:24:45 +0000
Subject: [PATCH] GS-2199

---
 lib/db.js             |   69 +++++++++++++++++++++++
 lib/libIlias.js       |    2 
 app.js                |   19 ++++++
 test/testSetStatus.js |   41 +++++++++++++
 4 files changed, 131 insertions(+), 0 deletions(-)

diff --git a/app.js b/app.js
index d4cc17b..2ddf06d 100644
--- a/app.js
+++ b/app.js
@@ -206,6 +206,25 @@
    //    }
    // })
 
+   .post("/api/kurs/:refId/status/:usrId", async function (req, res) {
+      const {refId, usrId} = req.params
+      if (!refId || !usrId) throw {status: "error", msg: "refId and usrId requried"}
+      try {
+         const {obj_id: course_id} = await db.getObjIdFromRefId(refId)
+         // let data = await libIlias.abmelden(usrId, course_id)
+         // let data = await libIlias.deleteTeilnahme(refId, usrId)
+         if (!data) throw {statusCode: 404, message: "Teilnahme not found"}
+         return res.send(data)
+      } catch (ex) {
+         console.error(ex)
+         const msg = ex.msg ?? ex.message ?? ex.toString()
+         if (ex.statusCode) {
+            return res.code(ex.statusCode).send({status: "error", msg})
+         }
+         return res.code(500).send({status: "error", msg})
+      }
+   })
+
    .delete("/api/kurs/:refId/teilnehmer/:usrId", async function (req, res) {
       const {refId, usrId} = req.params
       if (!refId || !usrId) throw {status: "error", msg: "refId and usrId requried"}
diff --git a/lib/db.js b/lib/db.js
index 48215e6..76e3064 100644
--- a/lib/db.js
+++ b/lib/db.js
@@ -43,6 +43,8 @@
    getUdf,
 
    getMemberRoleForCourse,
+
+   setStatus,
 }
 
 /////////////////////////////////////////////////////////////////////////
@@ -384,3 +386,70 @@
       return null
    }
 }
+
+/////// STATUS ////////////////////////////////////////////////////////////////
+
+/**
+ * Zwei Möglichkeiten:
+ * 1. es gibt schon einen Eintrag in ut_lp_marks, dann muss man diesen updaten
+ * 2. es gibt noch keinen Eintrag in ut_lp_marks, dann muss erst einer erstellt werden (NEIN! Für neuen TN sind bereits beide Einträge vorhanden, kann also wegfallen)
+ *
+ * Weiterhin haben wir es mit zwei Tabellen zu tun:
+ *    - obj_members (passed)
+ *    - ut_lp_marks (status)
+ *
+ * UPDATE: Wir nehmen an, dass beide Einträge schon vorhanden sind!
+ *
+ * @param courseId
+ * @param userId
+ * @param passed
+ * @param status
+ * @returns {Promise<void>}
+ */
+async function setStatus (courseId, userId, passed = null, status = null) {
+   const pool = await poolP
+
+   // ACHTUNG Transactions funktioneren so nicht, erst mal ohne machen...
+   const q = `
+START TRANSACTION;
+
+UPDATE ${database}.ut_lp_marks ulm  
+SET status = ${status}
+WHERE ulm.usr_id = 31793 AND ulm.obj_id = 32212;
+
+UPDATE ${database}.obj_members om 
+SET passed = ${passed}
+WHERE om.usr_id = ${userId} AND om.obj_id = ${courseId};
+
+COMMIT;
+`
+
+   const q1 = `
+       UPDATE ${database}.ut_lp_marks ulm
+       SET status = ${status}
+       WHERE ulm.usr_id = 31793
+         AND ulm.obj_id = 32212;
+   `
+   const q2 = `
+       UPDATE ${database}.obj_members om
+       SET passed = ${passed}
+       WHERE om.usr_id = ${userId}
+         AND om.obj_id = ${courseId};
+   `
+   const [results1] = await pool.query(q1)
+   const [results2] = await pool.query(q2)
+   const {affectedRows: affectedRows1} = results1
+   const {affectedRows: affectedRows2} = results2
+   if (affectedRows1 && affectedRows2) {
+      return {
+         status: "ok",
+      }
+   }
+   else {
+      throw {
+         status: "error",
+         reason: {affectedRows1, affectedRows2}
+      }
+   }
+   // return {results1, results2}
+}
diff --git a/lib/libIlias.js b/lib/libIlias.js
index 489d1da..bed78e0 100644
--- a/lib/libIlias.js
+++ b/lib/libIlias.js
@@ -175,3 +175,5 @@
    const res = await fetch(url2, {method: "DELETE"})
    return await res.json()
 }
+
+
diff --git a/test/testSetStatus.js b/test/testSetStatus.js
new file mode 100644
index 0000000..86394cf
--- /dev/null
+++ b/test/testSetStatus.js
@@ -0,0 +1,41 @@
+const expect = require("chai").expect
+
+const settings = require("../settings")
+const libIlias = require("../lib/libIlias")
+const db = require("../lib/db")
+const testData = require("./data")
+
+/////////////////////////////////////////////////////////////////////////
+
+describe("the function setStatus", function () {
+
+   const kurs = testData.kurs // TODO
+   const user = testData.user
+
+   let kursId = 32212
+   let userId = 31793
+   const status = 2
+   const passed = 1
+
+   beforeEach(async function () {
+      // TODO add kurs, add User
+   })
+
+   afterEach(async function () {
+      // TODO delete kurs, delete user
+   })
+
+   it("should set status and passed for a kurs TN", async function () {
+      const res = await db.setStatus(kursId, userId, 4, 4)
+
+      console.dir(res, {depth: null})
+      return
+      expect(res).to.have.property("status").and.to.equal("ok")
+      expect(res.command).to.equal("anmelden")
+      expect(res.method).to.equal("POST")
+   })
+
+})
+
+/////////////////////////////////////////////////////////////////////////
+

--
Gitblit v1.8.0