Spaces:
Sleeping
Sleeping
| import { | |
| Controller, | |
| Get, | |
| Post, | |
| Delete, | |
| Param, | |
| Body, | |
| Query, | |
| Req, | |
| UseGuards, | |
| ParseIntPipe, | |
| } from '@nestjs/common'; | |
| import { ApiTags, ApiBearerAuth, ApiOperation, ApiResponse } from '@nestjs/swagger'; | |
| import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; | |
| import { RolesGuard } from '../../auth/guards/roles.guard'; | |
| import { Roles } from '../../auth/roles.decorator'; | |
| import { RoleName } from '../../auth/entities/role.entity'; | |
| import { ReportsService } from '../services/reports.service'; | |
| import { GenerateReportDto } from '../dto/generate-report.dto'; | |
| import { ReportQueryDto } from '../dto/report-query.dto'; | |
| ('📑 Reports') | |
| ('JWT-auth') | |
| ('api/reports') | |
| (JwtAuthGuard, RolesGuard) | |
| export class ReportsController { | |
| constructor(private readonly reportsService: ReportsService) {} | |
| // Static routes MUST come before :id param routes | |
| ('templates') | |
| (RoleName.INSTRUCTOR, RoleName.ADMIN, RoleName.IT_ADMIN) | |
| ({ summary: 'List report templates' }) | |
| ({ status: 200, description: 'Report templates retrieved successfully' }) | |
| async getTemplates(() query: ReportQueryDto) { | |
| return this.reportsService.getTemplates(query); | |
| } | |
| ('generate') | |
| (RoleName.INSTRUCTOR, RoleName.ADMIN, RoleName.IT_ADMIN) | |
| ({ summary: 'Generate a report' }) | |
| ({ status: 201, description: 'Report generated successfully' }) | |
| async generate(() dto: GenerateReportDto, () req: any) { | |
| const userId = req.user.userId || req.user.id; | |
| return this.reportsService.generate(dto, userId); | |
| } | |
| ('history') | |
| ({ summary: 'Get report generation history' }) | |
| ({ status: 200, description: 'Report history retrieved successfully' }) | |
| async getHistory(() req: any, () query: ReportQueryDto) { | |
| const userId = req.user.userId || req.user.id; | |
| return this.reportsService.getHistory(userId, query); | |
| } | |
| (':id') | |
| ({ summary: 'Get report details' }) | |
| ({ status: 200, description: 'Report details retrieved successfully' }) | |
| ({ status: 404, description: 'Report not found' }) | |
| async getReport(('id', ParseIntPipe) id: number, () req: any) { | |
| const userId = req.user.userId || req.user.id; | |
| const isAdmin = this.isAdmin(req); | |
| return this.reportsService.getReport(id, userId, isAdmin); | |
| } | |
| (':id/download') | |
| ({ summary: 'Download a report' }) | |
| ({ status: 200, description: 'Report download data retrieved successfully' }) | |
| ({ status: 404, description: 'Report not found' }) | |
| async downloadReport( | |
| ('id', ParseIntPipe) id: number, | |
| ('format') format: string, | |
| () req: any, | |
| ) { | |
| const userId = req.user.userId || req.user.id; | |
| const isAdmin = this.isAdmin(req); | |
| return this.reportsService.downloadReport(id, userId, format, isAdmin); | |
| } | |
| (':id') | |
| ({ summary: 'Delete a report' }) | |
| ({ status: 200, description: 'Report deleted successfully' }) | |
| ({ status: 404, description: 'Report not found' }) | |
| async deleteReport(('id', ParseIntPipe) id: number, () req: any) { | |
| const userId = req.user.userId || req.user.id; | |
| const isAdmin = this.isAdmin(req); | |
| return this.reportsService.deleteReport(id, userId, isAdmin); | |
| } | |
| private isAdmin(req: any): boolean { | |
| return req.user?.roles?.some( | |
| (role) => | |
| role.roleName === RoleName.ADMIN || role.roleName === RoleName.IT_ADMIN, | |
| ); | |
| } | |
| } | |