More bookstack integration stuff

This commit is contained in:
2025-12-11 15:49:08 -05:00
parent 7ab06b6a4c
commit a3216ba5ab
4 changed files with 89 additions and 4 deletions

View File

@@ -22,4 +22,9 @@ CLIENT_DOMAIN= #whatever.com
# Glitchtip
GLITCHTIP_DSN=
DISABLE_GLITCHTIP= # true/false
DISABLE_GLITCHTIP= # true/false
# Bookstack
DOC_HOST= # https://bookstack.whatever.com/
DOC_TOKEN_SECRET=
DOC_TOKEN_ID=

View File

@@ -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;

View File

@@ -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<LOARequest> {
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) {
}

View File

@@ -91,7 +91,7 @@ export async function getLoaTypes(): Promise<LOAType[]> {
export async function getLoaPolicy(): Promise<string> {
//@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<string> {
} else {
return null;
}
}
}