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,
|
|
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}'
|
AND login REGEXP '^[0-9]+$'`
|
)
|
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}'
|
AND login REGEXP '^[0-9]+$'`
|
)
|
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#, ulm.status
|
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
|
INNER JOIN ${database}.usr_data ud ON ud.usr_id = om.usr_id
|
WHERE (or2.ref_id = ${ref_id} OR parent_id = ${ref_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
|
INNER JOIN ${database}.usr_data ud ON ud.usr_id = om.usr_id
|
WHERE (or2.ref_id = ${ref_id} OR parent_id = ${ref_id})
|
`
|
let [results] = await pool.query(q)
|
results = results.length? results[0] : undefined
|
return { ref_id, count: results.count }
|
}
|