Compare commits
7 Commits
development
...
Funciona
| Author | SHA1 | Date | |
|---|---|---|---|
| bfd9d7da0d | |||
| 8e5d2c000d | |||
| d86565c2af | |||
| 56f3eec287 | |||
| cc7473ebd2 | |||
| 8eace2204b | |||
| 9ab9d05122 |
@@ -1,4 +1,5 @@
|
|||||||
import { Module } from '@nestjs/common';
|
import { Module } from '@nestjs/common';
|
||||||
|
import { JwtModule } from '@nestjs/jwt';
|
||||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||||
import { ProfesorService } from './profesor.service';
|
import { ProfesorService } from './profesor.service';
|
||||||
import { ProfesorController } from './profesor.controller';
|
import { ProfesorController } from './profesor.controller';
|
||||||
@@ -11,6 +12,7 @@ import { DatosAcademicos, LineasInvestigacion } from './dto/profesorDto.dto';
|
|||||||
import { ProyectosAcademicosService } from 'src/proyectos_academicos/proyectos_academicos.service';
|
import { ProyectosAcademicosService } from 'src/proyectos_academicos/proyectos_academicos.service';
|
||||||
import { DatosAcademicosService } from 'src/datos_academicos/datos_academicos.service';
|
import { DatosAcademicosService } from 'src/datos_academicos/datos_academicos.service';
|
||||||
import { LineasInvestigacionService } from 'src/lineas_investigacion/lineas_investigacion.service';
|
import { LineasInvestigacionService } from 'src/lineas_investigacion/lineas_investigacion.service';
|
||||||
|
import { ConfigModule } from '@nestjs/config';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [TypeOrmModule.forFeature([Profesor,
|
imports: [TypeOrmModule.forFeature([Profesor,
|
||||||
@@ -20,6 +22,11 @@ import { LineasInvestigacionService } from 'src/lineas_investigacion/lineas_inve
|
|||||||
DatosAcademicosModule,
|
DatosAcademicosModule,
|
||||||
LineasInvestigacionModule,
|
LineasInvestigacionModule,
|
||||||
ProyectosAcademicosModule,
|
ProyectosAcademicosModule,
|
||||||
|
JwtModule.register({
|
||||||
|
secret: process.env.JWT_SECRET,
|
||||||
|
signOptions: { expiresIn: '60m' },
|
||||||
|
}),
|
||||||
|
ConfigModule,
|
||||||
],
|
],
|
||||||
providers: [ProfesorService,
|
providers: [ProfesorService,
|
||||||
ProyectosAcademicosService,
|
ProyectosAcademicosService,
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ export class ProfesorService {
|
|||||||
async profile(id_profesor: number) {
|
async profile(id_profesor: number) {
|
||||||
const profesor = await this.profesorRepository.findOne({
|
const profesor = await this.profesorRepository.findOne({
|
||||||
where: { id_profesor },
|
where: { id_profesor },
|
||||||
relations: ['proyectosAcademicos', 'datosAcademicos', 'lineasInvestigacion'],
|
//relations: ['proyectosAcademicos', 'datosAcademicos', 'lineasInvestigacion'],
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!profesor) {
|
if (!profesor) {
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ import {
|
|||||||
Put,
|
Put,
|
||||||
Request,
|
Request,
|
||||||
UseGuards,
|
UseGuards,
|
||||||
Delete
|
Delete,
|
||||||
|
ParseIntPipe,
|
||||||
|
Query
|
||||||
} from '@nestjs/common';
|
} from '@nestjs/common';
|
||||||
import { AuthGuard } from './auth.guard';
|
import { AuthGuard } from './auth.guard';
|
||||||
import { AuthService } from './auth.service';
|
import { AuthService } from './auth.service';
|
||||||
@@ -64,4 +66,28 @@ export class AuthController {
|
|||||||
return this.authService.validateToken(token);
|
return this.authService.validateToken(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Get()
|
||||||
|
findAll() {
|
||||||
|
return this.authService.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Get(':id_user')
|
||||||
|
async profile(@Param('id_user', ParseIntPipe) id_user: number) {
|
||||||
|
return this.authService.profile(id_user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Get('page')
|
||||||
|
findAllPaginated(
|
||||||
|
@Query('page') page: number = 1,
|
||||||
|
@Query('limit') limit: number = 10,
|
||||||
|
@Query('nombreUsuario') nombreUsuario?: string,
|
||||||
|
@Query('tipoUsuario') tipoUsuario?: string
|
||||||
|
) {
|
||||||
|
page = page < 1 ? 1 : page;
|
||||||
|
limit = limit > 10 || limit < 1 ? 10 : limit;
|
||||||
|
|
||||||
|
return this.authService.findAllPaginated(page, limit, nombreUsuario, tipoUsuario);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -108,4 +108,48 @@ export class AuthService {
|
|||||||
throw new UnauthorizedException('validation token failed');
|
throw new UnauthorizedException('validation token failed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async findAll(): Promise<User[]> {
|
||||||
|
return this.userRepository.find();
|
||||||
|
}
|
||||||
|
|
||||||
|
async profile(id_usuario: number) {
|
||||||
|
const user = await this.userRepository.findOne({
|
||||||
|
where: { id_usuario },
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!user) {
|
||||||
|
throw new HttpException('user not found', 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
async findAllPaginated(
|
||||||
|
page: number,
|
||||||
|
limit: number,
|
||||||
|
nombreUsuario?: string,
|
||||||
|
tipoUsuario?: string
|
||||||
|
): Promise<{ usuarios: User[], total: number, totalPages: number }> {
|
||||||
|
const query = this.userRepository.createQueryBuilder('usuario');
|
||||||
|
|
||||||
|
if (nombreUsuario) {
|
||||||
|
query.andWhere('usuario.nombre LIKE :nombreUsuario', { nombreUsuario: `%${nombreUsuario}%` });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tipoUsuario) {
|
||||||
|
query.andWhere('usuario.id_tipo_usuario = :tipoUsuario', { tipoUsuario });
|
||||||
|
}
|
||||||
|
|
||||||
|
const [usuarios, total] = await query
|
||||||
|
.skip((page - 1) * limit)
|
||||||
|
.take(limit)
|
||||||
|
.orderBy('usuario.nombre', 'ASC')
|
||||||
|
.getManyAndCount();
|
||||||
|
|
||||||
|
const totalPages = Math.ceil(total / limit);
|
||||||
|
|
||||||
|
return { usuarios, total, totalPages };
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
export enum Role {
|
export enum Role {
|
||||||
Admin = '1',
|
Admin = 1,
|
||||||
Responsable = '2',
|
Responsable = 2,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3,19 +3,24 @@ import { Reflector } from '@nestjs/core';
|
|||||||
import { JwtService } from '@nestjs/jwt';
|
import { JwtService } from '@nestjs/jwt';
|
||||||
import { Role } from './role.enum';
|
import { Role } from './role.enum';
|
||||||
import { ROLES_KEY } from './roles.decorator';
|
import { ROLES_KEY } from './roles.decorator';
|
||||||
|
import { ConfigService } from '@nestjs/config';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class RolesGuard implements CanActivate {
|
export class RolesGuard implements CanActivate {
|
||||||
constructor(private reflector: Reflector, private jwtService: JwtService) {}
|
constructor(
|
||||||
|
private reflector: Reflector,
|
||||||
|
private jwtService: JwtService,
|
||||||
|
private configService: ConfigService
|
||||||
|
) {}
|
||||||
|
|
||||||
canActivate(context: ExecutionContext): boolean {
|
async canActivate(context: ExecutionContext): Promise<boolean> {
|
||||||
const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
|
const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
|
||||||
context.getHandler(),
|
context.getHandler(),
|
||||||
context.getClass(),
|
context.getClass(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (!requiredRoles) {
|
if (!requiredRoles) {
|
||||||
return true; // Si no hay roles requeridos, se permite el acceso
|
return true; // Permitir acceso si no se especifican roles requeridos
|
||||||
}
|
}
|
||||||
|
|
||||||
const request = context.switchToHttp().getRequest();
|
const request = context.switchToHttp().getRequest();
|
||||||
@@ -30,18 +35,22 @@ export class RolesGuard implements CanActivate {
|
|||||||
throw new UnauthorizedException('No token provided');
|
throw new UnauthorizedException('No token provided');
|
||||||
}
|
}
|
||||||
|
|
||||||
let userPayload;
|
|
||||||
try {
|
try {
|
||||||
userPayload = this.jwtService.verify(token);
|
const userPayload = await this.jwtService.verifyAsync(
|
||||||
|
token,
|
||||||
|
{
|
||||||
|
secret: this.configService.get<string>('JWT_SECRET'),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const userRole: Role = userPayload.id_tipo_usuario;
|
||||||
|
if (userRole === undefined) {
|
||||||
|
return false; // Si el token no contiene roles, se niega el acceso
|
||||||
|
}
|
||||||
|
|
||||||
|
return requiredRoles.includes(userRole);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new UnauthorizedException('Invalid token');
|
throw new UnauthorizedException('Invalid token');
|
||||||
}
|
}
|
||||||
|
|
||||||
const userRoles: Role[] = userPayload.id_tipo_usuario;
|
|
||||||
if (!userRoles) {
|
|
||||||
return false; // Si el token no contiene roles, se niega el acceso
|
|
||||||
}
|
|
||||||
|
|
||||||
return requiredRoles.some(role => userRoles.includes(role));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user