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/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/auth/auth.controller.ts b/src/auth/auth.controller.ts index 1ec9d93..8a3aca8 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -14,8 +14,13 @@ import { import { AuthGuard } from './auth.guard'; import { AuthService } from './auth.service'; import { registerDto } from './dto/registerDto.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,7 +30,9 @@ export class AuthController { return this.authService.signIn(data); } + @UseGuards() @Post("register") + @Roles(Role.Admin) async register(@Body() data: registerDto){ return this.authService.register(data) } @@ -36,14 +43,18 @@ export class AuthController { return req.user; } + @UseGuards(AuthGuard) @Put('Modificacion/:id') + @Roles(Role.Admin) async update(@Param('id') userId: number, @Body() data: registerDto) { return this.authService.update(userId, data); } - @Delete(':id') - async remove(@Param('id') userId: number) { - await this.authService.remove(userId); + @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 7fd4479..beaf186 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 = { id_usuario: user.id_usuario, username: user.usuario, + permissions: user.id_tipo_usuario, }; const token = this.jwtService.sign(payload); 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; 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/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/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/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..15a246f --- /dev/null +++ b/src/permissions/roles.guard.ts @@ -0,0 +1,33 @@ +// 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; // Si no hay roles requeridos, se permite el acceso + } + + const request = context.switchToHttp().getRequest(); + const permissionsHeader = request.headers['permissions']; + + if (!permissionsHeader) { + return false; // Si no hay encabezado 'permissions', se niega el acceso + } + + const userRoles: Role[] = JSON.parse(permissionsHeader); + + return requiredRoles.some(role => userRoles.includes(role)); + } +} 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/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 } }); + } +} 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;