REST Service for POPCORN - ILIAS
alex
2025-06-20 eda54046a40c108e993cb8efd73a1a36bcbfd225
GS-2156
1 files added
5 files modified
107 ■■■■ changed files
app.js 34 ●●●●● patch | view | raw | blame | history
bin/deleteUser.js 23 ●●●●● patch | view | raw | blame | history
lib/search.js 8 ●●●● patch | view | raw | blame | history
test/testImportIliasUser.js 22 ●●●● patch | view | raw | blame | history
vue/src/components/Header.vue 7 ●●●● patch | view | raw | blame | history
vue/src/lib/api.js 13 ●●●● patch | view | raw | blame | history
app.js
@@ -37,18 +37,28 @@
const searchLib = require("./lib/search")
searchLib.doIndex().catch(console.error)
fastify.get("/api/search/user", async function (req, res) {
   console.log(req.query)
   const search = req.query?.search
   if (!search) {
      return res.code(422).send({status: "error", msg: "no search"})
   }
   else {
      console.log(search)
      const data = await searchLib.search(search)
      return res.send(data)
   }
})
fastify
   .get("/api/search/user", async function (req, res) {
      console.log(req.query)
      const search = req.query?.search
      if (!search) {
         return res.code(422).send({status: "error", msg: "no search"})
      }
      else {
         console.log(search)
         const data = await searchLib.search(search)
         return res.send(data)
      }
   })
   .post("/api/search/reindex", async function (req, res) {
      console.log("REINDEX ++++")
      const start = Date.now()
      await searchLib.doIndex().catch(console.error)
      return res.send({
         status: "ok",
         msg: `reindexed in ${Date.now() - start} ms`,
      })
   })
fastify
   /////// USER ////////////////////////////////////////////////////////////////
bin/deleteUser.js
New file
@@ -0,0 +1,23 @@
const db = require("../lib/db")
const yargs = require("yargs")
const libIlias = require("../lib/libIlias")
/////////////////////////////////////////////////////////////////////////
const argv = yargs
   .usage("$0 <usr_id>", "delete user <usr_id>",)
   .strict()
   .parse()
console.log(`argv.ref_id=${argv.ref_id}`)
run(argv)
   .then(console.log)
   .catch(console.error)
   .finally(process.exit)
async function run ({usr_id}) {
   return libIlias.deleteUser(usr_id)
}
lib/search.js
@@ -80,8 +80,8 @@
async function doIndex () {
   const start = Date.now()
   console.log("++ START indexing Users...")
   const {readFromFile, file} = settings.search
   clearIndex(idxUser)
   let users
   if (readFromFile) {
@@ -92,6 +92,7 @@
      console.log("~~~ reading users from DB ... ~~~")
      const db = require("./db")
      const {data} = await db.getUsers(0, 100000)
      console.log(`loaded ${data.length} users from DB...`)
      users = data
   }
@@ -125,6 +126,7 @@
function getUserString (user) {
   const {usr_id, firstname, lastname, login, institution, department} = user
   if(firstname.trim()==="Adolfo") console.log(user)
   return `${usr_id} ${login} ${firstname} ${lastname} ${institution} ${department}`.trim()
   // return `${usr_id} ${firstname} ${lastname}`.trim()
}
@@ -141,6 +143,10 @@
   remove(idxUser, usr_id)
}
function clearIndex(index) {
   index.clear()
}
/////// idxTags FNS ////////////////////////////////////////////////////////////////
test/testImportIliasUser.js
@@ -8,6 +8,7 @@
describe("the function importIliasUser", function () {
   let lastUserId = null
   const user = {
      // Action: "Insert",
      login: "affoReloaded",
@@ -28,6 +29,10 @@
      },
   }
   afterEach(async function () {
      await deleteUser(lastUserId)
   })
   it("should import a new user to ILIAS", async function () {
      const res = await libIlias.importIliasUser(user)
      console.dir(res, {depth:null})
@@ -36,15 +41,24 @@
      expect(res.usr_id).to.be.a("number").above(0)
      const {usr_id} = res
      lastUserId = usr_id
      const user2 = await db.getUserByUserId(usr_id)
      console.log(user2)
      expect(user2).to.have.property("login").and.to.equal("affoReloaded")
      expect(user2).to.have.property("usr_id").and.to.equal(res.usr_id)
      const res2 = await libIlias.deleteUser(usr_id)
      console.log(res2)
      expect(res2).to.have.property("status").and.to.equal("ok")
      expect(res2).to.have.property("command").and.to.equal("deleteUser")
      // const res2 = await libIlias.deleteUser(usr_id)
      // console.log(res2)
      // expect(res2).to.have.property("status").and.to.equal("ok")
      // expect(res2).to.have.property("command").and.to.equal("deleteUser")
   })
})
async function deleteUser (usr_id) {
   const res2 = await libIlias.deleteUser(usr_id)
   console.log(res2)
   expect(res2).to.have.property("status").and.to.equal("ok")
   expect(res2).to.have.property("command").and.to.equal("deleteUser")
}
vue/src/components/Header.vue
@@ -1,6 +1,8 @@
<script setup>
import {apiTokenValid, deleteApiToken, routerBase} from "../lib/api"
import {reindex, apiTokenValid, deleteApiToken, routerBase} from "../lib/api"
</script>
@@ -12,6 +14,9 @@
      <RouterLink :to="`${routerBase}/ui/user`">Users</RouterLink>
      <RouterLink :to="`${routerBase}/ui/kurs`">Courses</RouterLink>
      <div style="flex-grow: 1" />
      <div>
         <button type="button" @click="reindex()">♻</button>
      </div>
      <div v-if="apiTokenValid">
         <button type="button" @click="deleteApiToken()">logout</button>
      </div>
vue/src/lib/api.js
@@ -5,10 +5,12 @@
let apiToken = useSessionStorage("apiToken", "")
export const apiTokenValid = computed(() => apiToken.value !== null && apiToken.value !== "")
export function setApiToken(token) {
export function setApiToken (token) {
   apiToken.value = token
}
export function deleteApiToken() {
export function deleteApiToken () {
   apiToken.value = null
}
@@ -64,3 +66,10 @@
   return await res.json()
}
export async function reindex () {
   let url = `${apiBase}/search/reindex?token=${apiToken.value}`
   const res = await fetch(url, {method: "POST"})
   const data = await res.json()
   console.log(data)
   return data
}