From 0b0a4bb1f5b6814525e82b5e684a6968e9e9120c Mon Sep 17 00:00:00 2001
From: alex <alex@alexloehr.net>
Date: Wed, 25 Jun 2025 07:55:22 +0000
Subject: [PATCH] GS-2169

---
 test/testAbmelden.js          |   41 ++++++++++
 lib/libIlias.js               |   59 +++++++++-----
 app.js                        |    4 
 php/globus-ilias-rest/api.php |   51 +++++++-----
 test/testAnmelden.js          |   41 ++++++++++
 5 files changed, 152 insertions(+), 44 deletions(-)

diff --git a/app.js b/app.js
index 97cce6f..d4cc17b 100644
--- a/app.js
+++ b/app.js
@@ -210,7 +210,9 @@
       const {refId, usrId} = req.params
       if (!refId || !usrId) throw {status: "error", msg: "refId and usrId requried"}
       try {
-         let data = await libIlias.deleteTeilnahme(refId, usrId)
+         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) {
diff --git a/lib/libIlias.js b/lib/libIlias.js
index cf06e73..489d1da 100644
--- a/lib/libIlias.js
+++ b/lib/libIlias.js
@@ -12,11 +12,13 @@
    getUser,
 
    importIliasUser,
+
    anmelden,
+   abmelden,
 
    deleteUser,
    deleteAllUsers,
-   deleteTeilnahme,
+   // deleteTeilnahme,
 
 
 }
@@ -124,28 +126,28 @@
    return res
 }
 
-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",
-      token: iliastoken,
-   })
-   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
-   }
-}
+// async function deleteTeilnahme (ref_id, usr_id, dry = false) {
+//    const {obj_id} = await getObjIdFromRefId(ref_id)
+//    const sp = new URLSearchParams({
+//       command: "deleteTeilnahme",
+//       course_id: obj_id,
+//       usr_id,
+//       dry: dry ? "1" : "0",
+//       token: iliastoken,
+//    })
+//    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
+//    }
+// }
 
-/////// Anmelden ////////////////////////////////////////////////////////////////
+/////// Anmelden / Abmelden ////////////////////////////////////////////////////////////////
 
 async function anmelden (usr_id, course_id) {
    // const role = await db.getMemberRoleForCourse(course_id) // nein es wird relative id gebraucht, siehe php
@@ -160,3 +162,16 @@
    const res = await fetch(url2, {method: "POST"})
    return await res.json()
 }
+
+async function abmelden (usr_id, course_id) {
+   const sp = new URLSearchParams({
+      command: "abmelden",
+      usr_id,
+      course_id,
+      token: iliastoken,
+   })
+   let url2 = `${url}?${sp.toString()}`
+   console.log(url2)
+   const res = await fetch(url2, {method: "DELETE"})
+   return await res.json()
+}
diff --git a/php/globus-ilias-rest/api.php b/php/globus-ilias-rest/api.php
index aa6a546..d2b1b45 100644
--- a/php/globus-ilias-rest/api.php
+++ b/php/globus-ilias-rest/api.php
@@ -87,11 +87,13 @@
                     $res["status"] = "ok";
                     break;
                 }
-            case "deleteTeilnahme":
+//             case "deleteTeilnahme":
+            case "abmelden":
                 if ($method == "DELETE") {
                     $usr_id = (int) $_GET["usr_id"];
-                    $res["usr_id"] = $usr_id;
-                    $res["msg"] = deleteTeilnahme($obj_id, $usr_id, $dry);
+                    $res["usr_id"] = (int) $usr_id;
+                    $course_id = (int) $_GET["course_id"];
+                    $res["msg"] = abmelden($usr_id, $course_id);
                     $res["status"] = "ok";
                     break;
                 }
@@ -153,6 +155,12 @@
     return $membersObject->add($usr_id, $role);
 }
 
+function abmelden($usr_id, $course_id) {
+    $course = ilObjectFactory::getInstanceByObjId($course_id);
+    $membersObject = $course->getMembersObject();
+    return $membersObject->delete($usr_id);
+}
+
 function deleteUser($obj_id, $dry)
 {
     $usr = ilObjectFactory::getInstanceByObjId($obj_id);
@@ -166,23 +174,24 @@
     }
 }
 
