const mysql = require("mysql2/promise") 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, // getKursByObjId, // getKursByRefId, getKursTeilnehmer, getKursTeilnehmerCount, } ///////////////////////////////////////////////////////////////////////// async function getUsers (offset = 0, limit = 10) { limit = Number(limit) || 10 offset = Number(offset) || 0 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} FROM ${database}.usr_data AS ud WHERE login REGEXP '^[0-9]+$' LIMIT ${limit} OFFSET ${offset} ` ) const count = await getUserCount() return { total: count, offset, limit, data: results, } } async function getUserCount () { 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(*)"] } async function getUserByLogin (login) { 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} FROM ${database}.usr_data AS ud WHERE login = '${login}'` ) console.log(results) 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 user defined fields // 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 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 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 ` 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 }