REST Service for POPCORN - ILIAS
alex
2025-06-20 b9e31706c33cd5ac10fa66a3a88cb54a5327220c
GS-2156
1 files added
5 files modified
80 ■■■■ changed files
app.js 5 ●●●●● patch | view | raw | blame | history
bin/getUdf.js 20 ●●●●● patch | view | raw | blame | history
lib/db.js 10 ●●●●● patch | view | raw | blame | history
lib/libIlias.js 23 ●●●● patch | view | raw | blame | history
test/testImportIliasUser.js 15 ●●●●● patch | view | raw | blame | history
vue/src/components/Header.vue 7 ●●●● patch | view | raw | blame | history
app.js
@@ -109,6 +109,11 @@
      }
   })
   .post("/api/user", async function (req, res) {
      const user = req.body
      const res2 = await libIlias.importIliasUser(user) // TODO import or update if already available
      return res.send(res2)
   })
   .delete("/api/user", async function (req, res) { // DELETE ALL users
      const res2 = await libIlias.deleteAllUsers()
bin/getUdf.js
New file
@@ -0,0 +1,20 @@
const db = require("../lib/db")
const yargs = require("yargs")
/////////////////////////////////////////////////////////////////////////
const argv = yargs
   // .usage("$0 <ref_id>", "get user defined fields",)
   .strict()
   .parse()
run(argv)
   .then(console.log)
   .catch(console.error)
   .finally(process.exit)
async function run({ref_id}) {
   return await db.getUdf()
}
lib/db.js
@@ -40,6 +40,7 @@
   getKursTeilnehmer,
   getKursTeilnehmerCount,
   getUdf,
}
/////////////////////////////////////////////////////////////////////////
@@ -350,3 +351,12 @@
   const [results] = await pool.query(q)
   return results
}
/////// UDF ////////////////////////////////////////////////////////////////
async function getUdf() {
   const pool = await poolP
   const q = `SELECT field_id, field_name, field_type from ${database}.udf_definition;`
   const [results] = await pool.query(q)
   return results
}
lib/libIlias.js
@@ -1,4 +1,5 @@
/* Lib for interacting with customized ILIAS php */
const _ = require("lodash")
const settings = require("../settings")
const {getObjIdFromRefId} = require("./db")
const db = require("./db")
@@ -59,29 +60,29 @@
   })
   let url2 = `${url}?${sp.toString()}`
   console.log(url2)
   console.log(user)
   const udfDef = await db.getUdf()
   const udfMap = _.keyBy(udfDef, "field_name")
   user.udf = _.mapKeys(user.udf, function (value, key) {
      return udfMap[key].field_id
   })
   console.log(user)
   // return "jo"
   const res = await fetch(url2, {
      method: "POST",
      body: JSON.stringify(user)
   })
   // const data = await res.json()
   // return data
   const text = await res.text()
   try {
      const json = JSON.parse(text)
      return json
      return JSON.parse(text)
   } catch (ex) {
      console.error(ex.message)
      console.log(text)
      throw ex
   }
   try {
      return data
   } catch (ex) {
      const text = await res.text()
      console.error(text)
      return false
   }
}
test/testImportIliasUser.js
@@ -21,11 +21,16 @@
      department: "Bananenpflücker",
      institution: "Globus Budapest",
      roleIdGlobal: 4,
      udf_Markt: "Markt UDF",
      udf: { // ACHTUNG: Die Nummer enspricht der id in der Tabelle udf_definition und kann je nach Reihenfolge anders sein!
         1: "Markt UDF",
         2: "Marktnummer UDF",
         3: "Personal UDF",
      // udf_Markt: "Markt UDF",
      udf: {
         // ACHTUNG: Die Nummer enspricht der id in der Tabelle udf_definition und kann je nach Reihenfolge anders sein!
         // wird in importIliasUser() aufgelöst aus dem Namen
         // 1: "Markt UDF",
         // 2: "Marktnummer UDF",
         // 3: "Personal UDF",
         "Markt": "Markt UDF 2",
         "Marktnummer": "Marktnummer UDF 2",
         "Personalnummer": "Personal UDF 2",
      },
   }
vue/src/components/Header.vue
@@ -2,7 +2,10 @@
import {reindex, apiTokenValid, deleteApiToken, routerBase} from "../lib/api"
async function doReindex () {
   await reindex()
   location.reload()
}
</script>
@@ -15,7 +18,7 @@
      <RouterLink :to="`${routerBase}/ui/kurs`">Courses</RouterLink>
      <div style="flex-grow: 1" />
      <div>
         <button type="button" title="reindex search index" @click="reindex()">♻</button>
         <button type="button" title="reindex search index" @click="doReindex">♻</button>
      </div>
      <div v-if="apiTokenValid">
         <button type="button" @click="deleteApiToken()">logout</button>