elearning/Backend/src/controllers/AdminCourseApprovalController.ts
JakkrapartXD c118e5c3dc
All checks were successful
Build and Deploy Backend / Build Backend Docker Image (push) Successful in 28s
Build and Deploy Backend / Deploy E-learning Backend to Dev Server (push) Successful in 3s
Build and Deploy Backend / Notify Deployment Status (push) Successful in 1s
feat: Add k6 video watching load test and remove optional comment body from admin course approval.
2026-02-19 15:20:34 +07:00

97 lines
4 KiB
TypeScript

import { Body, Get, Path, Post, Request, Response, Route, Security, SuccessResponse, Tags } from 'tsoa';
import { ValidationError } from '../middleware/errorHandler';
import { AdminCourseApprovalService } from '../services/AdminCourseApproval.service';
import { RejectCourseValidator } from '../validators/AdminCourseApproval.validator';
import {
ListPendingCoursesResponse,
GetCourseDetailForAdminResponse,
ApproveCourseResponse,
RejectCourseBody,
RejectCourseResponse,
} from '../types/AdminCourseApproval.types';
@Route('api/admin/courses')
@Tags('Admin/CourseApproval')
export class AdminCourseApprovalController {
/**
* ดึงรายการคอร์สที่รอการอนุมัติ
* Get all courses pending for approval
*/
@Get('pending')
@Security('jwt', ['admin'])
@SuccessResponse('200', 'Pending courses retrieved successfully')
@Response('401', 'Unauthorized')
@Response('403', 'Forbidden - Admin only')
public async listPendingCourses(@Request() request: any): Promise<ListPendingCoursesResponse> {
const token = request.headers.authorization?.replace('Bearer ', '');
if (!token) throw new ValidationError('No token provided');
return await AdminCourseApprovalService.listPendingCourses(token);
}
/**
* ดึงรายละเอียดคอร์สสำหรับการตรวจสอบ
* Get course details for admin review
* @param courseId - รหัสคอร์ส / Course ID
*/
@Get('{courseId}')
@Security('jwt', ['admin'])
@SuccessResponse('200', 'Course details retrieved successfully')
@Response('401', 'Unauthorized')
@Response('403', 'Forbidden - Admin only')
@Response('404', 'Course not found')
public async getCourseDetail(@Request() request: any, @Path() courseId: number): Promise<GetCourseDetailForAdminResponse> {
const token = request.headers.authorization?.replace('Bearer ', '');
if (!token) throw new ValidationError('No token provided');
return await AdminCourseApprovalService.getCourseDetail(token, courseId);
}
/**
* อนุมัติคอร์ส
* Approve a course for publication
* @param courseId - รหัสคอร์ส / Course ID
*/
@Post('{courseId}/approve')
@Security('jwt', ['admin'])
@SuccessResponse('200', 'Course approved successfully')
@Response('400', 'Course is not pending for approval')
@Response('401', 'Unauthorized')
@Response('403', 'Forbidden - Admin only')
@Response('404', 'Course not found')
public async approveCourse(
@Request() request: any,
@Path() courseId: number
): Promise<ApproveCourseResponse> {
const token = request.headers.authorization?.replace('Bearer ', '');
if (!token) throw new ValidationError('No token provided');
return await AdminCourseApprovalService.approveCourse(token, courseId, undefined);
}
/**
* ปฏิเสธคอร์ส
* Reject a course (requires comment)
* @param courseId - รหัสคอร์ส / Course ID
*/
@Post('{courseId}/reject')
@Security('jwt', ['admin'])
@SuccessResponse('200', 'Course rejected successfully')
@Response('400', 'Course is not pending for approval or comment is required')
@Response('401', 'Unauthorized')
@Response('403', 'Forbidden - Admin only')
@Response('404', 'Course not found')
public async rejectCourse(
@Request() request: any,
@Path() courseId: number,
@Body() body: RejectCourseBody
): Promise<RejectCourseResponse> {
const token = request.headers.authorization?.replace('Bearer ', '');
if (!token) throw new ValidationError('No token provided');
// Validate body
const { error } = RejectCourseValidator.validate(body);
if (error) throw new ValidationError(error.details[0].message);
return await AdminCourseApprovalService.rejectCourse(token, courseId, body.comment);
}
}