REST Service for POPCORN - ILIAS
alex
2025-11-17 3d646156c378c6182e55c673c118c23d53ff0a05
app.js
@@ -8,6 +8,9 @@
const dayjs = require("dayjs")
const log = require("./logger")
log.info("")
log.info(`--- STARTUP ${dayjs().format("DD.MM.YYYY HH:mm:ss")} ---`)
const db = require("./lib/db")
const libIlias = require("./lib/libIlias")
const settings = require("./settings")
@@ -27,15 +30,21 @@
   // console.log(req.url)
   const token = req.query.token
   if (token !== settings.authtoken && !req.url.startsWith("/ui/")) {
   if (token !== settings.authtoken && !req.url.startsWith("/ui/") && !req.url.startsWith("/api/version")) {
      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 {
      // log.debug("AUTH FOR ", req.url)
   }
   else {
      log.debug("AUTH FOR ", req.url)
   }
})
/////// VERSION ////////////////////////////////////////////////////////////////
fastify.get("/api/version", async function (req, res) {
   const {version} = require("./package.json")
   return res.send({version})
})
/////// SEARCH ////////////////////////////////////////////////////////////////
@@ -43,14 +52,14 @@
const searchLib = require("./lib/search")
const {setStatus} = require("./lib/db")
searchLib.doIndex().catch(console.error)
fastify
   .get("/api/search/user", async function (req, res) {
      log.info(req.query)
      const search = req.query?.search
      if (!search) {
         return res.code(422).send({status: "error", msg: "no search"})
      }
      else {
      } else {
         log.info(search)
         const data = await searchLib.search(search)
         return res.send(data)
@@ -66,8 +75,10 @@
      })
   })
/////// USER ////////////////////////////////////////////////////////////////
fastify
   /////// USER ////////////////////////////////////////////////////////////////
   .get('/api/user', async function (req, res) {
      const {offset, limit, search} = req.query
      const users = await db.getUsers(offset, limit, search)
@@ -82,8 +93,7 @@
      const user = await db.getUserByLogin(login)
      if (user) {
         return res.send(user)
      }
      else {
      } else {
         return res.code(404).send({status: "error", msg: "not found"})
      }
   })
@@ -95,8 +105,7 @@
      const user = await db.getUserByUserId(userid)
      if (user) {
         return res.send(user)
      }
      else {
      } else {
         return res.code(404).send({status: "error", msg: "not found"})
      }
   })
@@ -109,8 +118,7 @@
      const tn = await db.getUserTeilnahmen(userId)
      if (tn) {
         return res.send(tn)
      }
      else {
      } else {
         return res.code(404).send({status: "error", msg: "not found"})
      }
   })
@@ -121,16 +129,11 @@
      return res.send(res2)
   })
   .delete("/api/user", async function (req, res) { // DELETE ALL users
      const res2 = await libIlias.deleteAllUsers()
      return res.send(res2)
   })
   .delete("/api/user/:usr_id", async function (req, res) {
      const {usr_id} = req.params
      if (!usr_id || isNaN(Number(usr_id))) {
         return res.code(500).send({status: "error", msg: "userId error"})
      }
      else {
      } else {
         const res2 = await libIlias.deleteUser(usr_id)
         log.info(res2)
         return res.send(res2)
@@ -144,8 +147,7 @@
      const data = await db.getObjIdFromRefId(ref_id)
      if (data) {
         return res.send(data)
      }
      else {
      } else {
         return res.code(404).send({status: "error", msg: "not found"})
      }
   })
@@ -154,8 +156,7 @@
      let data = await db.getRefIdFromObjId(obj_id)
      if (data) {
         return res.send(data)
      }
      else {
      } else {
         return res.code(404).send({status: "error", msg: "not found"})
      }
   })
@@ -166,8 +167,7 @@
      let data = await db.getKurse()
      if (data) {
         return res.send(data)
      }
      else {
      } else {
         return res.code(404).send({status: "error", msg: "not found"})
      }
   })
@@ -176,8 +176,7 @@
      let data = await db.getKurs(refId)
      if (data) {
         return res.send(data)
      }
      else {
      } else {
         return res.code(404).send({status: "error", msg: "not found"})
      }
   })
@@ -186,8 +185,7 @@
      let data = await db.getKursItems2(refId)
      if (data) {
         return res.send(data)
      }
      else {
      } else {
         return res.code(404).send({status: "error", msg: "not found"})
      }
   })
@@ -196,8 +194,20 @@
      let data = await db.getKursTeilnehmer(refId)
      if (data) {
         return res.send(data)
      } else {
         return res.code(404).send({status: "error", msg: "not found"})
      }
      else {
   })
   .get("/api/kurs/:refId/lp", async function (req, res) {
      const {refId} = req.params
      const {obj_id: objId} = await db.getObjIdFromRefId(refId)
      const raw = req.query.raw
      let data = await db.getKursLp(objId, raw)
      if (data) {
         return res.send(data)
      } else {
         return res.code(404).send({status: "error", msg: "not found"})
      }
   })
@@ -217,8 +227,7 @@
      let data = await db.getSingleKursTeilnehmer(refId, userId)
      if (data) {
         return res.send(data)
      }
      else {
      } else {
         return res.code(404).send({status: "error", msg: "not found"})
      }
   })
@@ -258,6 +267,36 @@
      }
   })
   .get("/api/kurs/:refId/offline", async function (req, res) {
      const refId = Number(req.params.refId)
      try {
         const {obj_id} = await db.getObjIdFromRefId(refId)
         const res2 = await db.getKursOffline(obj_id)
         return res.send(res2)
      } catch (err) {
         console.error(err)
         log.error(err.message)
         return res.code(500).send({status: "error", message: err.message})
      }
   })
   .post("/api/kurs/:refId/offline", async function (req, res) {
      const refId = Number(req.params.refId)
      const {offline} = req.body
      // console.dir(req.body, {depth: null, colors: true, maxArrayLength: null})
      try {
         const {obj_id} = await db.getObjIdFromRefId(refId)
         const res2 = await db.setKursOffline(offline, obj_id)
         return res.send(res2)
      } catch (err) {
         console.error(err)
         log.error(err.message)
         return res.code(500).send({status: "error", message: err.message})
      }
   })
   // abmelden
   .delete("/api/kurs/:refId/teilnehmer/:usrId", async function (req, res) {
      const {refId, usrId} = req.params
      if (!refId || !usrId) throw {status: "error", msg: "refId and usrId requried"}
@@ -299,7 +338,8 @@
/////////////////////////////////////////////////////////////////////////
fastify.listen({port: settings.port}, function (err, address) {
   log.info("📡 -=> Listening on", address)
   console.log(address)
   log.info(`📡 -=> Listening on ${address}`)
   if (err) {
      // fastify.log.error(err)
      log.error(err)
@@ -310,7 +350,7 @@
/////////////////////////////////////////////////////////////////////////
async function promiseDelay (ms) {
async function promiseDelay(ms) {
   return new Promise(resolve => setTimeout(resolve, ms))
}