feat: add certificates, groups, support system, and moderation
Backend changes: - Add Certificate generation service with beautiful HTML templates - Add CourseGroup, GroupMember, GroupMessage models for group collaboration - Add Homework and HomeworkSubmission models with AI + teacher grading - Add SupportTicket and TicketMessage models for help desk - Add Moderation API for admin/moderator course approval workflow - All new modules: CertificatesModule, GroupsModule, SupportModule, ModerationModule Frontend changes: - Add certificate download button when course completed - Update course page to load enrollment progress from backend - Integrate lesson completion with backend API Database schema now supports: - Course groups with chat functionality - Homework assignments with dual AI/human grading - Support ticket system with admin responses - Full moderation workflow (PENDING_REVIEW -> PUBLISHED/REJECTED) Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
27
apps/api/src/moderation/moderation.controller.ts
Normal file
27
apps/api/src/moderation/moderation.controller.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import { Controller, Get, Post, Param, Body } from '@nestjs/common';
|
||||
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
|
||||
import { ModerationService } from './moderation.service';
|
||||
import { CurrentUser } from '../auth/decorators/current-user.decorator';
|
||||
import { User } from '@coursecraft/database';
|
||||
|
||||
@ApiTags('moderation')
|
||||
@Controller('moderation')
|
||||
@ApiBearerAuth()
|
||||
export class ModerationController {
|
||||
constructor(private moderationService: ModerationService) {}
|
||||
|
||||
@Get('pending')
|
||||
async getPendingCourses(@CurrentUser() user: User): Promise<any> {
|
||||
return this.moderationService.getPendingCourses(user.id);
|
||||
}
|
||||
|
||||
@Post(':courseId/approve')
|
||||
async approveCourse(@Param('courseId') courseId: string, @Body('note') note: string, @CurrentUser() user: User): Promise<any> {
|
||||
return this.moderationService.approveCourse(user.id, courseId, note);
|
||||
}
|
||||
|
||||
@Post(':courseId/reject')
|
||||
async rejectCourse(@Param('courseId') courseId: string, @Body('reason') reason: string, @CurrentUser() user: User): Promise<any> {
|
||||
return this.moderationService.rejectCourse(user.id, courseId, reason);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user