From aa6770ff4a9442f666cc81a6e39f7b6f2a013024 Mon Sep 17 00:00:00 2001
From: alex <alex@alexloehr.net>
Date: Mon, 16 Jun 2025 11:59:20 +0000
Subject: [PATCH] GS-2160

---
 lib/libIlias.js                                                                 |   28 ++++++++-
 app.js                                                                          |   33 ++++++++--
 .run/the function deleteTeilnahme.should delete the Teilnahme of a user.run.xml |   21 +++++++
 test/testDeleteTeilnahme.js                                                     |   26 ++++++++
 vue/src/lib/api.js                                                              |    2 
 php/alex.php                                                                    |   22 +++++++
 6 files changed, 119 insertions(+), 13 deletions(-)

diff --git a/.run/the function deleteTeilnahme.should delete the Teilnahme of a user.run.xml b/.run/the function deleteTeilnahme.should delete the Teilnahme of a user.run.xml
new file mode 100644
index 0000000..38f6c73
--- /dev/null
+++ b/.run/the function deleteTeilnahme.should delete the Teilnahme of a user.run.xml
@@ -0,0 +1,21 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="the function deleteTeilnahme.should delete the Teilnahme of a user" type="mocha-javascript-test-runner" nameIsGenerated="true">
+    <node-interpreter>project</node-interpreter>
+    <node-options />
+    <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
+    <working-directory>$PROJECT_DIR$</working-directory>
+    <pass-parent-env>true</pass-parent-env>
+    <envs>
+      <env name="NODE_ENV" value="dev" />
+    </envs>
+    <ui>bdd</ui>
+    <extra-mocha-options />
+    <test-kind>TEST</test-kind>
+    <test-file>$PROJECT_DIR$/test/testDeleteTeilnahme.js</test-file>
+    <test-names>
+      <name value="the function deleteTeilnahme" />
+      <name value="should delete the Teilnahme of a user" />
+    </test-names>
+    <method v="2" />
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/app.js b/app.js
index 0faab46..3b298c8 100644
--- a/app.js
+++ b/app.js
@@ -166,7 +166,7 @@
          return res.code(404).send({status: "error", msg: "not found"})
       }
    })
-   .get("/api/kurs/teilnehmer/:refId", async function (req, res) {
+   .get("/api/kurs/:refId/teilnehmer", async function (req, res) {
       const {refId} = req.params
       let data = await db.getKursTeilnehmer(refId)
       if (data) {
@@ -176,14 +176,31 @@
          return res.code(404).send({status: "error", msg: "not found"})
       }
    })
-   .get("/api/kurs/teilnehmer/:refId/count", async function (req, res) {
-      const {refId} = req.params
-      let data = await db.getKursTeilnehmerCount(refId)
-      if (data) {
+   // .get("/api/kurs/:refId/teilnehmer/count", async function (req, res) {
+   //    const {refId} = req.params
+   //    let data = await db.getKursTeilnehmerCount(refId)
+   //    if (data) {
+   //       return res.send(data)
+   //    }
+   //    else {
+   //       return res.code(404).send({status: "error", msg: "not found"})
+   //    }
+   // })
+
+   .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"}
+      try {
+         let data = await libIlias.deleteTeilnahme(refId, usrId)
+         if (!data) throw {statusCode: 404, message: "Teilnahme not found"}
          return res.send(data)
-      }
-      else {
-         return res.code(404).send({status: "error", msg: "not found"})
+      } 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})
       }
    })
 
diff --git a/lib/libIlias.js b/lib/libIlias.js
index 506aa7c..6d608f5 100644
--- a/lib/libIlias.js
+++ b/lib/libIlias.js
@@ -2,11 +2,13 @@
 
 module.exports = {
    deleteUser,
+   deleteTeilnahme,
 }
 
 /////////////////////////////////////////////////////////////////////////
 
 const settings = require("../settings")
+const {getObjIdFromRefId} = require("./db")
 const {url} = settings.ilias
 
 /////////////////////////////////////////////////////////////////////////
