REST Service for POPCORN - ILIAS
alex
2025-07-06 e19f1dc6c1f262d01e3806f95563a072ead6e512
GS-2199
1 files added
3 files modified
131 ■■■■■ changed files
app.js 19 ●●●●● patch | view | raw | blame | history
lib/db.js 69 ●●●●● patch | view | raw | blame | history
lib/libIlias.js 2 ●●●●● patch | view | raw | blame | history
test/testSetStatus.js 41 ●●●●● patch | view | raw | blame | history
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"}
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}
}
lib/libIlias.js
@@ -175,3 +175,5 @@
   const res = await fetch(url2, {method: "DELETE"})
   return await res.json()
}
test/testSetStatus.js
New file
@@ -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")
   })
})
/////////////////////////////////////////////////////////////////////////