integrated the new logger across the entire API
This commit is contained in:
@@ -6,6 +6,7 @@ import pool from '../db';
|
||||
import { closeLOA, createNewLOA, getAllLOA, getLOAbyID, getLoaTypes, getUserLOA, setLOAExtension } from '../services/db/loaService';
|
||||
import { LOARequest } from '@app/shared/types/loa';
|
||||
import { requireLogin, requireRole } from '../middleware/auth';
|
||||
import { logger } from '../services/logging/logger';
|
||||
|
||||
router.use(requireLogin);
|
||||
|
||||
@@ -18,9 +19,17 @@ router.post("/", async (req: Request, res: Response) => {
|
||||
|
||||
try {
|
||||
await createNewLOA(LOARequest);
|
||||
logger.info('app', 'LOA Posted', { poster: req.user.id, user: LOARequest.member_id })
|
||||
res.sendStatus(201);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error(
|
||||
'app',
|
||||
'Failed to post LOA',
|
||||
{
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
}
|
||||
);
|
||||
res.status(500).send(error);
|
||||
}
|
||||
});
|
||||
@@ -32,10 +41,17 @@ router.post("/admin", [requireRole(['17th Administrator', '17th HQ', '17th Comma
|
||||
LOARequest.filed_date = new Date();
|
||||
try {
|
||||
await createNewLOA(LOARequest);
|
||||
logger.info('app', 'LOA Posted', { poster: req.user.id, user: LOARequest.member_id })
|
||||
res.sendStatus(201);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
res.status(500).send(error);
|
||||
logger.error(
|
||||
'app',
|
||||
'Failed to post LOA',
|
||||
{
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
}
|
||||
); res.status(500).send(error);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -46,7 +62,14 @@ router.get("/me", async (req: Request, res: Response) => {
|
||||
const result = await getUserLOA(user);
|
||||
res.status(200).json(result)
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error(
|
||||
'app',
|
||||
'Failed to get user current LOA',
|
||||
{
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
}
|
||||
);
|
||||
res.status(500).send(error);
|
||||
}
|
||||
})
|
||||
@@ -62,7 +85,14 @@ router.get("/history", async (req: Request, res: Response) => {
|
||||
const result = await getUserLOA(user, page, pageSize);
|
||||
res.status(200).json(result)
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error(
|
||||
'app',
|
||||
'Failed to get user LOA history',
|
||||
{
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
}
|
||||
);
|
||||
res.status(500).send(error);
|
||||
}
|
||||
})
|
||||
@@ -74,7 +104,14 @@ router.get('/all', [requireRole(['17th Administrator', '17th HQ', '17th Command'
|
||||
const result = await getAllLOA(page, pageSize);
|
||||
res.status(200).json(result)
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error(
|
||||
'app',
|
||||
'Failed to get full LOA history',
|
||||
{
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
}
|
||||
);
|
||||
res.status(500).send(error);
|
||||
}
|
||||
})
|
||||
@@ -84,8 +121,15 @@ router.get('/types', async (req: Request, res: Response) => {
|
||||
let out = await getLoaTypes();
|
||||
res.status(200).json(out);
|
||||
} catch (error) {
|
||||
logger.error(
|
||||
'app',
|
||||
'Failed to get LOA types',
|
||||
{
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
}
|
||||
);
|
||||
res.status(500).json(error);
|
||||
console.error(error);
|
||||
}
|
||||
})
|
||||
|
||||
@@ -99,9 +143,19 @@ router.post('/cancel/:id', async (req: Request, res: Response) => {
|
||||
}
|
||||
|
||||
await closeLOA(Number(req.params.id), closer);
|
||||
|
||||
logger.info('app', 'LOA Closed', { closed_by: closer, LOA: id })
|
||||
|
||||
res.sendStatus(200);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error(
|
||||
'app',
|
||||
'Failed to cancel LOA',
|
||||
{
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
}
|
||||
);
|
||||
res.status(500).json(error);
|
||||
}
|
||||
})
|
||||
@@ -111,14 +165,24 @@ router.post('/adminCancel/:id', [requireRole(['17th Administrator', '17th HQ', '
|
||||
let closer = req.user.id;
|
||||
try {
|
||||
await closeLOA(Number(req.params.id), closer);
|
||||
|
||||
logger.info('app', 'LOA Closed', { closed_by: closer, LOA: req.params.id })
|
||||
|
||||
res.sendStatus(200);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error(
|
||||
'app',
|
||||
'Failed to cancel LOA',
|
||||
{
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
}
|
||||
);
|
||||
res.status(500).json(error);
|
||||
}
|
||||
})
|
||||
|
||||
// TODO: Enforce admin only
|
||||
// extend LOA
|
||||
router.post('/extend/:id', [requireRole(['17th Administrator', '17th HQ', '17th Command'])], async (req: Request, res: Response) => {
|
||||
const to: Date = req.body.to;
|
||||
|
||||
@@ -128,27 +192,71 @@ router.post('/extend/:id', [requireRole(['17th Administrator', '17th HQ', '17th
|
||||
|
||||
try {
|
||||
await setLOAExtension(Number(req.params.id), to);
|
||||
logger.info('app', 'LOA Extended', { extended_by: req.user.id, LOA: req.params.id })
|
||||
|
||||
res.sendStatus(200);
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
logger.error(
|
||||
'app',
|
||||
'Failed to extend LOA',
|
||||
{
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
}
|
||||
);
|
||||
res.status(500).json(error);
|
||||
}
|
||||
})
|
||||
|
||||
// GET /policy
|
||||
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}`,
|
||||
}
|
||||
})
|
||||
const t0 = performance.now();
|
||||
|
||||
if (output.ok) {
|
||||
const out = await output.json();
|
||||
try {
|
||||
const response = await fetch(`${process.env.DOC_HOST}/api/pages/42`, {
|
||||
headers: {
|
||||
Authorization: `Token ${process.env.DOC_TOKEN_ID}:${process.env.DOC_TOKEN_SECRET}`,
|
||||
},
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const text = await response.text();
|
||||
|
||||
logger.error('app', 'Failed to fetch policy page from Bookstack', {
|
||||
pageId: 42,
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
body: text,
|
||||
userId: req.user?.id,
|
||||
});
|
||||
|
||||
return res.sendStatus(500);
|
||||
}
|
||||
|
||||
const out = await response.json();
|
||||
res.status(200).json(out.html);
|
||||
} else {
|
||||
console.error("Failed to fetch LOA policy from bookstack");
|
||||
|
||||
logger.info(
|
||||
'profiling',
|
||||
'GET /policy completed',
|
||||
{
|
||||
pageId: 42,
|
||||
total_ms: performance.now() - t0,
|
||||
},
|
||||
'profiling'
|
||||
);
|
||||
|
||||
} catch (error) {
|
||||
logger.error('app', 'Error fetching policy page from Bookstack', {
|
||||
pageId: 42,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
userId: req.user?.id,
|
||||
});
|
||||
|
||||
res.sendStatus(500);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
|
||||
export const loaRouter = router;
|
||||
Reference in New Issue
Block a user