@@ -15,12 +17,30 @@
    const sp = new URLSearchParams({
       command: "deleteUser",
       obj_id,
-      dry : dry ? "1" : "0",
+      dry: dry ? "1" : "0",
    })
    let url2 = `${url}?${sp.toString()}`
    console.log("libIlias.deleteUser >>>", url2)
    const res = await fetch(url2, {method: "DELETE"})
-   // console.log(res)
-   const data = await res.json()
-   return data
+   return await res.json()
+}
+
+async function deleteTeilnahme (ref_id, usr_id, dry = false) {
+   const {obj_id} = await getObjIdFromRefId(ref_id)
+   const sp = new URLSearchParams({
+      command: "deleteTeilnahme",
+      obj_id,
+      usr_id,
+      dry: dry ? "1" : "0",
+   })
+   let url2 = `${url}?${sp.toString()}`
+   console.log("libIlias.deleteTeilnahme >>>", url2)
+   let res
+   try {
+      res = await fetch(url2, {method: "DELETE"})
+      return await res.json()
+   } catch (ex) {
+      console.error(ex)
+      throw ex
+   }
 }
diff --git a/php/alex.php b/php/alex.php
index be5251b..82a2306 100644
--- a/php/alex.php
+++ b/php/alex.php
@@ -32,6 +32,14 @@
                     $res["status"] = "ok";
                     break;
                 }
+            case "deleteTeilnahme":
+                if ($method == "DELETE") {
+                    $usr_id = (int) $_GET["usr_id"];
+                    $res["usr_id"] = $usr_id;
+                    $res["msg"] = deleteTeilnahme($obj_id, $usr_id, $dry);
+                    $res["status"] = "ok";
+                    break;
+                }
             default:
                 http_response_code(500);
                 $res = array("status" => "error", "msg" => "unknown command or method");
@@ -64,4 +72,18 @@
     }
 }
 
+function deleteTeilnahme($obj_id, $usr_id, $dry) {
+    $course = ilObjectFactory::getInstanceByObjId($obj_id);
+    #$members = $course->getMembersObject(); # ilCourseParticipants # sackgasse
+    $msg = "deleted user({$usr_id}) teilnahme for course '{$course->getTitle()}' ({$obj_id})";
+    #return json_encode($members, JSON_PRETTY_PRINT);
+    if ($dry == "0") {
+        $course->_deleteUser($usr_id);
+        return $msg;
+    } else {
+        $msg = "DRY:: ".$msg;
+        return $msg;
+    }
+}
+
 ?>
diff --git a/test/testDeleteTeilnahme.js b/test/testDeleteTeilnahme.js
new file mode 100644
index 0000000..4a03647
--- /dev/null
+++ b/test/testDeleteTeilnahme.js
@@ -0,0 +1,26 @@
+const expect = require("chai").expect
+
+const settings = require("../settings")
+const libIlias = require("../lib/libIlias")
+const db = require("../lib/db")
+
+/////////////////////////////////////////////////////////////////////////
+
+describe("the function deleteTeilnahme", function () {
+
+   it("should delete the Teilnahme of a user", async function () {
+      const ref_id = 150
+      const {obj_id} = await db.getObjIdFromRefId(ref_id) // 9915
+      const usr_id = 1446
+
+
+      const res = await libIlias.deleteTeilnahme(ref_id, usr_id, false)
+      console.log(res)
+      expect(res.method).to.equal("DELETE")
+      expect(res.command).to.equal("deleteTeilnahme")
+      expect(res.obj_id).to.equal(obj_id)
+      expect(res.usr_id).to.equal(usr_id)
+      expect(res.status).to.equal("ok")
+   })
+
+})
diff --git a/vue/src/lib/api.js b/vue/src/lib/api.js
index 545620e..7ba18d1 100644
--- a/vue/src/lib/api.js
+++ b/vue/src/lib/api.js
@@ -36,7 +36,7 @@
 }
 
 export async function getKursTn (kursId) {
-   let resKurs = await fetch(`${apiBase}/kurs/teilnehmer/${kursId}?token=${apiToken.value}`)
+   let resKurs = await fetch(`${apiBase}/kurs/${kursId}/teilnehmer?token=${apiToken.value}`)
    return await resKurs.json()
 }
 

--
Gitblit v1.8.0