Implemented system to track member qualifications from training reports

This commit is contained in:
2026-03-31 18:57:47 -04:00
parent e672159c51
commit 0deb2ac316
10 changed files with 518 additions and 4 deletions

View File

@@ -1,10 +1,11 @@
import { CourseAttendee, CourseEventDetails } from "@app/shared/types/course";
import { getAllCourses, getCourseEventAttendees, getCourseEventDetails, getCourseEventRoles, getCourseEvents, insertCourseEvent } from "../services/db/CourseSerivce";
import { getAllCourses, getCourseEventAttendees, getCourseEventDetails, getCourseEventRoles, getCourseEvents, insertCourseEvent, updateCourseEvent } from "../services/db/CourseSerivce";
import { Request, Response, Router } from "express";
import { requireLogin, requireMemberState } from "../middleware/auth";
import { requireLogin, requireMemberState, requireRole } from "../middleware/auth";
import { MemberState } from "@app/shared/types/member";
import { logger } from "../services/logging/logger";
import { audit } from "../services/logging/auditLog";
import { syncQualificationsForCourseEvent } from "../services/db/qualificationService";
const cr = Router();
const er = Router();
@@ -125,9 +126,10 @@ er.post('/', async (req: Request, res: Response) => {
data.created_by = posterID;
data.event_date = new Date(data.event_date);
const id = await insertCourseEvent(data);
const syncOutcome = await syncQualificationsForCourseEvent(id, posterID);
audit.course('report_created', { actorId: posterID, targetId: id });
logger.info('app', 'Training report posted', { user: posterID, report: id })
audit.course('report_created', { actorId: posterID, targetId: id }, { qualificationSync: syncOutcome });
logger.info('app', 'Training report posted', { user: posterID, report: id, qualificationSync: syncOutcome })
res.status(201).json(id);
} catch (error) {
logger.error(
@@ -143,5 +145,34 @@ er.post('/', async (req: Request, res: Response) => {
}
})
er.put('/:id', [requireLogin, requireMemberState(MemberState.Member), requireRole("dev")], async (req: Request, res: Response) => {
const editorID: number = req.user.id;
const reportId = Number(req.params.id);
try {
let data: CourseEventDetails = req.body;
data.event_date = new Date(data.event_date);
await updateCourseEvent(reportId, data);
const syncOutcome = await syncQualificationsForCourseEvent(reportId, editorID);
audit.course('report_edited', { actorId: editorID, targetId: reportId }, { qualificationSync: syncOutcome });
logger.info('app', 'Training report edited', { user: editorID, report: reportId, qualificationSync: syncOutcome })
res.sendStatus(200);
} catch (error) {
logger.error(
'app',
'Failed to edit training report',
{
user: editorID,
report: reportId,
error: error instanceof Error ? error.message : String(error),
stack: error instanceof Error ? error.stack : undefined,
}
);
res.status(500).json("failed to edit training\n" + error)
}
})
export const courseRouter = cr;
export const eventRouter = er;