From eda54046a40c108e993cb8efd73a1a36bcbfd225 Mon Sep 17 00:00:00 2001
From: alex <alex@alexloehr.net>
Date: Fri, 20 Jun 2025 08:58:35 +0000
Subject: [PATCH] GS-2156

---
 app.js                        |   34 +++++++++++------
 vue/src/components/Header.vue |    7 +++
 bin/deleteUser.js             |   23 +++++++++++
 test/testImportIliasUser.js   |   22 +++++++++--
 lib/search.js                 |    8 +++
 vue/src/lib/api.js            |   13 +++++-
 6 files changed, 87 insertions(+), 20 deletions(-)

diff --git a/app.js b/app.js
index e31d23f..3928423 100644
--- a/app.js
+++ b/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 ////////////////////////////////////////////////////////////////
diff --git a/bin/deleteUser.js b/bin/deleteUser.js
new file mode 100644
index 0000000..bf1985a
--- /dev/null
+++ b/bin/deleteUser.js
@@ -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)
+
+}
+
diff --git a/lib/search.js b/lib/search.js
index 1f08c51..66b3521 100644
--- a/lib/search.js
+++ b/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 ////////////////////////////////////////////////////////////////
 
diff --git a/test/testImportIliasUser.js b/test/testImportIliasUser.js
index 074f1df..116b571 100644
--- a/test/testImportIliasUser.js
+++ b/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")
+}
diff --git a/vue/src/components/Header.vue b/vue/src/components/Header.vue
index 09d73a9..7a14fff 100644
--- a/vue/src/components/Header.vue
+++ b/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>
diff --git a/vue/src/lib/api.js b/vue/src/lib/api.js
index 3ef461b..5290542 100644
--- a/vue/src/lib/api.js
+++ b/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
+}

--
Gitblit v1.8.0