import { Controller, Post, Put, Get, Body, Query, UploadedFile, UseGuards, UseInterceptors, BadRequestException, Param, ParseIntPipe, } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; import { diskStorage } from 'multer'; import { extname } from 'path'; import * as fs from 'fs'; import { AuthGuard } from '@nestjs/passport'; import { ProgramaService } from './programa.service'; import { IsEmail, isEmail } from 'class-validator'; class Email { @IsEmail() correo: string; } @Controller('programa') export class ProgramaController { constructor(private readonly programaService: ProgramaService) {} // ==================== POST /carga_masiva ==================== @Post('carga_masiva') @UseGuards(AuthGuard('jwt')) @UseInterceptors( FileInterceptor('csv', { storage: diskStorage({ destination: './server/uploads', filename: (req, file, cb) => { const uniqueName = `${Date.now()}${extname(file.originalname)}`; cb(null, uniqueName); }, }), }), ) async cargaMasiva(@UploadedFile() file: Express.Multer.File) { if (!file) { throw new BadRequestException( 'No se envio un archivo csv para la carga masiva.', ); } try { const data = await this.programaService.cargaMasiva(file.filename); return { statusCode: 201, message: 'Carga masiva realizada con éxito', data, }; } catch (err) { // Eliminar archivo si ocurre error if (file && file.filename) { fs.unlinkSync(`./server/uploads/${file.filename}`); } throw new BadRequestException(err.message); } } // ==================== PUT /reasignar_programas ==================== @Put('reasignar_programas/:idUsuario') @UseGuards(AuthGuard('jwt')) async reasignarProgramas( @Body() email: Email, @Param('idUsuario', ParseIntPipe) idUsuario: number, ) { console.log('BODY:', email); console.log('PARAM:', idUsuario); try { const data = await this.programaService.reasignarProgramas( idUsuario, email.correo, ); return { statusCode: 200, message: 'Programas reasignados con éxito', data, }; } catch (err) { throw new BadRequestException(err.message); } } // ==================== GET /programas_admin ==================== @Get('programas_admin/:idUsuario') @UseGuards(AuthGuard('jwt')) async programasAdmin(@Param('idUsuario') query: number) { try { const data = await this.programaService.programasAdmin(query); return { statusCode: 200, data, }; } catch (err) { throw new BadRequestException(err.message); } } // ==================== GET /programas_responsable ==================== @Get('programas_responsable/:idUsuario') @UseGuards(AuthGuard('jwt')) async programasResponsable(@Param(`idUsuario`) idUsuario: number) { try { const data = await this.programaService.programasResponsable(idUsuario); return { statusCode: 200, data, }; } catch (err) { throw new BadRequestException(err.message); } } }