import { Body, Controller, Delete, Get, Param, Post, Query, Req, Res } from '@nestjs/common'; import { Request, Response } from 'express'; import { CurriculumService } from './curriculum.service'; @Controller('curriculum') export class CurriculumController { constructor(private readonly curriculumService: CurriculumService) {} @Get() getActiveCurriculum(@Req() request: Request, @Query('courseId') courseId?: string) { return this.curriculumService.getActiveCurriculum( this.getBearerToken(request), courseId, ); } @Post('custom-modules') createCustomModule( @Req() request: Request, @Body() body: { courseId?: string; week?: number; name?: string; category?: string; dockerImage?: string; packageName?: string; launchFile?: string; }, ) { return this.curriculumService.createCustomModule(this.getBearerToken(request), body); } @Delete('custom-modules/:moduleId') deleteCustomModule( @Req() request: Request, @Param('moduleId') moduleId: string, @Query('courseId') courseId?: string, ) { return this.curriculumService.deleteCustomModule(this.getBearerToken(request), moduleId, courseId); } @Get('courses') listCourses(@Req() request: Request) { return this.curriculumService.listCourses(this.getBearerToken(request)); } @Get('references/:referenceId/download') async downloadReference( @Req() request: Request, @Param('referenceId') referenceId: string, @Res() response: Response, ) { const download = await this.curriculumService.getReferenceDownload( this.getBearerToken(request), referenceId, ); if (download.url) return response.redirect(download.url); response.setHeader('content-type', download.contentType); return response.download(download.path, download.fileName); } private getBearerToken(request: Request): string | undefined { const [type, token] = request.headers.authorization?.split(' ') ?? []; return type === 'Bearer' ? token : undefined; } }