implemented getter for course event details

This commit is contained in:
2025-11-16 01:29:22 -05:00
parent ca152f7955
commit 0ff3fc58de
3 changed files with 43 additions and 5 deletions

View File

@@ -1,5 +1,5 @@
import { CourseAttendee } from "@app/shared/types/course"; 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"; import { Request, Response, Router } from "express";
const courseRouter = Router(); 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) => { eventRouter.get('/attendees/:id', async (req: Request, res: Response) => {
try { try {
const attendees: CourseAttendee[] = await getCourseAttendees(Number(req.params.id)); const attendees: CourseAttendee[] = await getCourseEventAttendees(Number(req.params.id));
res.status(200).json(attendees); res.status(200).json(attendees);
} catch (err) { } catch (err) {
console.error('failed to fetch attendees', err); console.error('failed to fetch attendees', err);

View File

@@ -1,5 +1,5 @@
import pool from "../db" 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<Course[]> { export async function getAllCourses(): Promise<Course[]> {
const sql = "SELECT * FROM courses WHERE deleted = false;" const sql = "SELECT * FROM courses WHERE deleted = false;"
@@ -32,7 +32,7 @@ function buildAttendee(row: RawAttendeeRow): CourseAttendee {
}; };
} }
export async function getCourseAttendees(id: number): Promise<CourseAttendee[]> { export async function getCourseEventAttendees(id: number): Promise<CourseAttendee[]> {
const sql = `SELECT const sql = `SELECT
ca.*, ca.*,
ar.id AS role_id, ar.id AS role_id,
@@ -48,4 +48,12 @@ export async function getCourseAttendees(id: number): Promise<CourseAttendee[]>
const res:RawAttendeeRow[] = await pool.query(sql, [id]); const res:RawAttendeeRow[] = await pool.query(sql, [id]);
return res.map((row) => buildAttendee(row)) return res.map((row) => buildAttendee(row))
}
export async function getCourseEventDetails(id: number): Promise<CourseEventDetails> {
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;
} }

View File

@@ -6,11 +6,30 @@ export interface Course {
description?: string | null; description?: string | null;
image_url?: string | null; image_url?: string | null;
created_at: string; created_at: string;
updated_at: string; updated_at: string;
deleted?: number | boolean; deleted?: number | boolean;
prereq_id?: number | null; 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 { export interface CourseAttendee {
passed: boolean; // tinyint(1) passed: boolean; // tinyint(1)
attendee_id: number; // PK attendee_id: number; // PK