From 4bad88b935db35fc8c3f04edb2147859b4bd516e Mon Sep 17 00:00:00 2001 From: TioSam77 Date: Tue, 18 Jun 2024 16:22:08 -0600 Subject: [PATCH 01/11] S5 --- src/Profesor/entities/profesor.entity.ts | 1 - src/asignatura/entities/asignatura.entity.ts | 15 -------- .../asignatura_carrera_profesor.entity.ts | 34 ------------------- src/carrera/entities/carrera.entity.ts | 15 -------- 4 files changed, 65 deletions(-) delete mode 100644 src/asignatura/entities/asignatura.entity.ts delete mode 100644 src/asignatura_carrera_profesor/entities/asignatura_carrera_profesor.entity.ts delete mode 100644 src/carrera/entities/carrera.entity.ts diff --git a/src/Profesor/entities/profesor.entity.ts b/src/Profesor/entities/profesor.entity.ts index d7004ab..111eeba 100644 --- a/src/Profesor/entities/profesor.entity.ts +++ b/src/Profesor/entities/profesor.entity.ts @@ -12,7 +12,6 @@ import { Categoria } from '../../categoria/entities/categoria.entity'; import { DatosAcademicos } from '../../datos_academicos/entities/datos_academicos.entity'; import { LineasInvestigacion } from '../../lineas_investigacion/entities/lineas_investigacion.entity'; import { ProyectosAcademicos } from '../../proyectos_academicos/entities/proyectos_academicos.entity'; -import { AsignaturaCarreraProfesor } from '../../asignatura_carrera_profesor/entities/asignatura_carrera_profesor.entity'; import { User } from 'src/users/entities/user.entity'; @Entity() diff --git a/src/asignatura/entities/asignatura.entity.ts b/src/asignatura/entities/asignatura.entity.ts deleted file mode 100644 index 752e67e..0000000 --- a/src/asignatura/entities/asignatura.entity.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Entity, PrimaryColumn, Column, OneToMany } from 'typeorm'; -import { AsignaturaCarreraProfesor } from "../../asignatura_carrera_profesor/entities/asignatura_carrera_profesor.entity"; - -@Entity() -export class Asignatura { - - @PrimaryColumn() - id_asignatura: number; - - @Column({ type: 'varchar', length: 50, nullable: false }) - materia: string; - - @OneToMany(() => AsignaturaCarreraProfesor, acp => acp.asignatura) - asignaturaCarreraProfesores: AsignaturaCarreraProfesor[]; -} diff --git a/src/asignatura_carrera_profesor/entities/asignatura_carrera_profesor.entity.ts b/src/asignatura_carrera_profesor/entities/asignatura_carrera_profesor.entity.ts deleted file mode 100644 index ebf4f15..0000000 --- a/src/asignatura_carrera_profesor/entities/asignatura_carrera_profesor.entity.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Entity, PrimaryColumn, Column, ManyToOne, JoinColumn } from 'typeorm'; -import { Profesor } from "../../Profesor/entities/profesor.entity"; -import { Asignatura } from "../../asignatura/entities/asignatura.entity"; -import { Carrera } from 'src/carrera/entities/carrera.entity'; - -@Entity() -export class AsignaturaCarreraProfesor { - @PrimaryColumn({ type: 'int', nullable: false }) - id_profesor: number; - - @PrimaryColumn({ type: 'int', nullable: false }) - id_carrera: number; - - @PrimaryColumn({ type: 'int', nullable: false }) - id_asignatura: number; - - @Column({ type: 'varchar', length: 150, nullable: false }) - semestre: string; - - @Column({ type: 'varchar', length: 150, nullable: false }) - periodo: string; - - @ManyToOne(() => Profesor, profesor => profesor.asignaturaCarreraProfesores) - @JoinColumn({ name: 'id_profesor' }) - profesor: Profesor; - - @ManyToOne(() => Carrera, carrera => carrera.asignaturaCarreraProfesores) - @JoinColumn({ name: 'id_carrera' }) - carrera: Carrera; - - @ManyToOne(() => Asignatura, asignatura => asignatura.asignaturaCarreraProfesores) - @JoinColumn({ name: 'id_asignatura' }) - asignatura: Asignatura; -} diff --git a/src/carrera/entities/carrera.entity.ts b/src/carrera/entities/carrera.entity.ts deleted file mode 100644 index d9dd6d2..0000000 --- a/src/carrera/entities/carrera.entity.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Entity, PrimaryColumn, Column, OneToMany } from 'typeorm'; -import { AsignaturaCarreraProfesor } from "../../asignatura_carrera_profesor/entities/asignatura_carrera_profesor.entity"; - -@Entity() -export class Carrera { - - @PrimaryColumn({ type: 'int', nullable: false }) - id_carrera: number; - - @Column({ type: 'varchar', length: 150, nullable: false }) - nombre: string; - - @OneToMany(() => AsignaturaCarreraProfesor, asi => asi.carrera) - asignaturaCarreraProfesores: AsignaturaCarreraProfesor[]; -} From 8be566a10d0a7ca08ccdd7408b3ac011dfd42586 Mon Sep 17 00:00:00 2001 From: TioSam77 Date: Tue, 18 Jun 2024 16:37:34 -0600 Subject: [PATCH 02/11] S7 --- src/app.module.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index 80c18a0..3d3827f 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -7,9 +7,6 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { UsersModule } from './users/users.module'; import { User } from './users/entities/user.entity'; import { Adscripcion } from './adscripcion/entities/adscripcion.entity'; -import { Asignatura } from './asignatura/entities/asignatura.entity'; -import { AsignaturaCarreraProfesor } from './asignatura_carrera_profesor/entities/asignatura_carrera_profesor.entity'; -import { Carrera } from './carrera/entities/carrera.entity'; import { Categoria } from './categoria/entities/categoria.entity'; import { DatosAcademicos } from './datos_academicos/entities/datos_academicos.entity'; import { Edificio } from './edificio/entities/edificio.entity'; @@ -41,9 +38,6 @@ import { Profesor } from './Profesor/entities/profesor.entity'; User, Profesor, Adscripcion, - Asignatura, - AsignaturaCarreraProfesor, - Carrera, Categoria, DatosAcademicos, Edificio, From dd572632f3e5212ea60e5b57710410a1f94f02a3 Mon Sep 17 00:00:00 2001 From: TioSam77 Date: Tue, 18 Jun 2024 17:23:30 -0600 Subject: [PATCH 03/11] S10 --- src/auth/auth.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index d706461..cb6a9f1 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -25,7 +25,7 @@ export class AuthController { async signIn(@Body() data: registerDto) { return this.authService.signIn(data); } - + //@UseGuards() @Post("register") async register(@Body() data: registerDto){ return this.authService.register(data) From 61ea72111fd1da8dbb5b444719bfc43b2132f6c5 Mon Sep 17 00:00:00 2001 From: TioSam77 Date: Tue, 18 Jun 2024 19:34:55 -0600 Subject: [PATCH 04/11] S12 --- src/auth/auth.controller.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index 615b854..cb6a9f1 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -14,6 +14,7 @@ import { import { AuthGuard } from './auth.guard'; import { AuthService } from './auth.service'; import { registerDto } from './dto/registerDto.dto'; +import { UserDto } from 'src/users/dto/userDto.dto'; @Controller('auth') export class AuthController { @@ -36,14 +37,16 @@ export class AuthController { return req.user; } + @UseGuards(AuthGuard) @Put('Modificacion/:id') - async update(@Param('id') userId: number, @Body() updateUserDto: Record) { - return this.authService.update(userId, updateUserDto); + async update(@Param('id') id: number, @Body() updateUserDto: Record) { + return this.authService.update(id, updateUserDto); } - @Delete(':id') - async remove(@Param('id') userId: number) { - await this.authService.remove(userId); + @UseGuards(AuthGuard) + @Delete('Borrado/:id') + async remove(@Param('id') id: number) { + await this.authService.remove(id); return { message: 'User successfully deleted' }; } From 0978d7e2813c33d6dbcb07e80a6503f0c6ce9ea1 Mon Sep 17 00:00:00 2001 From: TioSam77 Date: Wed, 19 Jun 2024 12:15:28 -0600 Subject: [PATCH 05/11] FRED --- src/Profesor/profesor.controller.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Profesor/profesor.controller.ts b/src/Profesor/profesor.controller.ts index 85aa4fd..6a31c7d 100644 --- a/src/Profesor/profesor.controller.ts +++ b/src/Profesor/profesor.controller.ts @@ -1,6 +1,7 @@ import { Body, Controller, Delete, Get, Param, ParseIntPipe, Post, Put } from '@nestjs/common'; import { ProfesorService } from './profesor.service'; import { profesorDto } from './dto/profesorDto.dto'; +import { ProfesorFilterDto } from './dto/profesorFilterDto.dto'; @Controller('profesor') export class ProfesorController { @@ -32,7 +33,7 @@ export class ProfesorController { } @Post('filter') - async filter(@Body() data: profesorDto) { + async filter(@Body() data: ProfesorFilterDto) { return this.profesorService.filter(data); } } From c7f3b2713fc917aedf9985bb7be62b77be658ec1 Mon Sep 17 00:00:00 2001 From: TioSam77 Date: Wed, 19 Jun 2024 12:51:48 -0600 Subject: [PATCH 06/11] FRED3 --- src/auth/auth.controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index cb6a9f1..4fe9041 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -37,13 +37,13 @@ export class AuthController { return req.user; } - @UseGuards(AuthGuard) + //@UseGuards(AuthGuard) @Put('Modificacion/:id') async update(@Param('id') id: number, @Body() updateUserDto: Record) { return this.authService.update(id, updateUserDto); } - @UseGuards(AuthGuard) + //@UseGuards(AuthGuard) @Delete('Borrado/:id') async remove(@Param('id') id: number) { await this.authService.remove(id); From 8e39e1d2171cf34aa6521fb1efc9b0383a2fb723 Mon Sep 17 00:00:00 2001 From: IO <320154041@pcpuma.acatlan.unam.mx> Date: Fri, 21 Jun 2024 13:00:57 -0600 Subject: [PATCH 07/11] fixed lenght and names --- src/adscripcion/adscripcion.controller.spec.ts | 2 +- src/adscripcion/adscripcion.service.spec.ts | 2 +- src/categoria/categiria.controller.spec.ts | 2 +- src/categoria/categoria.service.spec.ts | 2 +- src/datos_academicos/entities/datos_academicos.entity.ts | 6 +++--- .../entities/lineas_investigacion.entity.ts | 8 ++++---- .../entities/proyectos_academicos.entity.ts | 8 ++++---- src/tipo_usuario/entities/tipo_usuario.entity.ts | 4 ++-- src/users/entities/user.entity.ts | 3 +++ 9 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/adscripcion/adscripcion.controller.spec.ts b/src/adscripcion/adscripcion.controller.spec.ts index 50d3736..0d73f84 100644 --- a/src/adscripcion/adscripcion.controller.spec.ts +++ b/src/adscripcion/adscripcion.controller.spec.ts @@ -1,7 +1,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { AdscripcionController } from './adscripcion.controller'; // Asumiendo que el controlador se llama EdificioController -describe('EdificioController', () => { +describe('AdscripcionController', () => { let controller: AdscripcionController; beforeEach(async () => { diff --git a/src/adscripcion/adscripcion.service.spec.ts b/src/adscripcion/adscripcion.service.spec.ts index 71b2adf..de3224e 100644 --- a/src/adscripcion/adscripcion.service.spec.ts +++ b/src/adscripcion/adscripcion.service.spec.ts @@ -1,7 +1,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { AdscripcionService } from './adscripcion.service'; // Asegúrate de importar el servicio correcto -describe('EdificioService', () => { +describe('AdscripcionService', () => { let service: AdscripcionService; beforeEach(async () => { diff --git a/src/categoria/categiria.controller.spec.ts b/src/categoria/categiria.controller.spec.ts index 33658e3..66286af 100644 --- a/src/categoria/categiria.controller.spec.ts +++ b/src/categoria/categiria.controller.spec.ts @@ -1,7 +1,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { CategoriaController } from './categoria.controller'; // Asumiendo que el controlador se llama EdificioController -describe('EdificioController', () => { +describe('CategoriaController', () => { let controller: CategoriaController; beforeEach(async () => { diff --git a/src/categoria/categoria.service.spec.ts b/src/categoria/categoria.service.spec.ts index 7018274..7c63fe2 100644 --- a/src/categoria/categoria.service.spec.ts +++ b/src/categoria/categoria.service.spec.ts @@ -1,7 +1,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { CategoriaService } from './categoria.service'; // Asegúrate de importar el servicio correcto -describe('EdificioService', () => { +describe('CategoriaService', () => { let service: CategoriaService; beforeEach(async () => { diff --git a/src/datos_academicos/entities/datos_academicos.entity.ts b/src/datos_academicos/entities/datos_academicos.entity.ts index 5226e04..5d5f3bb 100644 --- a/src/datos_academicos/entities/datos_academicos.entity.ts +++ b/src/datos_academicos/entities/datos_academicos.entity.ts @@ -1,9 +1,9 @@ -import { Entity, PrimaryColumn, Column, ManyToOne, JoinColumn } from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm'; import { Profesor } from '../../Profesor/entities/profesor.entity'; @Entity({ name: 'datos_academicos' }) export class DatosAcademicos { - @PrimaryColumn({ type: 'int', nullable: false }) + @PrimaryGeneratedColumn() id_datos: number; @Column({ type: 'int', nullable: false }) @@ -12,7 +12,7 @@ export class DatosAcademicos { @Column({ type: 'varchar', length: 30, nullable: true }) grado_maximo: string; - @Column({ type: 'varchar', length: 260, nullable: true }) + @Column({ type: 'varchar', length: 600, nullable: true }) grados_obtenidos: string; @ManyToOne(() => Profesor, (profesor) => profesor.datosAcademicos) diff --git a/src/lineas_investigacion/entities/lineas_investigacion.entity.ts b/src/lineas_investigacion/entities/lineas_investigacion.entity.ts index 0ccf51b..7e713e7 100644 --- a/src/lineas_investigacion/entities/lineas_investigacion.entity.ts +++ b/src/lineas_investigacion/entities/lineas_investigacion.entity.ts @@ -1,19 +1,19 @@ -import { Entity, PrimaryColumn, Column, ManyToOne, JoinColumn } from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm'; import { Profesor } from "../../Profesor/entities/profesor.entity"; @Entity({ name: 'lineas_investigacion' }) export class LineasInvestigacion { - @PrimaryColumn({ type: 'int', nullable: false }) + @PrimaryGeneratedColumn() id_linea_inv: number; @Column({ type: 'int', nullable: false }) id_profesor: number; - @Column({ type: 'varchar', length: 255, nullable: true }) + @Column({ type: 'varchar', length: 300, nullable: true }) lineas_inv: string; - @Column({ type: 'varchar', length: 255, nullable: true }) + @Column({ type: 'varchar', length: 350, nullable: true }) lineas_inv_html: string; @ManyToOne(() => Profesor, profesor => profesor.lineasInvestigacion) diff --git a/src/proyectos_academicos/entities/proyectos_academicos.entity.ts b/src/proyectos_academicos/entities/proyectos_academicos.entity.ts index f13e524..c69ca57 100644 --- a/src/proyectos_academicos/entities/proyectos_academicos.entity.ts +++ b/src/proyectos_academicos/entities/proyectos_academicos.entity.ts @@ -1,19 +1,19 @@ -import { Entity, PrimaryColumn, Column, ManyToOne, JoinColumn } from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm'; import { Profesor } from "../../Profesor/entities/profesor.entity"; @Entity({ name: 'proyectos_academicos' }) export class ProyectosAcademicos { - @PrimaryColumn({ type: 'int', nullable: false }) + @PrimaryGeneratedColumn() id_proyecto: number; @Column({ type: 'int', nullable: false }) id_profesor: number; - @Column({ type: 'varchar', length: 255, nullable: true }) + @Column({ type: 'varchar', length: 500, nullable: true }) proyecto: string; - @Column({ type: 'varchar', length: 255, nullable: true }) + @Column({ type: 'varchar', length: 700, nullable: true }) proyecto_html: string; @ManyToOne(() => Profesor, profesor => profesor.proyectosAcademicos) diff --git a/src/tipo_usuario/entities/tipo_usuario.entity.ts b/src/tipo_usuario/entities/tipo_usuario.entity.ts index bc18d56..5da6153 100644 --- a/src/tipo_usuario/entities/tipo_usuario.entity.ts +++ b/src/tipo_usuario/entities/tipo_usuario.entity.ts @@ -1,9 +1,9 @@ -import { Entity, PrimaryColumn, Column, OneToMany } from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm'; import { User } from '../../users/entities/user.entity'; @Entity({ name: 'tipo_usuario' }) export class TipoUsuario { - @PrimaryColumn({ type: 'int', nullable: false }) + @PrimaryGeneratedColumn() id_tipo_usuario: number; @Column({ type: 'varchar', length: 30, nullable: false }) diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 40f82b7..58ee8f5 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -11,6 +11,9 @@ export class User { @Column({ type: 'int', nullable: false }) id_tipo_usuario: number; + @Column({type: 'varchar', length: 40, nullable: false }) + nombre: string; + @Column({ type: 'varchar', length: 60, nullable: false }) correo: string; From b789bc4065adb698fbdfc6b3b998307fa14b18c5 Mon Sep 17 00:00:00 2001 From: IO <320154041@pcpuma.acatlan.unam.mx> Date: Fri, 21 Jun 2024 14:51:32 -0600 Subject: [PATCH 08/11] add nombre --- src/auth/dto/registerDto.dto.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/auth/dto/registerDto.dto.ts b/src/auth/dto/registerDto.dto.ts index 597b033..9f7dbb2 100644 --- a/src/auth/dto/registerDto.dto.ts +++ b/src/auth/dto/registerDto.dto.ts @@ -6,6 +6,10 @@ export class registerDto{ @IsNotEmpty() usuario: string; + @IsString() + @IsNotEmpty() + nombre: string; + @IsString() @IsNotEmpty() contraseña: string; From 0d83995ffef3548b02bcad265d8bd1b1f44742c9 Mon Sep 17 00:00:00 2001 From: IO <320154041@pcpuma.acatlan.unam.mx> Date: Mon, 24 Jun 2024 16:12:23 -0600 Subject: [PATCH 09/11] Roles --- src/Profesor/profesor.controller.ts | 9 ++++++++- src/auth/auth.controller.ts | 16 +++++++++++---- src/auth/auth.service.ts | 2 ++ src/permissions/role.enum.ts | 5 +++++ src/permissions/roles.decorator.ts | 5 +++++ src/permissions/roles.guard.ts | 30 +++++++++++++++++++++++++++++ 6 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 src/permissions/role.enum.ts create mode 100644 src/permissions/roles.decorator.ts create mode 100644 src/permissions/roles.guard.ts diff --git a/src/Profesor/profesor.controller.ts b/src/Profesor/profesor.controller.ts index a9c74c8..b15f262 100644 --- a/src/Profesor/profesor.controller.ts +++ b/src/Profesor/profesor.controller.ts @@ -1,12 +1,17 @@ -import { Body, Controller, Delete, Get, Param, ParseIntPipe, Post, Put, Query } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, ParseIntPipe, Post, Put, Query,UseGuards } from '@nestjs/common'; import { ProfesorService } from './profesor.service'; import { profesorDto } from './dto/profesorDto.dto'; +import {Roles} from '../permissions/roles.decorator' +import {RolesGuard} from '../permissions/roles.guard' +import {Role} from '../permissions/role.enum' @Controller('profesor') +@UseGuards(RolesGuard) export class ProfesorController { constructor(private profesorService: ProfesorService) {} @Post() + @Roles(Role.Responsable,Role.Admin) async register(@Body() data: profesorDto) { return this.profesorService.register(data); } @@ -25,11 +30,13 @@ export class ProfesorController { } @Put(':id_profesor') + @Roles(Role.Responsable,Role.Admin) async postModify(@Param('id_profesor', ParseIntPipe) id_profesor: number, @Body() data: profesorDto) { return this.profesorService.modify(id_profesor, data); } @Delete(':id_profesor') + @Roles(Role.Responsable,Role.Admin) async remove(@Param('id_profesor', ParseIntPipe) id_profesor: number) { return this.profesorService.remove(id_profesor); } diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index ba3d900..8a3aca8 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -14,9 +14,13 @@ import { import { AuthGuard } from './auth.guard'; import { AuthService } from './auth.service'; import { registerDto } from './dto/registerDto.dto'; -import { UserDto } from 'src/users/dto/userDto.dto'; +import {Roles} from '../permissions/roles.decorator' +import {RolesGuard} from '../permissions/roles.guard' +import {Role} from '../permissions/role.enum' + @Controller('auth') +@UseGuards(RolesGuard) export class AuthController { constructor(private authService: AuthService) {} @@ -25,8 +29,10 @@ export class AuthController { async signIn(@Body() data: registerDto) { return this.authService.signIn(data); } - //@UseGuards() + + @UseGuards() @Post("register") + @Roles(Role.Admin) async register(@Body() data: registerDto){ return this.authService.register(data) } @@ -37,14 +43,16 @@ export class AuthController { return req.user; } - //@UseGuards(AuthGuard) + @UseGuards(AuthGuard) @Put('Modificacion/:id') + @Roles(Role.Admin) async update(@Param('id') userId: number, @Body() data: registerDto) { return this.authService.update(userId, data); } - //@UseGuards(AuthGuard) + @UseGuards(AuthGuard) @Delete('Borrado/:id') + @Roles(Role.Admin) async remove(@Param('id') id: number) { await this.authService.remove(id); return { message: 'User successfully deleted' }; diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 5b88f77..6f38131 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -49,9 +49,11 @@ export class AuthService { if (!checkPassword) { throw new UnauthorizedException('Invalid password'); } + const payload = { idUser: user.id_usuario, username: user.usuario, + permissions: user.id_tipo_usuario, }; const token = this.jwtService.sign(payload); diff --git a/src/permissions/role.enum.ts b/src/permissions/role.enum.ts new file mode 100644 index 0000000..a6ac7e4 --- /dev/null +++ b/src/permissions/role.enum.ts @@ -0,0 +1,5 @@ +export enum Role { + Admin = '1', + Responsable = '2', + } + \ No newline at end of file diff --git a/src/permissions/roles.decorator.ts b/src/permissions/roles.decorator.ts new file mode 100644 index 0000000..b687140 --- /dev/null +++ b/src/permissions/roles.decorator.ts @@ -0,0 +1,5 @@ +import { SetMetadata } from '@nestjs/common'; +import { Role } from './role.enum'; + +export const ROLES_KEY = 'roles'; +export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles); diff --git a/src/permissions/roles.guard.ts b/src/permissions/roles.guard.ts new file mode 100644 index 0000000..a1fb47c --- /dev/null +++ b/src/permissions/roles.guard.ts @@ -0,0 +1,30 @@ +// roles.guard.ts + +import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { Role } from './role.enum'; +import { ROLES_KEY } from './roles.decorator'; // Asegúrate de importar el decorador correcto + +@Injectable() +export class RolesGuard implements CanActivate { + constructor(private reflector: Reflector) {} + + canActivate(context: ExecutionContext): boolean { + const requiredRoles = this.reflector.getAllAndOverride(ROLES_KEY, [ + context.getHandler(), + context.getClass(), + ]); + + if (!requiredRoles) { + return true; + } + + const { user } = context.switchToHttp().getRequest(); + + if (!user || !user.roles || user.roles.length === 0) { + return false; + } + + return requiredRoles.some(role => user.roles.includes(role)); + } +} From 4c6b3ab0bf5fe94194124bf89f81557f120ab3b8 Mon Sep 17 00:00:00 2001 From: IO <320154041@pcpuma.acatlan.unam.mx> Date: Tue, 25 Jun 2024 13:44:17 -0600 Subject: [PATCH 10/11] fixed borrado --- src/Profesor/profesor.controller.ts | 8 ++++---- src/Profesor/profesor.module.ts | 9 ++++++++- src/Profesor/profesor.service.ts | 15 +++++++++++++-- .../datos_academicos.controller.ts | 8 ++++++++ src/datos_academicos/datos_academicos.module.ts | 11 +++++++++++ .../datos_academicos.service.ts | 17 +++++++++++++++++ .../lineas_investigacion.controller.ts | 9 +++++++++ .../lineas_investigacion.module.ts | 11 +++++++++++ .../lineas_investigacion.service.ts | 17 +++++++++++++++++ .../proyectos_academicos.controller.ts | 9 +++++++++ .../proyectos_academicos.module.ts | 11 +++++++++++ .../proyectos_academicos.service.ts | 17 +++++++++++++++++ 12 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 src/datos_academicos/datos_academicos.controller.ts create mode 100644 src/datos_academicos/datos_academicos.module.ts create mode 100644 src/datos_academicos/datos_academicos.service.ts create mode 100644 src/lineas_investigacion/lineas_investigacion.controller.ts create mode 100644 src/lineas_investigacion/lineas_investigacion.module.ts create mode 100644 src/lineas_investigacion/lineas_investigacion.service.ts create mode 100644 src/proyectos_academicos/proyectos_academicos.controller.ts create mode 100644 src/proyectos_academicos/proyectos_academicos.module.ts create mode 100644 src/proyectos_academicos/proyectos_academicos.service.ts diff --git a/src/Profesor/profesor.controller.ts b/src/Profesor/profesor.controller.ts index b15f262..9f98dbd 100644 --- a/src/Profesor/profesor.controller.ts +++ b/src/Profesor/profesor.controller.ts @@ -6,12 +6,12 @@ import {RolesGuard} from '../permissions/roles.guard' import {Role} from '../permissions/role.enum' @Controller('profesor') -@UseGuards(RolesGuard) +//@UseGuards(RolesGuard) export class ProfesorController { constructor(private profesorService: ProfesorService) {} @Post() - @Roles(Role.Responsable,Role.Admin) + //@Roles(Role.Responsable,Role.Admin) async register(@Body() data: profesorDto) { return this.profesorService.register(data); } @@ -30,13 +30,13 @@ export class ProfesorController { } @Put(':id_profesor') - @Roles(Role.Responsable,Role.Admin) + //@Roles(Role.Responsable,Role.Admin) async postModify(@Param('id_profesor', ParseIntPipe) id_profesor: number, @Body() data: profesorDto) { return this.profesorService.modify(id_profesor, data); } @Delete(':id_profesor') - @Roles(Role.Responsable,Role.Admin) + //@Roles(Role.Responsable,Role.Admin) async remove(@Param('id_profesor', ParseIntPipe) id_profesor: number) { return this.profesorService.remove(id_profesor); } diff --git a/src/Profesor/profesor.module.ts b/src/Profesor/profesor.module.ts index 789f5b1..3da5f14 100644 --- a/src/Profesor/profesor.module.ts +++ b/src/Profesor/profesor.module.ts @@ -3,9 +3,16 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { ProfesorService } from './profesor.service'; import { ProfesorController } from './profesor.controller'; import { Profesor } from './entities/profesor.entity'; +import { DatosAcademicosModule } from '../datos_academicos/datos_academicos.module'; +import { LineasInvestigacionModule } from '../lineas_investigacion/lineas_investigacion.module'; +import { ProyectosAcademicosModule } from '../proyectos_academicos/proyectos_academicos.module'; @Module({ - imports: [TypeOrmModule.forFeature([Profesor])], + imports: [TypeOrmModule.forFeature([Profesor]), + DatosAcademicosModule, + LineasInvestigacionModule, + ProyectosAcademicosModule, +], providers: [ProfesorService], controllers: [ProfesorController], }) diff --git a/src/Profesor/profesor.service.ts b/src/Profesor/profesor.service.ts index 56c8d28..a620eec 100644 --- a/src/Profesor/profesor.service.ts +++ b/src/Profesor/profesor.service.ts @@ -1,5 +1,8 @@ import { HttpException, Injectable } from '@nestjs/common'; import { Profesor } from './entities/profesor.entity'; +import { DatosAcademicosService } from '../datos_academicos/datos_academicos.service'; +import { LineasInvestigacionService } from '../lineas_investigacion/lineas_investigacion.service'; +import { ProyectosAcademicosService } from '../proyectos_academicos/proyectos_academicos.service'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { profesorDto } from './dto/profesorDto.dto'; @@ -7,7 +10,10 @@ import { profesorDto } from './dto/profesorDto.dto'; @Injectable() export class ProfesorService { constructor( - @InjectRepository(Profesor) private profesorRepository: Repository + @InjectRepository(Profesor) private profesorRepository: Repository, + private datosAcademicosService: DatosAcademicosService, + private lineasInvestigacionService: LineasInvestigacionService, + private proyectosAcademicosService: ProyectosAcademicosService, ) {} //register teacher @@ -50,11 +56,16 @@ export class ProfesorService { //remove teacher async remove(id_profesor: number) { - const profesor = await this.profesorRepository.findOne({ where: { id_profesor } }); + const profesor = await this.profesorRepository.findOne({ where: { id_profesor }, relations: ['datosAcademicos'] }); if (!profesor) { throw new HttpException('Profesor not found', 404); } + // Delete related records in datos_academicos + await this.datosAcademicosService.removeByProfesorId(id_profesor); + await this.lineasInvestigacionService.removeByProfesorId(id_profesor); + await this.proyectosAcademicosService.removeByProfesorId(id_profesor); + await this.profesorRepository.remove(profesor); return { message: 'Profesor removed successfully' }; } diff --git a/src/datos_academicos/datos_academicos.controller.ts b/src/datos_academicos/datos_academicos.controller.ts new file mode 100644 index 0000000..d567d16 --- /dev/null +++ b/src/datos_academicos/datos_academicos.controller.ts @@ -0,0 +1,8 @@ +import { Controller, Delete, Param } from '@nestjs/common'; +import { DatosAcademicosService } from './datos_academicos.service'; + +@Controller('datos-academicos') +export class DatosAcademicosController { + constructor(private readonly datosAcademicosService: DatosAcademicosService) {} + +} diff --git a/src/datos_academicos/datos_academicos.module.ts b/src/datos_academicos/datos_academicos.module.ts new file mode 100644 index 0000000..5505237 --- /dev/null +++ b/src/datos_academicos/datos_academicos.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { DatosAcademicos } from './entities/datos_academicos.entity'; +import { DatosAcademicosService } from './datos_academicos.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([DatosAcademicos])], + providers: [DatosAcademicosService], + exports: [DatosAcademicosService], +}) +export class DatosAcademicosModule {} diff --git a/src/datos_academicos/datos_academicos.service.ts b/src/datos_academicos/datos_academicos.service.ts new file mode 100644 index 0000000..b78852f --- /dev/null +++ b/src/datos_academicos/datos_academicos.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { DatosAcademicos } from './entities/datos_academicos.entity'; + +@Injectable() +export class DatosAcademicosService { + constructor( + @InjectRepository(DatosAcademicos) + private readonly datosAcademicosRepository: Repository, + ) {} + + // Add methods to manage DatosAcademicos entities as needed + async removeByProfesorId(id_profesor: number): Promise { + await this.datosAcademicosRepository.delete({ profesor: { id_profesor } }); + } +} diff --git a/src/lineas_investigacion/lineas_investigacion.controller.ts b/src/lineas_investigacion/lineas_investigacion.controller.ts new file mode 100644 index 0000000..6321185 --- /dev/null +++ b/src/lineas_investigacion/lineas_investigacion.controller.ts @@ -0,0 +1,9 @@ +import { Controller, Delete, Param } from '@nestjs/common'; +import { LineasInvestigacionService } from './lineas_investigacion.service'; + +@Controller('lineas-investigacion') +export class LineasInvestigacionController { + constructor(private readonly lineasInvestigacionService: LineasInvestigacionService) {} + + +} diff --git a/src/lineas_investigacion/lineas_investigacion.module.ts b/src/lineas_investigacion/lineas_investigacion.module.ts new file mode 100644 index 0000000..8b23357 --- /dev/null +++ b/src/lineas_investigacion/lineas_investigacion.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { LineasInvestigacion } from './entities/lineas_investigacion.entity'; +import { LineasInvestigacionService } from './lineas_investigacion.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([LineasInvestigacion])], + providers: [LineasInvestigacionService], + exports: [LineasInvestigacionService], +}) +export class LineasInvestigacionModule {} diff --git a/src/lineas_investigacion/lineas_investigacion.service.ts b/src/lineas_investigacion/lineas_investigacion.service.ts new file mode 100644 index 0000000..a73dda6 --- /dev/null +++ b/src/lineas_investigacion/lineas_investigacion.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { LineasInvestigacion } from './entities/lineas_investigacion.entity'; + +@Injectable() +export class LineasInvestigacionService { + constructor( + @InjectRepository(LineasInvestigacion) + private readonly lineasInvestigacionRepository: Repository, + ) {} + + // Add methods to manage LineasInvestigacion entities as needed + async removeByProfesorId(id_profesor: number): Promise { + await this.lineasInvestigacionRepository.delete({ profesor: { id_profesor } }); + } +} diff --git a/src/proyectos_academicos/proyectos_academicos.controller.ts b/src/proyectos_academicos/proyectos_academicos.controller.ts new file mode 100644 index 0000000..96cabce --- /dev/null +++ b/src/proyectos_academicos/proyectos_academicos.controller.ts @@ -0,0 +1,9 @@ +import { Controller, Delete, Param } from '@nestjs/common'; +import { ProyectosAcademicosService } from './proyectos_academicos.service'; + +@Controller('proyectos-academicos') +export class ProyectosAcademicosController { + constructor(private readonly proyectosAcademicosService: ProyectosAcademicosService) {} + + +} diff --git a/src/proyectos_academicos/proyectos_academicos.module.ts b/src/proyectos_academicos/proyectos_academicos.module.ts new file mode 100644 index 0000000..5a4f447 --- /dev/null +++ b/src/proyectos_academicos/proyectos_academicos.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { ProyectosAcademicos } from './entities/proyectos_academicos.entity'; +import { ProyectosAcademicosService } from './proyectos_academicos.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([ProyectosAcademicos])], + providers: [ProyectosAcademicosService], + exports: [ProyectosAcademicosService], +}) +export class ProyectosAcademicosModule {} diff --git a/src/proyectos_academicos/proyectos_academicos.service.ts b/src/proyectos_academicos/proyectos_academicos.service.ts new file mode 100644 index 0000000..485d931 --- /dev/null +++ b/src/proyectos_academicos/proyectos_academicos.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { ProyectosAcademicos } from './entities/proyectos_academicos.entity'; + +@Injectable() +export class ProyectosAcademicosService { + constructor( + @InjectRepository(ProyectosAcademicos) + private readonly proyectosAcademicosRepository: Repository, + ) {} + + // Add methods to manage ProyectosAcademicos entities as needed + async removeByProfesorId(id_profesor: number): Promise { + await this.proyectosAcademicosRepository.delete({ profesor: { id_profesor } }); + } +} From f9be9b3bd50e50510b1de421df0917357b59f1c7 Mon Sep 17 00:00:00 2001 From: IO <320154041@pcpuma.acatlan.unam.mx> Date: Tue, 25 Jun 2024 15:54:58 -0600 Subject: [PATCH 11/11] api guard --- src/Profesor/profesor.controller.ts | 8 ++++---- src/permissions/roles.guard.ts | 15 +++++++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/Profesor/profesor.controller.ts b/src/Profesor/profesor.controller.ts index 9f98dbd..b15f262 100644 --- a/src/Profesor/profesor.controller.ts +++ b/src/Profesor/profesor.controller.ts @@ -6,12 +6,12 @@ import {RolesGuard} from '../permissions/roles.guard' import {Role} from '../permissions/role.enum' @Controller('profesor') -//@UseGuards(RolesGuard) +@UseGuards(RolesGuard) export class ProfesorController { constructor(private profesorService: ProfesorService) {} @Post() - //@Roles(Role.Responsable,Role.Admin) + @Roles(Role.Responsable,Role.Admin) async register(@Body() data: profesorDto) { return this.profesorService.register(data); } @@ -30,13 +30,13 @@ export class ProfesorController { } @Put(':id_profesor') - //@Roles(Role.Responsable,Role.Admin) + @Roles(Role.Responsable,Role.Admin) async postModify(@Param('id_profesor', ParseIntPipe) id_profesor: number, @Body() data: profesorDto) { return this.profesorService.modify(id_profesor, data); } @Delete(':id_profesor') - //@Roles(Role.Responsable,Role.Admin) + @Roles(Role.Responsable,Role.Admin) async remove(@Param('id_profesor', ParseIntPipe) id_profesor: number) { return this.profesorService.remove(id_profesor); } diff --git a/src/permissions/roles.guard.ts b/src/permissions/roles.guard.ts index a1fb47c..15a246f 100644 --- a/src/permissions/roles.guard.ts +++ b/src/permissions/roles.guard.ts @@ -16,15 +16,18 @@ export class RolesGuard implements CanActivate { ]); if (!requiredRoles) { - return true; + return true; // Si no hay roles requeridos, se permite el acceso } - const { user } = context.switchToHttp().getRequest(); - - if (!user || !user.roles || user.roles.length === 0) { - return false; + const request = context.switchToHttp().getRequest(); + const permissionsHeader = request.headers['permissions']; + + if (!permissionsHeader) { + return false; // Si no hay encabezado 'permissions', se niega el acceso } - return requiredRoles.some(role => user.roles.includes(role)); + const userRoles: Role[] = JSON.parse(permissionsHeader); + + return requiredRoles.some(role => userRoles.includes(role)); } }