REST Service for POPCORN - ILIAS
alex
2025-06-06 b14c0a2d23482c2afd77f22fe1646b86b5150281
lib/db.js
@@ -1,5 +1,6 @@
const mysql = require("mysql2/promise")
const searchLib = require("./search")
const {host, port, user, database, password} = require("./../settings").db
/////////////////////////////////////////////////////////////////////////
@@ -43,23 +44,41 @@
/////////////////////////////////////////////////////////////////////////
async function getUsers (offset = 0, limit = 10) {
   limit = Number(limit) || 10
   offset = Number(offset) || 0
function getUserSearchQuery (offset, limit, search) {
   const sel = `usr_id, login, firstname, lastname, gender, email, institution, street, city, zipcode, country, department, active`
   // TODO user defined fields
   // TODO check args for SQL Injection
   const pool = await poolP
   const [results, fields] = await pool.query(
      `SELECT ${sel}
   if (!search || search === '') {
      return `SELECT ${sel}
       FROM ${database}.usr_data AS ud
       WHERE login REGEXP '^[0-9]+$'
       LIMIT ${limit}
       OFFSET ${offset}
      `
   )
   const count = await getUserCount()
   }
   else {
      const ids = searchLib.search(search)
      if (!ids.length) return getUserSearchQuery(offset, limit) // nothing found
      return `SELECT ${sel}
              FROM ${database}.usr_data AS ud
              WHERE login REGEXP '^[0-9]+$'
              AND usr_id IN (${ids.join(",")})
                  LIMIT ${limit}
              OFFSET ${offset}
      `
   }
}
async function getUsers (offset = 0, limit = 10, search = null) {
   console.log("++++++++++ get users", offset, limit, search)
   limit = Number(limit) || 10
   offset = Number(offset) || 0
   // TODO check args for SQL Injection
   const pool = await poolP
   let userSearchQuery = getUserSearchQuery(offset, limit, search)
   // console.log(userSearchQuery)
   const [results, fields] = await pool.query(userSearchQuery)
   const count = await getUserCount(offset, limit, search)
   return {
      total: count,
      offset, limit,
@@ -67,14 +86,21 @@
   }
}
async function getUserCount () {
async function getUserCount (offset, limit, search) {
   const pool = await poolP
   const [results, fields] = await pool.query(
      `SELECT COUNT(*)
       FROM ${database}.usr_data AS ud
       WHERE login REGEXP '^[0-9]+$'`
   )
   return results[0]["COUNT(*)"]
   // const q = getUserSearchQuery(offset, limit, search)
   const q = getUserSearchQuery(0, 1000000, search) // hier darf kein Limit sein, offset=0
   const q2 = `SELECT COUNT(*) AS count
               FROM (${q}) AS X`
   const [results, fields] = await pool.query(q2)
   return results[0].count
   // const [results, fields] = await pool.query(
   //    `SELECT COUNT(*)
   //     FROM ${database}.usr_data AS ud
   //     WHERE login REGEXP '^[0-9]+$'`
   // )
   // return results[0]["COUNT(*)"]
}
async function getUserByLogin (login) {
@@ -217,8 +243,11 @@
async function getKursItems2 (ref_id) {
   const pool = await poolP
   const q = `
WITH RECURSIVE tree (parent_id, obj_id, ref_id, title, type  ) AS (
    SELECT ci.parent_id, or2.obj_id , ci.obj_id as ref_id, od.title, od.type
       WITH RECURSIVE tree (parent_id, obj_id, ref_id, title, type) AS (SELECT ci.parent_id,
                                                                               or2.obj_id,
                                                                               ci.obj_id as ref_id,
                                                                               od.title,
                                                                               od.type
    FROM ${database}.crs_items ci
    INNER JOIN ${database}.object_reference or2 ON or2.ref_id = ci.obj_id
    INNER JOIN ${database}.object_data od ON od.obj_id = or2.obj_id
@@ -227,14 +256,18 @@
    UNION ALL
    SELECT child.parent_id, or2.obj_id , child.obj_id as ref_id, od.title, od.type
                                                                        SELECT child.parent_id,
                                                                               or2.obj_id,
                                                                               child.obj_id as ref_id,
                                                                               od.title,
                                                                               od.type
    FROM ${database}.crs_items child
    INNER JOIN ${database}.object_reference or2 ON or2.ref_id = child.obj_id
    INNER JOIN ${database}.object_data od ON od.obj_id = or2.obj_id
    JOIN tree ON child.parent_id = tree.ref_id
    WHERE or2.deleted is NULL
)
SELECT * FROM tree
                                                                        WHERE or2.deleted is NULL)
       SELECT *
       FROM tree
ORDER BY tree.ref_id
`
   const [results] = await pool.query(q)