1 files added
4 files modified
| | |
| | | const path = require("path") |
| | | const fastify = require('fastify')({ |
| | | logger: true |
| | | logger: false, |
| | | // logger: true |
| | | }) |
| | | const _ = require("lodash") |
| | | const fs = require("node:fs") |
| | | const dayjs = require("dayjs") |
| | | |
| | | const log = require("./logger") |
| | | const db = require("./lib/db") |
| | | const libIlias = require("./lib/libIlias") |
| | | const settings = require("./settings") |
| | |
| | | |
| | | // AUTH |
| | | fastify.addHook("onRequest", async (req, res) => { |
| | | console.log(req.url) |
| | | // custom logging |
| | | log.info(`${req.method} ${req.url}`); |
| | | // console.log(req.url) |
| | | |
| | | const token = req.query.token |
| | | console.log(req.url) |
| | | if (token !== settings.authtoken && !req.url.startsWith("/ui/")) { |
| | | console.error("# AUTH ERROR #", token) |
| | | log.error("# AUTH ERROR #", token) |
| | | await promiseDelay(500) // delay response to avoid denial of service attacks |
| | | res.code(403) |
| | | return res.send({status: "error", error: "access denied"}) |
| | | } |
| | | else { |
| | | console.log("AUTH FOR ", req.url) |
| | | log.debug("AUTH FOR ", req.url) |
| | | } |
| | | }) |
| | | |
| | |
| | | searchLib.doIndex().catch(console.error) |
| | | fastify |
| | | .get("/api/search/user", async function (req, res) { |
| | | console.log(req.query) |
| | | log.info(req.query) |
| | | const search = req.query?.search |
| | | if (!search) { |
| | | return res.code(422).send({status: "error", msg: "no search"}) |
| | | } |
| | | else { |
| | | console.log(search) |
| | | log.info(search) |
| | | const data = await searchLib.search(search) |
| | | return res.send(data) |
| | | } |
| | | }) |
| | | .post("/api/search/reindex", async function (req, res) { |
| | | console.log("REINDEX ++++") |
| | | log.info("REINDEX ++++") |
| | | const start = Date.now() |
| | | await searchLib.doIndex().catch(console.error) |
| | | return res.send({ |
| | |
| | | }) |
| | | .get("/api/user/teilnahmen/:userId", async function (req, res) { |
| | | let userId = req.params.userId |
| | | console.log(`--------${userId}-----------`, typeof userId) |
| | | log.debug(`--------${userId}-----------`, typeof userId) |
| | | if (!userId || isNaN(Number(userId))) { |
| | | return res.code(500).send({status: "error", msg: "userId error"}) |
| | | } |
| | |
| | | } |
| | | else { |
| | | const res2 = await libIlias.deleteUser(usr_id) |
| | | console.log(res2) |
| | | log.info(res2) |
| | | return res.send(res2) |
| | | } |
| | | }) |
| | |
| | | .post("/api/kurs/:refId/status/:usrId", async function (req, res) { |
| | | const {refId, usrId} = req.params |
| | | const {passed, status} = req.body |
| | | // console.log(88888888888888888888, {refId, usrId, passed, status}) |
| | | if (!refId || !usrId || _.isNil(passed) || _.isNil(status)) { |
| | | throw { |
| | | statusCode: 400, |
| | |
| | | |
| | | const indexFile = fs.readFileSync(path.join(__dirname, "vue/dist", 'index.html'), 'utf8') |
| | | fastify.setNotFoundHandler(function (req, res) { |
| | | console.log("!!!") |
| | | log.error("!!! Not found") |
| | | // res.sendFile("vue/dist/index.html") |
| | | res.type("text/html").send(indexFile) |
| | | }) |
| | |
| | | ///////////////////////////////////////////////////////////////////////// |
| | | |
| | | fastify.listen({port: settings.port}, function (err, address) { |
| | | console.log("📡 -=> Listening on", address) |
| | | log.info("📡 -=> Listening on", address) |
| | | if (err) { |
| | | fastify.log.error(err) |
| | | // fastify.log.error(err) |
| | | log.error(err) |
| | | process.exit(1) |
| | | } |
| | | // Server is now listening on ${address} |
| | |
| | | async function promiseDelay (ms) { |
| | | return new Promise(resolve => setTimeout(resolve, ms)) |
| | | } |
| | | |
| | |
| | | const mysql = require("mysql2/promise") |
| | | const dayjs = require("dayjs") |
| | | |
| | | const log = require("../logger") |
| | | const searchLib = require("./search") |
| | | const {host, port, user, database, password} = require("./../settings").db |
| | | |
| | |
| | | } |
| | | |
| | | async function getUsers (offset = 0, limit = 10, search = null) { |
| | | console.log("++++++++++ get users", offset, limit, search) |
| | | log.info("++++++++++ get users", offset, limit, search) |
| | | limit = Number(limit) || 10 |
| | | offset = Number(offset) || 0 |
| | | // TODO check args for SQL Injection |
| | |
| | | |
| | | try { |
| | | let userSearchQuery = await getUserSearchQuery(offset, limit, search) |
| | | // console.log(userSearchQuery) |
| | | // log.info(userSearchQuery) |
| | | const [results, fields] = await pool.query(userSearchQuery) |
| | | const count = await getUserCount(offset, limit, search) |
| | | return { |
| | |
| | | WHERE (or2.ref_id = ${ref_id} OR parent_id = ${ref_id}) |
| | | ORDER BY usr_id |
| | | ` |
| | | // console.log(q) |
| | | // log.info(q) |
| | | const [results] = await pool.query(q) |
| | | return results |
| | | } |
| | |
| | | AND om.usr_id = ${usr_id} |
| | | ORDER BY usr_id |
| | | ` |
| | | // console.log(q) |
| | | // log.info(q) |
| | | const [results] = await pool.query(q) |
| | | return results[0] |
| | | } |
| | |
| | | WHERE om.usr_id = ${usr_id} |
| | | AND om.member = 1 |
| | | ` |
| | | console.log(q) |
| | | log.info(q) |
| | | const [results] = await pool.query(q) |
| | | return results |
| | | } |
| | |
| | | * |
| | | * @param courseId |
| | | * @param userId |
| | | * @param passed |
| | | * @param status |
| | | * @param {Number} passed |
| | | * @param {Number} status |
| | | * @returns {Promise<{status: string}>} |
| | | */ |
| | | async function setStatus (courseId, userId, passed = null, status = null) { |
| | |
| | | const fs = require("node:fs") |
| | | const _ = require("lodash") |
| | | const {Index, Document, Worker} = require("flexsearch") |
| | | |
| | | const settings = require("../settings") |
| | | const fs = require("node:fs") |
| | | const log = require("../logger") |
| | | |
| | | ///////////////////////////////////////////////////////////////////////// |
| | | |
| | |
| | | } |
| | | |
| | | // run() |
| | | // .then(console.log) |
| | | // .then(log.info) |
| | | // .catch(console.error) |
| | | |
| | | async function run () { |
| | | await doIndex() |
| | | console.log(search("latu")) |
| | | log.info(search("latu")) |
| | | } |
| | | |
| | | ///////////////////////////////////////////////////////////////////////// |
| | |
| | | let indexed = false |
| | | async function doIndex () { |
| | | const start = Date.now() |
| | | console.log("++ START indexing Users...") |
| | | log.info("++ START indexing Users...") |
| | | const {readFromFile, file} = settings.search |
| | | clearIndex(idxUser) |
| | | |
| | |
| | | users = JSON.parse(users) |
| | | } |
| | | else { |
| | | console.log("~~~ reading users from DB ... ~~~") |
| | | log.info("~~~ reading users from DB ... ~~~") |
| | | const db = require("./db") |
| | | const {data} = await db.getUsers(0, 100000) |
| | | console.log(`loaded ${data.length} users from DB...`) |
| | | log.info(`loaded ${data.length} users from DB...`) |
| | | users = data |
| | | } |
| | | |
| | |
| | | // addTags(user) |
| | | } |
| | | indexed = true |
| | | console.log(`++ END indexing Users in ${Date.now() - start}ms`) |
| | | log.info(`++ END indexing Users in ${Date.now() - start}ms`) |
| | | } |
| | | |
| | | async function search (query) { |
| | |
| | | |
| | | function searchUsers (query, user) { |
| | | // query = query.split(" ").join(" OR ") // ohne das "OR" scheint immer nur "AND" zu sein | die search option {bool:"or"} wird ignoriert |
| | | // console.log(`searching messages for "${query}"`) |
| | | // log.info(`searching messages for "${query}"`) |
| | | return idxUser.search(`${user} ${query}`, {suggest: true}) |
| | | } |
| | | |
| | |
| | | |
| | | function getUserString (user) { |
| | | const {usr_id, firstname, lastname, login, institution, department} = user |
| | | // if(firstname.trim()==="Adolfo") console.log(user) |
| | | // if(firstname.trim()==="Adolfo") log.info(user) |
| | | return `${login} ${firstname} ${lastname} ${institution} ${department}`.trim() |
| | | // return `${usr_id} ${login} ${firstname} ${lastname} ${institution} ${department}`.trim() // KEINE usr_id |
| | | // return `${usr_id} ${firstname} ${lastname}`.trim() |
| New file |
| | |
| | | const _ = require("lodash") |
| | | const dayjs = require("dayjs") |
| | | |
| | | ///////////////////////////////////////////////////////////////////////// |
| | | |
| | | module.exports = { |
| | | debug: msg => log("DEBUG", msg), |
| | | info: msg => log("INFO", msg), |
| | | warn: msg => log("WARN", msg), |
| | | error: msg => log("ERROR", msg), |
| | | } |
| | | |
| | | ///////////////////////////////////////////////////////////////////////// |
| | | |
| | | function log (level, msg) { |
| | | if (!_.isString(msg)) { |
| | | if (msg.message) { |
| | | msg = msg.message |
| | | } |
| | | else { |
| | | msg = JSON.stringify(msg) |
| | | } |
| | | } |
| | | console.log(`${level} ${dayjs().format("DD.MM.YYYY HH:mm:ss")} - ${msg}`) |
| | | } |
| | |
| | | var nconf = require("nconf") |
| | | const log = require("./logger") |
| | | |
| | | var env = process.env["NODE_ENV"] |
| | | if (!env) throw new Error("NODE_ENV required!") |
| | | console.log("Using NODE_ENV='%s'", env) |
| | | log.info("Using NODE_ENV='%s'", env) |
| | | |
| | | var file = "settings." + env + ".json" |
| | | console.log("Reading config file '%s'", file) |
| | | log.info("Reading config file '%s'", file) |
| | | nconf.file("prod", file) |
| | | nconf.file("default", "settings.default.json") |
| | | |