Spaces:
Sleeping
Sleeping
| import { | |
| Controller, | |
| Get, | |
| Put, | |
| Patch, | |
| Param, | |
| Body, | |
| Query, | |
| UseGuards, | |
| Request, | |
| } from '@nestjs/common'; | |
| import { | |
| ApiTags, | |
| ApiOperation, | |
| ApiResponse, | |
| ApiBearerAuth, | |
| ApiParam, | |
| ApiBody, | |
| } from '@nestjs/swagger'; | |
| import { GradesService } from '../services'; | |
| import { UpdateGradeDto, GradeQueryDto, BulkPublishGradesDto } from '../dto'; | |
| import { Roles } from '../../auth/roles.decorator'; | |
| import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; | |
| import { RolesGuard } from '../../auth/guards/roles.guard'; | |
| import { RoleName } from '../../auth/entities/role.entity'; | |
| ('📊 Grades') | |
| ('api/grades') | |
| (JwtAuthGuard, RolesGuard) | |
| ('JWT-auth') | |
| export class GradesController { | |
| constructor(private readonly gradesService: GradesService) {} | |
| () | |
| (RoleName.INSTRUCTOR, RoleName.TA, RoleName.ADMIN) | |
| ({ summary: 'List grades with filters and pagination' }) | |
| ({ status: 200, description: 'Paginated list of grades' }) | |
| async findAll(() query: GradeQueryDto) { | |
| return this.gradesService.findAll(query); | |
| } | |
| ('my') | |
| (RoleName.STUDENT) | |
| ({ summary: "Get authenticated student's own grades" }) | |
| ({ status: 200, description: "Student's grades" }) | |
| async getMyGrades(() req) { | |
| const userId = req.user.userId || req.user.id; | |
| return this.gradesService.findMyGrades(userId); | |
| } | |
| ('transcript/:studentId') | |
| (RoleName.STUDENT, RoleName.TA, RoleName.ADMIN) | |
| ({ summary: 'Get student transcript' }) | |
| ({ name: 'studentId', description: 'Student user ID', type: Number, example: 57 }) | |
| ({ status: 200, description: 'Student transcript' }) | |
| async getTranscript(('studentId') studentId: number) { | |
| return this.gradesService.getTranscript(studentId); | |
| } | |
| ('gpa/:studentId') | |
| (RoleName.STUDENT, RoleName.TA, RoleName.ADMIN) | |
| ({ summary: 'Calculate GPA for a student' }) | |
| ({ name: 'studentId', description: 'Student user ID', type: Number, example: 57 }) | |
| ({ status: 200, description: 'GPA calculation result' }) | |
| async calculateGPA(('studentId') studentId: number) { | |
| return this.gradesService.calculateGPA(studentId); | |
| } | |
| ('distribution/:courseId') | |
| (RoleName.INSTRUCTOR, RoleName.TA, RoleName.ADMIN) | |
| ({ summary: 'Get grade distribution for a course' }) | |
| ({ name: 'courseId', description: 'Course ID', type: Number, example: 1 }) | |
| ({ status: 200, description: 'Grade distribution by letter grade' }) | |
| async getDistribution(('courseId') courseId: number) { | |
| return this.gradesService.getDistribution(courseId); | |
| } | |
| (':id') | |
| (RoleName.INSTRUCTOR, RoleName.TA) | |
| ({ summary: 'Update a grade' }) | |
| ({ name: 'id', description: 'Grade ID', type: Number, example: 1 }) | |
| ({ status: 200, description: 'Grade updated' }) | |
| async updateGrade( | |
| ('id') id: number, | |
| () dto: UpdateGradeDto, | |
| () req, | |
| ) { | |
| const graderId = req.user.userId || req.user.id; | |
| return this.gradesService.updateGrade(id, dto, graderId); | |
| } | |
| ('bulk/finalize') | |
| (RoleName.INSTRUCTOR, RoleName.TA) | |
| ({ summary: 'Bulk publish/finalize grades' }) | |
| ({ type: BulkPublishGradesDto }) | |
| ({ status: 200, description: 'Grades published in bulk' }) | |
| async finalizeGrades(() dto: BulkPublishGradesDto) { | |
| return this.gradesService.publishGrades(dto); | |
| } | |
| (':id/finalize') | |
| (RoleName.INSTRUCTOR, RoleName.TA) | |
| ({ summary: 'Publish/finalize a grade' }) | |
| ({ name: 'id', description: 'Grade ID', type: Number, example: 1 }) | |
| ({ status: 200, description: 'Grade published' }) | |
| async finalizeGrade(('id') id: number) { | |
| return this.gradesService.publishGrade(id); | |
| } | |
| } | |