const mysql = require("mysql2/promise") const searchLib = require("./search") const {host, port, user, database, password} = require("./../settings").db ///////////////////////////////////////////////////////////////////////// let poolP = initPool() async function initPool () { return mysql.createPool({ host, port, database, user, password, }) } ///////////////////////////////////////////////////////////////////////// module.exports = { getUsers, getUserCount, getUserByLogin, getUserByUserId, getUserDefinedFields, getUserDefinedField, getUserTeilnahmen, getObjIdFromRefId, getRefIdFromObjId, getKurse, getKurs, getKursItems, getKursItems2, // getKursByObjId, // getKursByRefId, getKursTeilnehmer, getKursTeilnehmerCount, getUdf, getMemberRoleForCourse, } ///////////////////////////////////////////////////////////////////////// async function getUserSearchQuery (offset, limit, search) { const sel = `usr_id, login, firstname, lastname, gender, email, institution, street, city, zipcode, country, department, active` if (!search || search === '') { return `SELECT ${sel} FROM ${database}.usr_data AS ud WHERE login REGEXP '^[0-9]+$' LIMIT ${limit} OFFSET ${offset} ` } else { const ids = await searchLib.search(search) if (!ids.length) { throw "nothing found" return await 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 try { let userSearchQuery = await 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, data: results, } } catch (ex) { return { total: 0, offset: 0, limit: 0, data: [], } } } async function getUserCount (offset, limit, search) { const pool = await poolP // const q = getUserSearchQuery(offset, limit, search) const q = await 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) { const sel = `usr_id, login, firstname, lastname, gender, email, institution, street, city, zipcode, country, department, active` // TODO check args for SQL Injection const pool = await poolP const [results, fields] = await pool.query( `SELECT ${sel} FROM ${database}.usr_data AS ud WHERE login = '${login}'` ) return joinUDF(results[0]) } async function getUserByUserId (userId) { const sel = `usr_id, login, firstname, lastname, gender, email, institution, street, city, zipcode, country, department, active` // TODO check args for SQL Injection const pool = await poolP const [results, fields] = await pool.query( `SELECT ${sel} FROM ${database}.usr_data AS ud WHERE usr_id = '${userId}'` ) return joinUDF(results[0]) } async function getUserDefinedFields () { const pool = await poolP const [results] = await pool.query( `SELECT ut.usr_id, ud.field_name, ut.value FROM ${database}.udf_definition ud JOIN ${database}.udf_text ut ON ut.field_id = ud.field_id` ) return results } async function getUserDefinedField (usr_id) { const pool = await poolP const [results] = await pool.query( `SELECT ut.usr_id, ud.field_name, ut.value FROM ${database}.udf_definition ud JOIN ${database}.udf_text ut ON ut.field_id = ud.field_id WHERE ut.usr_id = '${usr_id}' ` ) return results } /////// obj_id / ref_id //////////////////////////////////////////////////////////////// async function getObjIdFromRefId (refId) { const pool = await poolP const [results] = await pool.query( `SELECT ref_id, obj_id FROM ${database}.object_reference as obr WHERE obr.ref_id = ${refId} ` ) return results.length ? results[0] : undefined } async function getRefIdFromObjId (objId) { const pool = await poolP const [results] = await pool.query( `SELECT ref_id, obj_id FROM ${database}.object_reference as obr WHERE obr.obj_id = ${objId} ` ) return results.length ? results[0] : undefined } ///////////////////////////////////////////////////////////////////////// async function promiseDelay (ms) { return new Promise(resolve => setTimeout(resolve, ms)) } async function joinUDF (user) { if (!user) return user const fields = await getUserDefinedField(user.usr_id) for (const field of fields) { user[field.field_name] = field.value } return user } /////// Kurs //////////////////////////////////////////////////////////////// async function getKurse () { const pool = await poolP const q = `SELECT or2.ref_id, or2.obj_id, od.title, od.description, od.type FROM ${database}.object_reference or2 INNER JOIN ${database}.object_data od ON od.obj_id = or2.obj_id WHERE od.type = 'crs' AND or2.deleted IS NULL ` const [results] = await pool.query(q) return results } // async function getKursByRefId (refId) { // const {ref_id, obj_id} = await getObjIdFromRefId(refId) // return getKursByObjId(obj_id) // } async function getKurs (ref_id) { const pool = await poolP const q = `SELECT or2.ref_id, or2.obj_id, od.title, od.description, od.type, od.create_date FROM ${database}.object_reference or2 INNER JOIN ${database}.object_data od ON od.obj_id = or2.obj_id WHERE or2.ref_id = '${ref_id}' ` let [results] = await pool.query(q) results = results.length ? results[0] : undefined return results } async function getKursItems (ref_id) { const pool = await poolP // const q = `SELECT or2.ref_id, or2.obj_id, od.title, od.description, od.type // FROM ${database}.object_reference or2 // INNER JOIN ${database}.object_data od ON od.obj_id = or2.obj_id // WHERE or2.obj_id = '${obj_id}' // ` const q = `SELECT ci.parent_id, or2.ref_id, or2.obj_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 WHERE or2.ref_id = ${ref_id} OR parent_id = ${ref_id} AND or2.deleted is NULL ` const [results] = await pool.query(q) return results } 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 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 WHERE ci.obj_id = ${ref_id} -- Kurs ref_id AND or2.deleted is NULL UNION ALL 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 ORDER BY tree.ref_id ` const [results] = await pool.query(q) return results } async function getKursTeilnehmer (ref_id) { const pool = await poolP const q = `SELECT ci.parent_id, or2.ref_id, or2.obj_id, od.title, od.type, om.usr_id, ud.login, ud.firstname, ud.lastname, ud.active, om.passed, ulm.status, ulm.status_changed 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 INNER JOIN ${database}.obj_members om ON om.obj_id = or2.obj_id AND om.member = 1 INNER JOIN ${database}.usr_data ud ON ud.usr_id = om.usr_id LEFT JOIN ${database}.ut_lp_marks ulm ON ulm.obj_id = or2.obj_id AND ud.usr_id = ulm.usr_id WHERE (or2.ref_id = ${ref_id} OR parent_id = ${ref_id}) ORDER BY usr_id ` console.log(q) const [results] = await pool.query(q) return results } async function getKursTeilnehmerCount (ref_id) { const pool = await poolP const q = `SELECT COUNT(*) as count 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 INNER JOIN ${database}.obj_members om ON om.obj_id = or2.obj_id AND om.member = 1 INNER JOIN ${database}.usr_data ud ON ud.usr_id = om.usr_id LEFT JOIN ${database}.ut_lp_marks ulm ON ulm.obj_id = or2.obj_id AND ud.usr_id = ulm.usr_id WHERE (or2.ref_id = ${ref_id} OR parent_id = ${ref_id}) ORDER BY usr_id ` let [results] = await pool.query(q) results = results.length ? results[0] : undefined return {ref_id, count: results.count} } async function getUserTeilnahmen (usr_id) { const pool = await poolP const q = `SELECT om.obj_id, or2.ref_id, om.usr_id, od.title, ulm.status, om.passed, ulm.status_changed FROM ${database}.obj_members om INNER JOIN ${database}.object_reference or2 ON or2.obj_id = om.obj_id INNER JOIN ${database}.usr_data ud ON ud.usr_id = om.usr_id INNER JOIN ${database}.object_data od ON od.obj_id = om.obj_id LEFT JOIN ${database}.ut_lp_marks ulm ON ulm.usr_id = om.usr_id AND ulm.obj_id = om.obj_id WHERE om.usr_id = ${usr_id} AND om.member = 1 ` console.log(q) 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 } /////// 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 } }