-function deleteTeilnahme($obj_id, $usr_id, $dry) {
-    # beim Löschen durch den Kurs wird zwar die Teilnahme gelöscht, aber nicht die Rollenzugehörigkeit
-//     $course = ilObjectFactory::getInstanceByObjId($obj_id);
-
-    $parti = ilCourseParticipant::_getInstanceByObjId($obj_id, $usr_id); ## Achtung die usr_id hier ist Admin id??
-    #return "parti.isParticipant() = {$parti->isParticipant()}";
-
-    $msg = "deleted user({$usr_id}) teilnahme for course '{$course->getTitle()}' ({$obj_id})";
-    if ($dry == "0") {
-        #$course->_deleteUser($usr_id);
-        #$course->deleteUser($usr_id); ## undefined
-        $parti->delete($usr_id);
-        return $msg;
-    } else {
-        $msg = "DRY:: ".$msg;
-        return $msg;
-    }
-}
+// ACHTUNG Funktion "abmelden" benutzen
+// function deleteTeilnahme($obj_id, $usr_id, $dry) {
+//     # beim Löschen durch den Kurs wird zwar die Teilnahme gelöscht, aber nicht die Rollenzugehörigkeit
+// //     $course = ilObjectFactory::getInstanceByObjId($obj_id);
+//
+//     $parti = ilCourseParticipant::_getInstanceByObjId($obj_id, $usr_id); ## Achtung die usr_id hier ist Admin id??
+//     #return "parti.isParticipant() = {$parti->isParticipant()}";
+//
+//     $msg = "deleted user({$usr_id}) teilnahme for course '{$course->getTitle()}' ({$obj_id})";
+//     if ($dry == "0") {
+//         #$course->_deleteUser($usr_id);
+//         #$course->deleteUser($usr_id); ## undefined
+//         $parti->delete($usr_id);
+//         return $msg;
+//     } else {
+//         $msg = "DRY:: ".$msg;
+//         return $msg;
+//     }
+// }
 
 ?>
diff --git a/test/testAbmelden.js b/test/testAbmelden.js
new file mode 100644
index 0000000..c1d56c8
--- /dev/null
+++ b/test/testAbmelden.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 anmelden", function () {
+
+   const kurs = testData.kurs // TODO
+   const user = testData.user
+
+   let kursId = 31938
+   let userId = 31954
+
+   beforeEach(async function () {
+      // TODO add kurs
+      // const res = await libIlias.importIliasUser(user)
+      // userId = res.usr_id
+   })
+
+   afterEach(async function () {
+      // await libIlias.deleteUser(userId)
+      // TODO delete kurs
+   })
+
+   it("should import a new user to ILIAS", async function () {
+      console.log("++abmelden", userId, kursId)
+      const res = await libIlias.abmelden(userId, kursId)
+      console.dir(res, {depth: null})
+      expect(res).to.have.property("status").and.to.equal("ok")
+      expect(res.command).to.equal("abmelden")
+      expect(res.method).to.equal("DELETE")
+   })
+
+})
+
+/////////////////////////////////////////////////////////////////////////
+
diff --git a/test/testAnmelden.js b/test/testAnmelden.js
new file mode 100644
index 0000000..280a530
--- /dev/null
+++ b/test/testAnmelden.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 anmelden", function () {
+
+   const kurs = testData.kurs // TODO
+   const user = testData.user
+
+   let kursId = 31938
+   let userId = 31954
+
+   beforeEach(async function () {
+      // TODO add kurs
+      // const res = await libIlias.importIliasUser(user)
+      // userId = res.usr_id
+   })
+
+   afterEach(async function () {
+      // await libIlias.deleteUser(userId)
+      // TODO delete kurs
+   })
+
+   it("should import a new user to ILIAS", async function () {
+      console.log("++anmelden", userId, kursId)
+      const res = await libIlias.anmelden(userId, kursId)
+      console.dir(res, {depth: null})
+      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