From a3216ba5ab345f54557cba60c887e7c9b9b1181a Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Thu, 11 Dec 2025 15:49:08 -0500 Subject: [PATCH] More bookstack integration stuff --- api/.env.example | 7 +++- api/src/routes/loa.ts | 60 +++++++++++++++++++++++++++++++++- api/src/services/loaService.ts | 22 +++++++++++++ ui/src/api/loa.ts | 4 +-- 4 files changed, 89 insertions(+), 4 deletions(-) diff --git a/api/.env.example b/api/.env.example index a740a31..21bf82e 100644 --- a/api/.env.example +++ b/api/.env.example @@ -22,4 +22,9 @@ CLIENT_DOMAIN= #whatever.com # Glitchtip GLITCHTIP_DSN= -DISABLE_GLITCHTIP= # true/false \ No newline at end of file +DISABLE_GLITCHTIP= # true/false + +# Bookstack +DOC_HOST= # https://bookstack.whatever.com/ +DOC_TOKEN_SECRET= +DOC_TOKEN_ID= \ No newline at end of file diff --git a/api/src/routes/loa.ts b/api/src/routes/loa.ts index 8602b38..65cbf4a 100644 --- a/api/src/routes/loa.ts +++ b/api/src/routes/loa.ts @@ -3,7 +3,7 @@ const router = express.Router(); import { Request, Response } from 'express'; import pool from '../db'; -import { createNewLOA, getAllLOA, getLoaTypes, getUserLOA } from '../services/loaService'; +import { closeLOA, createNewLOA, getAllLOA, getLOAbyID, getLoaTypes, getUserLOA } from '../services/loaService'; import { LOARequest } from '@app/shared/types/loa'; //member posts LOA @@ -73,4 +73,62 @@ router.get('/types', async (req: Request, res: Response) => { } }) +router.post('/cancel/:id', async (req: Request, res: Response) => { + let closer = req.user.id; + let id = Number(req.params.id); + try { + let loa = await getLOAbyID(id); + if (loa.member_id != closer) { + return res.sendStatus(403); + } + + await closeLOA(Number(req.params.id), closer); + res.sendStatus(200); + } catch (error) { + console.error(error); + res.status(500).json(error); + } +}) + +//TODO: enforce admin only +router.post('/adminCancel/:id', async (req: Request, res: Response) => { + let closer = req.user.id; + try { + await closeLOA(Number(req.params.id), closer); + res.sendStatus(200); + } catch (error) { + console.error(error); + res.status(500).json(error); + } +}) + +// TODO: Enforce admin only +router.post('/extend/:id', async (req: Request, res: Response) => { + const extendTo = req.body; + console.log(extendTo); + try { + + } catch (error) { + console.error(error) + res.status(500).json(error); + } +}) + +router.get('/policy', async (req: Request, res: Response) => { + const output = await fetch(`${process.env.DOC_HOST}/api/pages/42`, { + headers: { + Authorization: `Token ${process.env.DOC_TOKEN_ID}:${process.env.DOC_TOKEN_SECRET}`, + } + }) + + if (output.ok) { + const out = await output.json(); + console.log(out); + res.status(200).json(out); + } else { + console.log("BAD"); + res.sendStatus(500); + } +}) + module.exports = router; diff --git a/api/src/services/loaService.ts b/api/src/services/loaService.ts index 1261a1e..129f5e2 100644 --- a/api/src/services/loaService.ts +++ b/api/src/services/loaService.ts @@ -27,4 +27,26 @@ export async function createNewLOA(data: LOARequest) { VALUES (?, ?, ?, ?, ?, ?)`; await pool.query(sql, [data.member_id, toDateTime(data.filed_date), toDateTime(data.start_date), toDateTime(data.end_date), data.type_id, data.reason]) return; +} + +export async function closeLOA(id: number, closer: number) { + const sql = `UPDATE leave_of_absences + SET closed = 1, + closed_by = ? + WHERE leave_of_absences.id = ?`; + let out = await pool.query(sql, [closer, id]); + console.log(out); + return out; +} + +export async function getLOAbyID(id: number): Promise { + let res = await pool.query(`SELECT * FROM leave_of_absences WHERE id = ?`, [id]); + if (res.length != 1) + throw new Error(`LOA with id ${id} not found`); + return res[0]; +} + +export async function setLOAExtension(id: number, extendTo: Date) { + + } \ No newline at end of file diff --git a/ui/src/api/loa.ts b/ui/src/api/loa.ts index f21f7d7..80417d9 100644 --- a/ui/src/api/loa.ts +++ b/ui/src/api/loa.ts @@ -91,7 +91,7 @@ export async function getLoaTypes(): Promise { export async function getLoaPolicy(): Promise { //@ts-ignore - const res = await fetch(`${import.meta.env.VITE_DOCHOST}/api/pages/42`, { + const res = await fetch(`${addr}/loa/policy`, { method: "GET", credentials: 'include', }); @@ -105,4 +105,4 @@ export async function getLoaPolicy(): Promise { } else { return null; } -} \ No newline at end of file +}