Training-Report #27
@@ -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);
|
||||
|
||||
@@ -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<Course[]> {
|
||||
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
|
||||
ca.*,
|
||||
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]);
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user