From 0ff3fc58deb608c50d262f9867551a74adcbdf0f Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Sun, 16 Nov 2025 01:29:22 -0500 Subject: [PATCH] implemented getter for course event details --- api/src/routes/course.ts | 15 +++++++++++++-- api/src/services/CourseSerivce.ts | 12 ++++++++++-- shared/types/course.ts | 21 ++++++++++++++++++++- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/api/src/routes/course.ts b/api/src/routes/course.ts index 527abf9..7a61097 100644 --- a/api/src/routes/course.ts +++ b/api/src/routes/course.ts @@ -1,5 +1,5 @@ import { CourseAttendee } from "@app/shared/types/course"; -import { getAllCourses, getCourseAttendees } from "../services/CourseSerivce"; +import { getAllCourses, getCourseEventAttendees, getCourseEventDetails } from "../services/CourseSerivce"; import { Request, Response, Router } from "express"; const courseRouter = Router(); @@ -15,9 +15,20 @@ courseRouter.get('/', async (req, res) => { } }) +eventRouter.get('/:id', async (req: Request, res: Response) => { + try { + let out = await getCourseEventDetails(Number(req.params.id)); + console.log(out); + res.status(200).json(out); + } catch (error) { + console.error('failed to fetch report', error); + res.status(500).json(error); + } +}); + eventRouter.get('/attendees/:id', async (req: Request, res: Response) => { try { - const attendees: CourseAttendee[] = await getCourseAttendees(Number(req.params.id)); + const attendees: CourseAttendee[] = await getCourseEventAttendees(Number(req.params.id)); res.status(200).json(attendees); } catch (err) { console.error('failed to fetch attendees', err); diff --git a/api/src/services/CourseSerivce.ts b/api/src/services/CourseSerivce.ts index c24d9b9..5d913a6 100644 --- a/api/src/services/CourseSerivce.ts +++ b/api/src/services/CourseSerivce.ts @@ -1,5 +1,5 @@ import pool from "../db" -import { Course, CourseAttendee, RawAttendeeRow } from "@app/shared/types/course" +import { Course, CourseAttendee, CourseEventDetails, RawAttendeeRow } from "@app/shared/types/course" export async function getAllCourses(): Promise { const sql = "SELECT * FROM courses WHERE deleted = false;" @@ -32,7 +32,7 @@ function buildAttendee(row: RawAttendeeRow): CourseAttendee { }; } -export async function getCourseAttendees(id: number): Promise { +export async function getCourseEventAttendees(id: number): Promise { const sql = `SELECT ca.*, ar.id AS role_id, @@ -48,4 +48,12 @@ export async function getCourseAttendees(id: number): Promise const res:RawAttendeeRow[] = await pool.query(sql, [id]); return res.map((row) => buildAttendee(row)) +} + +export async function getCourseEventDetails(id: number): Promise { + const sql = `SELECT * FROM course_events WHERE id = ?;`; + let rows: CourseEventDetails[] = await pool.query(sql, [id]); + let event = rows[0]; + event.attendees = await getCourseEventAttendees(id); + return event; } \ No newline at end of file diff --git a/shared/types/course.ts b/shared/types/course.ts index 13f77f2..5e36f6f 100644 --- a/shared/types/course.ts +++ b/shared/types/course.ts @@ -6,11 +6,30 @@ export interface Course { description?: string | null; image_url?: string | null; created_at: string; - updated_at: string; + updated_at: string; deleted?: number | boolean; prereq_id?: number | null; } +export interface CourseEventDetails { + id: number; // PK + course_id: number | null; // FK → courses.id + event_type: number | null; // FK → event_types.id + event_date: string; // datetime (not nullable) + + guilded_event_id: number | null; + + created_at: string; // datetime + updated_at: string; // datetime + + deleted: boolean | null; // tinyint(4), nullable + report_url: string | null; // varchar(2048) + remarks: string | null; // text + + attendees: CourseAttendee[] | null; +} + + export interface CourseAttendee { passed: boolean; // tinyint(1) attendee_id: number; // PK