From 7370e25e89ef7d8defdb59a63eb138e01b71fb83 Mon Sep 17 00:00:00 2001 From: IO420 <320154041@pcpuma.acatlan.unam.mx> Date: Fri, 26 Sep 2025 17:43:19 -0600 Subject: [PATCH 1/2] add carrera --- src/alumno/entities/student.entity.ts | 18 +----------------- src/alumno/student.module.ts | 9 +++++---- src/alumno/student.service.ts | 3 ++- src/app.module.ts | 10 ++++++++-- src/carrera/carrera.controller.ts | 12 ++++++++++++ src/carrera/carrera.module.ts | 12 ++++++++++++ src/carrera/carrera.service.ts | 15 +++++++++++++++ src/carrera/dto/create-carrera.dto.ts | 1 + src/carrera/dto/update-carrera.dto.ts | 4 ++++ src/carrera/entities/carrera.entity.ts | 19 +++++++++++++++++++ 10 files changed, 79 insertions(+), 24 deletions(-) create mode 100644 src/carrera/carrera.controller.ts create mode 100644 src/carrera/carrera.module.ts create mode 100644 src/carrera/carrera.service.ts create mode 100644 src/carrera/dto/create-carrera.dto.ts create mode 100644 src/carrera/dto/update-carrera.dto.ts create mode 100644 src/carrera/entities/carrera.entity.ts diff --git a/src/alumno/entities/student.entity.ts b/src/alumno/entities/student.entity.ts index 7db9cbc..942fe16 100644 --- a/src/alumno/entities/student.entity.ts +++ b/src/alumno/entities/student.entity.ts @@ -1,4 +1,5 @@ import { AlumnoSancion } from 'src/alumno_sancion/entities/alumno_sancion.entity'; +import { Carrera } from 'src/carrera/entities/carrera.entity'; import { DetalleServicio } from 'src/detalle_servicio/entities/detalle_servicio.entity'; import { Recibo } from 'src/recibo/entities/recibo.entity'; import { @@ -10,23 +11,6 @@ import { PrimaryGeneratedColumn, } from 'typeorm'; -@Entity({ name: 'carrera' }) -export class Carrera { - @PrimaryGeneratedColumn({ name: 'id_carrera', type: 'int', unsigned: true }) - id_carrera: number; - - @Column({ - name: 'carrera', - type: 'varchar', - length: 100, - nullable: false, - }) - carrera: string; - - @OneToMany(() => Alumno, (student) => student.carrera) - estudiantes: Alumno[]; -} - @Entity({ name: 'alumno' }) export class Alumno { @PrimaryGeneratedColumn({ name: 'id_cuenta', type: 'int', unsigned: true }) diff --git a/src/alumno/student.module.ts b/src/alumno/student.module.ts index 7caa938..6e5195a 100644 --- a/src/alumno/student.module.ts +++ b/src/alumno/student.module.ts @@ -2,13 +2,14 @@ import { Module } from '@nestjs/common'; import { AlumnoService } from './student.service'; import { AlumnoController } from './student.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { Alumno, Carrera } from './entities/student.entity'; +import { Alumno } from './entities/student.entity'; +import { Carrera } from 'src/carrera/entities/carrera.entity'; @Module({ - imports: [TypeOrmModule.forFeature([Alumno,Carrera])], + imports: [TypeOrmModule.forFeature([Alumno, Carrera])], controllers: [AlumnoController], providers: [AlumnoService], - exports:[AlumnoService] + exports: [AlumnoService], }) export class AlumnoModule {} -//IO \ No newline at end of file +//IO diff --git a/src/alumno/student.service.ts b/src/alumno/student.service.ts index db40687..ab6e2de 100644 --- a/src/alumno/student.service.ts +++ b/src/alumno/student.service.ts @@ -1,8 +1,9 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { CreateStudentDto } from './dto/create-student.dto'; -import { Alumno, Carrera } from './entities/student.entity'; +import { Alumno } from './entities/student.entity'; import { EntityManager, Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; +import { Carrera } from 'src/carrera/entities/carrera.entity'; @Injectable() export class AlumnoService { diff --git a/src/app.module.ts b/src/app.module.ts index a64bbdc..f1f5a31 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -9,7 +9,7 @@ import { Perfil, User } from './user/entities/user.entity'; import { DetalleServicioModule } from './detalle_servicio/detalle_servicio.module'; import { PeriodoModule } from './periodo/periodo.module'; import { ServicioModule } from './servicio/servicio.module'; -import { Alumno, Carrera } from './alumno/entities/student.entity'; +import { Alumno } from './alumno/entities/student.entity'; import { DetalleServicio } from './detalle_servicio/entities/detalle_servicio.entity'; import { Periodo } from './periodo/entities/periodo.entity'; import { Servicio } from './servicio/entities/servicio.entity'; @@ -23,8 +23,13 @@ import { ReciboModule } from './recibo/recibo.module'; import { MesaModule } from './mesa/mesa.module'; import { Mesa } from './mesa/entities/mesa.entity'; import { AlumnoInscritoModule } from './alumno_inscrito/alumno_inscrito.module'; -import { AlumnoInscrito, Plataforma } from './alumno_inscrito/entities/alumno_inscrito.entity'; +import { + AlumnoInscrito, + Plataforma, +} from './alumno_inscrito/entities/alumno_inscrito.entity'; import { EquipoModule } from './equipo/equipo.module'; +import { CarreraModule } from './carrera/carrera.module'; +import { Carrera } from './carrera/entities/carrera.entity'; @Module({ imports: [ @@ -71,6 +76,7 @@ import { EquipoModule } from './equipo/equipo.module'; MesaModule, AlumnoInscritoModule, EquipoModule, + CarreraModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/carrera/carrera.controller.ts b/src/carrera/carrera.controller.ts new file mode 100644 index 0000000..4c3cfd3 --- /dev/null +++ b/src/carrera/carrera.controller.ts @@ -0,0 +1,12 @@ +import { Controller, Get } from '@nestjs/common'; +import { CarreraService } from './carrera.service'; + +@Controller('carrera') +export class CarreraController { + constructor(private readonly carreraService: CarreraService) {} + + @Get() + findAll() { + return this.carreraService.findAll(); + } +} diff --git a/src/carrera/carrera.module.ts b/src/carrera/carrera.module.ts new file mode 100644 index 0000000..9aa7fbf --- /dev/null +++ b/src/carrera/carrera.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { CarreraService } from './carrera.service'; +import { CarreraController } from './carrera.controller'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Carrera } from './entities/carrera.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([Carrera])], + controllers: [CarreraController], + providers: [CarreraService], +}) +export class CarreraModule {} diff --git a/src/carrera/carrera.service.ts b/src/carrera/carrera.service.ts new file mode 100644 index 0000000..7813d16 --- /dev/null +++ b/src/carrera/carrera.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Carrera } from './entities/carrera.entity'; +import { Repository } from 'typeorm'; + +@Injectable() +export class CarreraService { + constructor( + @InjectRepository(Carrera) + private readonly carreraRepository: Repository, + ) {} + findAll() { + return this.carreraRepository.find(); + } +} diff --git a/src/carrera/dto/create-carrera.dto.ts b/src/carrera/dto/create-carrera.dto.ts new file mode 100644 index 0000000..0015231 --- /dev/null +++ b/src/carrera/dto/create-carrera.dto.ts @@ -0,0 +1 @@ +export class CreateCarreraDto {} diff --git a/src/carrera/dto/update-carrera.dto.ts b/src/carrera/dto/update-carrera.dto.ts new file mode 100644 index 0000000..c6d55b1 --- /dev/null +++ b/src/carrera/dto/update-carrera.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreateCarreraDto } from './create-carrera.dto'; + +export class UpdateCarreraDto extends PartialType(CreateCarreraDto) {} diff --git a/src/carrera/entities/carrera.entity.ts b/src/carrera/entities/carrera.entity.ts new file mode 100644 index 0000000..917e1ff --- /dev/null +++ b/src/carrera/entities/carrera.entity.ts @@ -0,0 +1,19 @@ +import { Alumno } from 'src/alumno/entities/student.entity'; +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity({ name: 'carrera' }) +export class Carrera { + @PrimaryGeneratedColumn({ name: 'id_carrera', type: 'int', unsigned: true }) + id_carrera: number; + + @Column({ + name: 'carrera', + type: 'varchar', + length: 100, + nullable: false, + }) + carrera: string; + + @OneToMany(() => Alumno, (student) => student.carrera) + estudiantes: Alumno[]; +} From 7546de4a1bcf263fd06d952704b13e23f243594e Mon Sep 17 00:00:00 2001 From: IO420 Date: Thu, 2 Oct 2025 17:03:25 -0600 Subject: [PATCH 2/2] added new Ep --- src/alumno/dto/create-student.dto.ts | 1 - src/alumno/student.controller.ts | 1 + .../alumno_inscrito.controller.ts | 3 +-- .../alumno_inscrito.service.ts | 1 - src/equipo/equipo.controller.ts | 15 ------------ src/equipo/equipo.module.ts | 3 +++ src/equipo/equipo.service.ts | 23 +++++++------------ src/main.ts | 7 +++--- src/sancion/sancion.controller.ts | 5 ++++ src/sancion/sancion.service.ts | 4 ++++ src/user/jwt.guard.ts | 12 ++++++++-- src/user/jwt.strategy.ts | 15 +++++++++--- src/user/user.controller.ts | 5 ++-- 13 files changed, 49 insertions(+), 46 deletions(-) diff --git a/src/alumno/dto/create-student.dto.ts b/src/alumno/dto/create-student.dto.ts index 9f02d2f..d9afcbe 100644 --- a/src/alumno/dto/create-student.dto.ts +++ b/src/alumno/dto/create-student.dto.ts @@ -1,4 +1,3 @@ - import { IsEmail, IsNotEmpty, IsNumber, IsString } from 'class-validator'; export class CreateStudentDto { diff --git a/src/alumno/student.controller.ts b/src/alumno/student.controller.ts index 97d67ca..e77f6cc 100644 --- a/src/alumno/student.controller.ts +++ b/src/alumno/student.controller.ts @@ -2,6 +2,7 @@ import { Controller, Get, Post, Body, Param } from '@nestjs/common'; import { AlumnoService } from './student.service'; import { CreateStudentDto } from './dto/create-student.dto'; import { Alumno } from './entities/student.entity'; +import { JwtAuthGuard } from 'src/user/jwt.guard'; @Controller('student') export class AlumnoController { diff --git a/src/alumno_inscrito/alumno_inscrito.controller.ts b/src/alumno_inscrito/alumno_inscrito.controller.ts index 34670df..a3d002e 100644 --- a/src/alumno_inscrito/alumno_inscrito.controller.ts +++ b/src/alumno_inscrito/alumno_inscrito.controller.ts @@ -1,7 +1,6 @@ -import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; +import { Controller, Get, Post, Body, Param } from '@nestjs/common'; import { AlumnoInscritoService } from './alumno_inscrito.service'; import { CreateAlumnoInscritoDto } from './dto/create-alumno_inscrito.dto'; -import { UpdateAlumnoInscritoDto } from './dto/update-alumno_inscrito.dto'; import { AlumnoInscrito } from './entities/alumno_inscrito.entity'; @Controller('alumno-inscrito') diff --git a/src/alumno_inscrito/alumno_inscrito.service.ts b/src/alumno_inscrito/alumno_inscrito.service.ts index 00c675f..7e1926a 100644 --- a/src/alumno_inscrito/alumno_inscrito.service.ts +++ b/src/alumno_inscrito/alumno_inscrito.service.ts @@ -1,6 +1,5 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { CreateAlumnoInscritoDto } from './dto/create-alumno_inscrito.dto'; -import { UpdateAlumnoInscritoDto } from './dto/update-alumno_inscrito.dto'; import { AlumnoInscrito } from './entities/alumno_inscrito.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts index 4f81371..ccd3841 100644 --- a/src/equipo/equipo.controller.ts +++ b/src/equipo/equipo.controller.ts @@ -7,11 +7,6 @@ import { UpdateEquipoDto } from './dto/update-equipo.dto'; export class EquipoController { constructor(private readonly equipoService: EquipoService) {} - @Post() - create(@Body() createEquipoDto: CreateEquipoDto) { - return this.equipoService.create(createEquipoDto); - } - @Get() findAll() { return this.equipoService.findAll(); @@ -21,14 +16,4 @@ export class EquipoController { findOne(@Param('id') id: string) { return this.equipoService.findOne(+id); } - - @Patch(':id') - update(@Param('id') id: string, @Body() updateEquipoDto: UpdateEquipoDto) { - return this.equipoService.update(+id, updateEquipoDto); - } - - @Delete(':id') - remove(@Param('id') id: string) { - return this.equipoService.remove(+id); - } } diff --git a/src/equipo/equipo.module.ts b/src/equipo/equipo.module.ts index 8824b99..2b3b33e 100644 --- a/src/equipo/equipo.module.ts +++ b/src/equipo/equipo.module.ts @@ -1,8 +1,11 @@ import { Module } from '@nestjs/common'; import { EquipoService } from './equipo.service'; import { EquipoController } from './equipo.controller'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Equipo } from './entities/equipo.entity'; @Module({ + imports:[TypeOrmModule.forFeature([Equipo])], controllers: [EquipoController], providers: [EquipoService], }) diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index ce42f11..a697f12 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -1,26 +1,19 @@ import { Injectable } from '@nestjs/common'; import { CreateEquipoDto } from './dto/create-equipo.dto'; -import { UpdateEquipoDto } from './dto/update-equipo.dto'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Equipo } from './entities/equipo.entity'; @Injectable() export class EquipoService { - create(createEquipoDto: CreateEquipoDto) { - return 'This action adds a new equipo'; - } + constructor(@InjectRepository(Equipo) +private readonly equipoRepository: Repository){} findAll() { - return `This action returns all equipo`; + return this.equipoRepository.find(); } - findOne(id: number) { - return `This action returns a #${id} equipo`; - } - - update(id: number, updateEquipoDto: UpdateEquipoDto) { - return `This action updates a #${id} equipo`; - } - - remove(id: number) { - return `This action removes a #${id} equipo`; + findOne(id_equipo: number) { + return this.equipoRepository.findOne({where:{id_equipo}}); } } diff --git a/src/main.ts b/src/main.ts index be77c31..632ab4e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -10,11 +10,10 @@ async function bootstrap() { app.useGlobalPipes(new ValidationPipe()); app.enableCors( - { - origin: configService.get('Front_URL'), - } + // { + // origin: configService.get('Front_URL'), + // } ); - await app.listen(process.env.PORT ?? 3000); } bootstrap(); diff --git a/src/sancion/sancion.controller.ts b/src/sancion/sancion.controller.ts index c84fa0a..201ad08 100644 --- a/src/sancion/sancion.controller.ts +++ b/src/sancion/sancion.controller.ts @@ -4,6 +4,11 @@ import { SancionService } from './sancion.service'; export class SancionController { constructor(private readonly sancionService: SancionService) {} + @Get() + find() { + return this.sancionService.find(); + } + @Get(':id') findOne(@Param('id') id: number) { return this.sancionService.findOne(+id); diff --git a/src/sancion/sancion.service.ts b/src/sancion/sancion.service.ts index fd14e81..cdf11ba 100644 --- a/src/sancion/sancion.service.ts +++ b/src/sancion/sancion.service.ts @@ -10,6 +10,10 @@ export class SancionService { private readonly sancionRepository: Repository, ) {} + async find(){ + return this.sancionRepository.find() + } + async findOne(id_sancion: number): Promise { const sancion = await this.sancionRepository.findOne({ where: { id_sancion }, diff --git a/src/user/jwt.guard.ts b/src/user/jwt.guard.ts index 2155290..c2162fa 100644 --- a/src/user/jwt.guard.ts +++ b/src/user/jwt.guard.ts @@ -1,5 +1,13 @@ -import { Injectable } from '@nestjs/common'; +// jwt-auth.guard.ts +import { ExecutionContext, Injectable, ForbiddenException } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; @Injectable() -export class JwtAuthGuard extends AuthGuard('jwt') {} +export class JwtAuthGuard extends AuthGuard('jwt') { + handleRequest(err: any, user: any, info: any, context: ExecutionContext) { + if (err || !user) { + throw new ForbiddenException('Acceso denegado: token inválido o ausente'); + } + return user; + } +} diff --git a/src/user/jwt.strategy.ts b/src/user/jwt.strategy.ts index 897524e..12085fd 100644 --- a/src/user/jwt.strategy.ts +++ b/src/user/jwt.strategy.ts @@ -1,19 +1,28 @@ -import { Injectable } from '@nestjs/common'; +// jwt.strategy.ts +import { Injectable, ForbiddenException } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { ExtractJwt, Strategy } from 'passport-jwt'; import { ConfigService } from '@nestjs/config'; +export interface JwtPayload { + id: string; + usuario: string; +} + @Injectable() export class JwtStrategy extends PassportStrategy(Strategy) { constructor(private configService: ConfigService) { super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), ignoreExpiration: false, - secretOrKey: configService.get('JWT_SECRET')!, + secretOrKey: configService.get('JWT_SECRET')!, }); } - async validate(payload: any) { + async validate(payload: JwtPayload) { + if (!payload || !payload.id || !payload.usuario) { + throw new ForbiddenException('Token inválido o corrupto'); + } return { id: payload.id, usuario: payload.usuario }; } } diff --git a/src/user/user.controller.ts b/src/user/user.controller.ts index 7a97eec..e518ba3 100644 --- a/src/user/user.controller.ts +++ b/src/user/user.controller.ts @@ -11,7 +11,6 @@ import { import type { Response } from 'express'; import { UserService } from './user.service'; import { changePasswordDto, CreateUserDto, Login } from './dto/create-user.dto'; -import { AuthGuard } from '@nestjs/passport'; import { JwtAuthGuard } from './jwt.guard'; @Controller('user') @@ -23,7 +22,7 @@ export class UserController { return this.userService.Login(data, res); } - @UseGuards(AuthGuard('jwt')) + @UseGuards(JwtAuthGuard) @Get('/validate-token') getProfile(@Req() req) { return req.user; @@ -35,7 +34,7 @@ export class UserController { } @UseGuards(JwtAuthGuard) - @Post('/change-password') + @Post('/changePassword') async changePassword(@Body() data: changePasswordDto, @Req() req) { const id_usuario = req.user.id; await this.userService.changePassword(data, id_usuario);