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,
|
}
|
|
/////////////////////////////////////////////////////////////////////////
|
|
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
|
`
|
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
|
}
|