added API support for posting training reports

This commit is contained in:
2025-11-16 10:10:09 -05:00
parent 0ff3fc58de
commit 810a15d279
3 changed files with 47 additions and 7 deletions

View File

@@ -1,5 +1,5 @@
import { CourseAttendee } from "@app/shared/types/course"; import { CourseAttendee, CourseEventDetails } from "@app/shared/types/course";
import { getAllCourses, getCourseEventAttendees, getCourseEventDetails } from "../services/CourseSerivce"; import { getAllCourses, getCourseEventAttendees, getCourseEventDetails, insertCourseEvent } from "../services/CourseSerivce";
import { Request, Response, Router } from "express"; import { Request, Response, Router } from "express";
const courseRouter = Router(); const courseRouter = Router();
@@ -36,6 +36,18 @@ eventRouter.get('/attendees/:id', async (req: Request, res: Response) => {
} }
}) })
eventRouter.post('/', async (req: Request, res: Response) => {
try {
console.log();
const data: CourseEventDetails = req.body;
await insertCourseEvent(data);
res.sendStatus(201);
} catch (error) {
console.error('failed to post training', error);
res.status(500).json("failed to post training\n" + error)
}
})
// //insert a new latest rank for a user // //insert a new latest rank for a user
// ur.post('/', async (req, res) => { // ur.post('/', async (req, res) => {

View File

@@ -57,3 +57,31 @@ export async function getCourseEventDetails(id: number): Promise<CourseEventDeta
event.attendees = await getCourseEventAttendees(id); event.attendees = await getCourseEventAttendees(id);
return event; return event;
} }
export async function insertCourseEvent(event: CourseEventDetails): Promise<number> {
const con = await pool.getConnection();
try {
await con.beginTransaction();
const res = await con.execute("INSERT INTO course_events (course_id, event_date, remarks) VALUES (?, ?, ?);", [event.course_id, event.event_date, event.remarks]);
var eventID: number = res.insertId;
for (const attendee of event.attendees) {
await con.execute(`INSERT INTO course_attendees (
attendee_id,
course_event_id,
attendee_role_id,
passed,
remarks
)
VALUES (?, ?, ?, ?, ?);`, [attendee.attendee_id, eventID, attendee.attendee_role_id, attendee.passed, attendee.remarks]);
}
await con.commit();
} catch (error) {
await con.rollback();
throw error;
} finally {
await con.release();
return eventID;
}
}

View File

@@ -12,7 +12,7 @@ export interface Course {
} }
export interface CourseEventDetails { export interface CourseEventDetails {
id: number; // PK id: number | null; // PK
course_id: number | null; // FK → courses.id course_id: number | null; // FK → courses.id
event_type: number | null; // FK → event_types.id event_type: number | null; // FK → event_types.id
event_date: string; // datetime (not nullable) event_date: string; // datetime (not nullable)