From 7a62193da9c9bb8f66c1e26cd1cecfc7925d6de0 Mon Sep 17 00:00:00 2001
From: alex <alex@alexloehr.net>
Date: Wed, 25 Jun 2025 06:59:23 +0000
Subject: [PATCH] GS-2169

---
 lib/db.js                     |   27 ++++++++++++-
 bin/anmelden.js               |   25 ++++++++++++
 lib/libIlias.js               |   19 +++++++++
 php/globus-ilias-rest/api.php |   24 +++++++++++
 test/testImportIliasUser.js   |    7 +++
 5 files changed, 97 insertions(+), 5 deletions(-)

diff --git a/bin/anmelden.js b/bin/anmelden.js
new file mode 100644
index 0000000..b5e2688
--- /dev/null
+++ b/bin/anmelden.js
@@ -0,0 +1,25 @@
+const db = require("../lib/db")
+const yargs = require("yargs")
+const {anmelden} = require("../lib/libIlias")
+
+/////////////////////////////////////////////////////////////////////////
+
+const argv = yargs
+   .usage("$0 <usr_id> <course_id>", "User anmelden (ACHTUNG course_id muss obj_id sein!)",)
+   .strict()
+   .version(false)
+   .parse()
+
+/////////////////////////////////////////////////////////////////////////
+
+run(argv)
+   .then(console.log)
+   .catch(console.error)
+   .finally(process.exit)
+
+/////////////////////////////////////////////////////////////////////////
+
+async function run ({usr_id, course_id}) {
+   return await anmelden(usr_id, course_id)
+}
+
diff --git a/lib/db.js b/lib/db.js
index 028b5b0..48215e6 100644
--- a/lib/db.js
+++ b/lib/db.js
@@ -41,6 +41,8 @@
    getKursTeilnehmerCount,
 
    getUdf,
+
+   getMemberRoleForCourse,
 }
 
 /////////////////////////////////////////////////////////////////////////
@@ -355,9 +357,30 @@
 
 /////// UDF ////////////////////////////////////////////////////////////////
 
-async function getUdf() {
+async function getUdf () {
    const pool = await poolP
-   const q = `SELECT field_id, field_name, field_type from ${database}.udf_definition;`
+   const q = `SELECT field_id, field_name, field_type
+              from ${database}.udf_definition;`
    const [results] = await pool.query(q)
    return results
 }
+
+/////// ROLLEN ////////////////////////////////////////////////////////////////
+
+async function getMemberRoleForCourse (obj_id) {
+   const pool = await poolP
+   const q = `SELECT obj_id, title, description
+              from object_data od
+              WHERE type = "role" #AND title LIKE 'il_crs_member_157'
+                AND od.description LIKE 'Member%${obj_id}'
+   `
+   const [results] = await pool.query(q)
+   // darf nur einen Treffer ergeben
+   if (results.length) {
+      const {obj_id, title, description} = results[0]
+      return obj_id
+   }
+   else {
+      return null
+   }
+}
diff --git a/lib/libIlias.js b/lib/libIlias.js
index 88a2004..cf06e73 100644
--- a/lib/libIlias.js
+++ b/lib/libIlias.js
@@ -12,11 +12,13 @@
    getUser,
 
    importIliasUser,
-
+   anmelden,
 
    deleteUser,
    deleteAllUsers,
    deleteTeilnahme,
+
+
 }
 
 /////////////////////////////////////////////////////////////////////////
@@ -143,3 +145,18 @@
    }
 }
 
+/////// Anmelden ////////////////////////////////////////////////////////////////
+
+async function anmelden (usr_id, course_id) {
+   // const role = await db.getMemberRoleForCourse(course_id) // nein es wird relative id gebraucht, siehe php
+   const sp = new URLSearchParams({
+      command: "anmelden",
+      usr_id,
+      course_id,
+      token: iliastoken,
+   })
+   let url2 = `${url}?${sp.toString()}`
+   console.log(url2)
+   const res = await fetch(url2, {method: "POST"})
+   return await res.json()
+}
diff --git a/php/globus-ilias-rest/api.php b/php/globus-ilias-rest/api.php
index d4ca300..aa6a546 100644
--- a/php/globus-ilias-rest/api.php
+++ b/php/globus-ilias-rest/api.php
@@ -68,6 +68,19 @@
                     $res["msg"] = "User Import OK";
                     break;
                 }
+            case "anmelden": // params: usr_id, course_id, role
+                if ($method == "POST") {
+                    $usr_id = (int) $_GET["usr_id"];
+                    $course_id = (int) $_GET["course_id"];
+                    $role = (int) $_GET["role"];
+
+                    $res2 = anmelden($usr_id, $course_id, $role);
+                    $res["status"] = "ok";
+                    $res["msg"] = "Anmelden OK";
+                    $res["params"] = array("usr_id"=>$usr_id, "course_id"=>$course_id, "role"=> $role);
+                    $res["res2"] = $res2;
+                    break;
+                }
             case "deleteUser":
                 if ($method == "DELETE") {
                     $res["msg"] = deleteUser($obj_id, $dry);
@@ -131,6 +144,15 @@
     return $usr_id;
 }
 
+// ACHTUNG course_id muss obj_id sein!
+// die Rolle muss aus dem Kurs gelesen werden
+function anmelden($usr_id, $course_id) {
+    $course = ilObjectFactory::getInstanceByObjId($course_id);
+    $membersObject = $course->getMembersObject();
+    $role = $membersObject::IL_CRS_MEMBER;
+    return $membersObject->add($usr_id, $role);
+}
+
 function deleteUser($obj_id, $dry)
 {
     $usr = ilObjectFactory::getInstanceByObjId($obj_id);
@@ -146,7 +168,7 @@
 
 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);
+//     $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()}";
diff --git a/test/testImportIliasUser.js b/test/testImportIliasUser.js
index 7e226da..586ef06 100644
--- a/test/testImportIliasUser.js
+++ b/test/testImportIliasUser.js
@@ -34,8 +34,12 @@
       },
    }
 
+   beforeEach(async function () {
+
+   })
+
    afterEach(async function () {
-      // await deleteUser(lastUserId)
+      await deleteUser(lastUserId)
    })
 
    it("should import a new user to ILIAS", async function () {
@@ -60,6 +64,7 @@
 
 })
 
+/////////////////////////////////////////////////////////////////////////
 
 async function deleteUser (usr_id) {
    const res2 = await libIlias.deleteUser(usr_id)

--
Gitblit v1.8.0