This commit is contained in:
Andres2908
2022-09-07 10:35:57 -05:00
79 changed files with 1080 additions and 955 deletions
+13 -2
View File
@@ -44,7 +44,6 @@ import { Carrito } from './carrito/entity/carrito.entity';
import { CarritoMotivo } from './carrito-motivo/entity/carrito-motivo.entity';
import { Dia } from './institucion-dia/entity/dia.entity';
import { Equipo } from './equipo/entity/equipo.entity';
// import { EquipoPrestamoView } from './equipo/entity/views/equipo-prestamo.view';
import { EquipoMotivo } from './equipo-motivo/entity/equipo-motivo.entity';
import { EquipoPrograma } from './equipo-programa/entity/equipo-programa.entity';
import { EquipoTipoEntrada } from './equipo-tipo-entrada/entity/equipo-tipo-entrada.entity';
@@ -73,6 +72,13 @@ import { TipoEntrada } from './institucion-tipo-entrada/entity/tipo-entrada.enti
import { TipoUsuario } from './tipo-usuario/entity/tipo-usuario.entity';
import { Usuario } from './usuario/entity/usuario.entity';
import { InformacionEquipoView } from './equipo/entity/views/informacion-equipo.view';
import { InformacionEquipoProgramaView } from './equipo-programa/entity/views/informacion-equipo-programa.view';
import { InformacionEquipoTipoEntradaView } from './equipo-tipo-entrada/entity/views/informacion-equipo-tipo-entrada.view';
import { InformacionOperadorView } from './operador/entity/views/informacion-operador.view';
import { InformacionUsuarioView } from './usuario/entity/views/informacion-usuario.view';
import { ValidarUsuarioModule } from './validar-usuario/validar-usuario.module';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
@@ -105,7 +111,6 @@ import { Usuario } from './usuario/entity/usuario.entity';
CarritoMotivo,
Dia,
Equipo,
// EquipoPrestamoView,
EquipoMotivo,
EquipoPrograma,
EquipoTipoEntrada,
@@ -133,6 +138,11 @@ import { Usuario } from './usuario/entity/usuario.entity';
TipoEntrada,
TipoUsuario,
Usuario,
InformacionEquipoView,
InformacionEquipoProgramaView,
InformacionEquipoTipoEntradaView,
InformacionOperadorView,
InformacionUsuarioView,
],
};
},
@@ -168,6 +178,7 @@ import { Usuario } from './usuario/entity/usuario.entity';
TipoUsuarioModule,
UploadFileModule,
UsuarioModule,
ValidarUsuarioModule,
],
})
export class AppModule {}
+37 -103
View File
@@ -1,16 +1,13 @@
import {
ConflictException,
BadRequestException,
Injectable,
UnauthorizedException,
} from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { Operador } from '../operador/entity/operador.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
import { BcryptService } from '../bcrypt/bcrypt.service';
import { ModuloService } from '../modulo/modulo.service';
import { OperadorService } from '../operador/operador.service';
import { UsuarioService } from '../usuario/usuario.service';
import { JwtPayload } from './dto/jwt-payload';
@Injectable()
export class AuthService {
@@ -23,24 +20,19 @@ export class AuthService {
) {}
loginAdmin(admin: string, password: string) {
return this.operadorService.findAdmin(admin, false).then((operador) => {
this.validarLogin(operador, password);
if (!operador.activo)
throw new ConflictException('Esta cuenta se encuentra desactivada.');
const payload: JwtPayload = {
id_operador: operador.id_operador,
nombre: operador.nombre,
operador: operador.operador,
institucion: operador.institucion
? { id_institucion: operador.institucion.id_institucion }
: null,
tipoUsuario: {
id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario,
},
};
return { operador, token: this.jwtService.sign(payload) };
return this.operadorService.informacionAdmin(admin).then((data) => {
if (
!data.operador ||
!this.bcryptService.comparar(password, data.password)
)
throw new BadRequestException(
'Usuario y/o password incorrectos, ingresa unas credenciales válidas.',
);
if (!data.activo)
throw new UnauthorizedException(
'Esta cuenta se encuentra desactivada.',
);
return { token: this.jwtService.sign(data.operador) };
});
}
@@ -48,95 +40,37 @@ export class AuthService {
const modulo = await this.moduloService.findById(id_modulo);
return this.operadorService
.findByOperador(modulo.institucion, operador, false)
.then((operador) => {
this.validarLogin(operador, password);
.informacionOperador(modulo.institucion, operador)
.then((data) => {
if (
operador.institucion.id_institucion !=
modulo.institucion.id_institucion
!data.operador ||
!this.bcryptService.comparar(password, data.password)
)
throw new ConflictException(
'Este módulo no pertenece a tu institución, selecciona una que si.',
throw new BadRequestException(
'Usuario y/o password incorrectos, ingresa unas credenciales válidas.',
);
const payload: JwtPayload = {
id_operador: operador.id_operador,
id_modulo: modulo.id_modulo,
nombre: operador.nombre,
operador: operador.operador,
institucion: operador.institucion
? { id_institucion: operador.institucion.id_institucion }
: null,
tipoUsuario: {
id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario,
},
};
return { token: this.jwtService.sign(payload) };
if (!data.activo)
throw new UnauthorizedException(
'Esta cuenta se encuentra desactivada.',
);
return { token: this.jwtService.sign(data.operador) };
});
}
loginUsuario(usuario: string, password: string) {
return this.usuarioService
.findByUsuario(usuario, false, false, true)
.then((usuario) => {
this.validarLogin(usuario, password);
const instituciones: {
id_institucion_usuario: number;
institucionCarrera: {
id_institucion_carrera: number;
institucion: { id_institucion: number };
carrera: { id_carrera: number };
};
}[] = [];
for (let i = 0; i < usuario.instituciones.length; i++)
if (
usuario.instituciones[i].activo &&
!usuario.instituciones[i].multa
)
instituciones.push({
id_institucion_usuario:
usuario.instituciones[i].id_institucion_usuario,
institucionCarrera: {
id_institucion_carrera:
usuario.instituciones[i].institucionCarrera
.id_institucion_carrera,
carrera: {
id_carrera:
usuario.instituciones[i].institucionCarrera.carrera
.id_carrera,
},
institucion: {
id_institucion:
usuario.instituciones[i].institucionCarrera.institucion
.id_institucion,
},
},
});
const payload: JwtPayload = {
id_usuario: usuario.id_usuario,
nombre: usuario.nombre,
usuario: usuario.usuario,
instituciones: instituciones,
tipoUsuario: {
id_tipo_usuario: usuario.tipoUsuario.id_tipo_usuario,
},
};
return { token: this.jwtService.sign(payload), usuario };
.informacionUsuarioByUsuario(usuario)
.then((data) => {
if (!data.password)
throw new BadRequestException('Este usuario no ha sido registrado.');
if (
!data.usuario ||
!this.bcryptService.comparar(password, data.password)
)
throw new BadRequestException(
'Usuario y/o password incorrectos, ingresa unas credenciales válidas.',
);
return { token: this.jwtService.sign(data.usuario) };
});
}
validarLogin(usuarioOperador: Usuario | Operador, password: string) {
if (
!usuarioOperador ||
!this.bcryptService.comparar(password, usuarioOperador.password)
)
throw new UnauthorizedException(
'Usuario y/o password incorrectos, ingresa unas credenciales válidas.',
);
}
}
+11
View File
@@ -0,0 +1,11 @@
export class JwtPayload {
nombre: string;
id_operador: number;
institucion: { id_institucion: number };
operador: string;
tipoUsuario: { id_tipo_usuario: number };
}
+13
View File
@@ -0,0 +1,13 @@
export class JwtPayload {
nombre: string;
id_modulo: number;
id_operador: number;
institucion: { id_institucion: number };
operador: string;
tipoUsuario: { id_tipo_usuario: number };
}
+18
View File
@@ -0,0 +1,18 @@
export class JwtPayload {
nombre: string;
id_usuario: number;
instituciones: {
id_institucion_usuario: number;
institucionCarrera: {
id_institucion_carrera: number;
institucion: { id_institucion: number };
carrera: { id_carrera: number };
};
}[];
tipoUsuario: { id_tipo_usuario: number };
usuario: string;
}
@@ -38,6 +38,7 @@ export class JwtStrategyService extends PassportStrategy(Strategy) {
.then(async (operador) => {
if (!operador.activo)
throw new ForbiddenException('Esta cuenta esta desactivada.');
/*
if (operador.tipoUsuario.id_tipo_usuario === 4) {
if (payload.id_modulo)
await this.moduloService
@@ -48,6 +49,7 @@ export class JwtStrategyService extends PassportStrategy(Strategy) {
'Credenciales no válidas, inicia sesión de nuevo.',
);
}
*/
user.operador = operador;
});
return user;
@@ -1,6 +1,5 @@
import {
Body,
ForbiddenException,
Controller,
Delete,
Get,
@@ -19,17 +18,21 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { CarreraProgramaService } from './carrera-programa.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
import { IdInstitucionDto } from '../dto/id-institucion.dto';
import { CreateCarreraProgramaDto } from './dto/input/create.dto';
import { DeleteCarreraProgramaDto } from './dto/input/delete.dto';
import { CarreraProgramaOutputDto } from './dto/output/carrera-programa.dto';
import { Usuario } from '../usuario/entity/usuario.entity';
@Controller('carrera-programa')
@ApiTags('carrera-programa')
export class CarreraProgramaController {
constructor(private carreraProgramaService: CarreraProgramaService) {}
constructor(
private carreraProgramaService: CarreraProgramaService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@UseGuards(AuthGuard('jwt'))
@@ -47,10 +50,7 @@ export class CarreraProgramaController {
create(@Request() req, @Body() body: CreateCarreraProgramaDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.carreraProgramaService.create(
admin,
body.id_institucion_carrera,
@@ -72,10 +72,7 @@ export class CarreraProgramaController {
delete(@Request() req, @Body() body: DeleteCarreraProgramaDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.carreraProgramaService.delete(admin, body.id_carrera_programa);
}
@@ -96,14 +93,9 @@ export class CarreraProgramaController {
const usuarioOperador: Operador | Usuario =
req.user.operador || req.user.usuario;
if (
!usuarioOperador ||
(usuarioOperador.tipoUsuario.id_tipo_usuario != 3 &&
usuarioOperador.tipoUsuario.id_tipo_usuario < 5)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
if ('id_usuario' in usuarioOperador)
this.validarUsuarioService.validarUsuario(usuarioOperador);
else this.validarUsuarioService.validarAdmin(usuarioOperador);
return this.carreraProgramaService.findByIdInstitucion(
usuarioOperador,
parseInt(query.id_institucion),
@@ -7,6 +7,7 @@ import { CarreraPrograma } from './entity/carrera-programa.entity';
import { InstitucionModule } from '../institucion/institucion.module';
import { InstitucionCarreraModule } from '../institucion-carrera/institucion-carrera.module';
import { InstitucionProgramaModule } from '../institucion-programa/institucion-programa.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
@@ -15,6 +16,7 @@ import { InstitucionProgramaModule } from '../institucion-programa/institucion-p
InstitucionProgramaModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([CarreraPrograma]),
ValidarUsuarioModule,
],
controllers: [CarreraProgramaController],
providers: [CarreraProgramaService],
@@ -1,11 +1,4 @@
import {
Controller,
ForbiddenException,
Get,
Query,
Request,
UseGuards,
} from '@nestjs/common';
import { Controller, Get, Query, Request, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import {
ApiBearerAuth,
@@ -14,7 +7,8 @@ import {
ApiTags,
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { CaritoMotivoService } from './carrito-motivo.service';
import { CarritoMotivoService } from './carrito-motivo.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { GetDto } from './dto/input/get.dto';
import { CarritoMotivoOutputDto } from './dto/output/carrito-motivo.dto';
@@ -22,7 +16,10 @@ import { CarritoMotivoOutputDto } from './dto/output/carrito-motivo.dto';
@Controller('carrito-motivo')
@ApiTags('carrito-motivo')
export class CarritoMotivoController {
constructor(private carritoMotivoService: CaritoMotivoService) {}
constructor(
private carritoMotivoService: CarritoMotivoService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Serealize(CarritoMotivoOutputDto)
@Get()
@@ -45,14 +42,7 @@ export class CarritoMotivoController {
get(@Request() req, @Query() query: GetDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.carritoMotivoService.findAllByIdCarrito(
parseInt(query.id_carrito),
parseInt(query.pagina),
+5 -3
View File
@@ -2,11 +2,12 @@ import { forwardRef, Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { TypeOrmModule } from '@nestjs/typeorm';
import { CarritoMotivoController } from './carrito-motivo.controller';
import { CaritoMotivoService } from './carrito-motivo.service';
import { CarritoMotivoService } from './carrito-motivo.service';
import { CarritoMotivo } from './entity/carrito-motivo.entity';
import { CarritoModule } from '../carrito/carrito.module';
import { OperadorModule } from '../operador/operador.module';
import { StatusModule } from '../status/status.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
@@ -15,9 +16,10 @@ import { StatusModule } from '../status/status.module';
StatusModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([CarritoMotivo]),
ValidarUsuarioModule,
],
controllers: [CarritoMotivoController],
providers: [CaritoMotivoService],
exports: [CaritoMotivoService],
providers: [CarritoMotivoService],
exports: [CarritoMotivoService],
})
export class CarritoMotivoModule {}
+1 -1
View File
@@ -9,7 +9,7 @@ import { CarritoService } from '../carrito/carrito.service';
import { OperadorService } from '../operador/operador.service';
@Injectable()
export class CaritoMotivoService {
export class CarritoMotivoService {
constructor(
@InjectRepository(CarritoMotivo)
private repository: Repository<CarritoMotivo>,
+9 -29
View File
@@ -20,6 +20,7 @@ import {
import { Operador } from '../operador/entity/operador.entity';
import { Serealize } from '../interceptors/serialize.interceptor';
import { CarritoService } from './carrito.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { CarritoDto } from './dto/input/carrito.dto';
import { CarritosDto } from './dto/input/carritos.dto';
import { CreateCarritoDto } from './dto/input/create.dto';
@@ -30,7 +31,10 @@ import { CarritosOutputDto } from './dto/output/carritos.dto';
@Controller('carrito')
@ApiTags('carrito')
export class CarritoController {
constructor(private carritoService: CarritoService) {}
constructor(
private carritoService: CarritoService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Serealize(CarritoOutputDto)
@Get('carrito')
@@ -47,14 +51,7 @@ export class CarritoController {
carrito(@Request() req, @Query() query: CarritoDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.carritoService
.findById(parseInt(query.id_carrito))
.then((carrito) => {
@@ -128,14 +125,7 @@ export class CarritoController {
carritos(@Request() req, @Query() query: CarritosDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.carritoService.findAll(operador, query);
}
@@ -156,10 +146,7 @@ export class CarritoController {
create(@Request() req, @Body() body: CreateCarritoDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.carritoService.create(
admin,
body.id_modulo,
@@ -191,14 +178,7 @@ export class CarritoController {
const data = { ...body };
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
delete data.motivo;
return this.carritoService.update(operador, data, body.motivo);
}
+2
View File
@@ -10,6 +10,7 @@ import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/instit
import { MarcaModule } from '../marca/marca.module';
import { ModeloModule } from '../modelo/modelo.module';
import { ModuloModule } from '../modulo/modulo.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
@@ -21,6 +22,7 @@ import { ModuloModule } from '../modulo/modulo.module';
ModuloModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([Carrito]),
ValidarUsuarioModule,
],
controllers: [CarritoController],
providers: [CarritoService],
+3 -3
View File
@@ -12,7 +12,7 @@ import { Carrito } from './entity/carrito.entity';
import { Modulo } from '../modulo/entity/modulo.entity';
import { Operador } from '../operador/entity/operador.entity';
import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity';
import { CaritoMotivoService } from '../carrito-motivo/carrito-motivo.service';
import { CarritoMotivoService } from '../carrito-motivo/carrito-motivo.service';
import { InstitucionService } from '../institucion/institucion.service';
import { InstitucionTipoCarritoService } from '../institucion-tipo-carrito/institucion-tipo-carrito.service';
import { MarcaService } from '../marca/marca.service';
@@ -23,8 +23,8 @@ import { ModuloService } from '../modulo/modulo.service';
export class CarritoService {
constructor(
@InjectRepository(Carrito) private repository: Repository<Carrito>,
@Inject(forwardRef(() => CaritoMotivoService))
private caritoMotivoService: CaritoMotivoService,
@Inject(forwardRef(() => CarritoMotivoService))
private caritoMotivoService: CarritoMotivoService,
private institucionService: InstitucionService,
private institucionTipoCarritoService: InstitucionTipoCarritoService,
private marcaService: MarcaService,
+7 -17
View File
@@ -1,11 +1,4 @@
import {
Controller,
ForbiddenException,
Get,
Query,
Request,
UseGuards,
} from '@nestjs/common';
import { Controller, Get, Query, Request, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import {
ApiBearerAuth,
@@ -15,6 +8,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { EquipoMotivoService } from './equipo-motivo.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { IdEquipoPaginaDto } from '../dto/id-equipo-pagina.dto';
import { EquipoMotivoOutputDto } from './dto/output/equipo-motivo.dto';
@@ -22,7 +16,10 @@ import { EquipoMotivoOutputDto } from './dto/output/equipo-motivo.dto';
@Controller('equipo-motivo')
@ApiTags('equipo-motivo')
export class EquipoMotivoController {
constructor(private equipoMotivoService: EquipoMotivoService) {}
constructor(
private equipoMotivoService: EquipoMotivoService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Serealize(EquipoMotivoOutputDto)
@Get()
@@ -45,14 +42,7 @@ export class EquipoMotivoController {
get(@Request() req, @Query() query: IdEquipoPaginaDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.equipoMotivoService.findAllByIdEquipo(
parseInt(query.id_equipo),
parseInt(query.pagina),
@@ -7,6 +7,7 @@ import { EquipoMotivo } from './entity/equipo-motivo.entity';
import { EquipoModule } from '../equipo/equipo.module';
import { OperadorModule } from '../operador/operador.module';
import { StatusModule } from '../status/status.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
@@ -15,6 +16,7 @@ import { StatusModule } from '../status/status.module';
StatusModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([EquipoMotivo]),
ValidarUsuarioModule,
],
controllers: [EquipoMotivoController],
providers: [EquipoMotivoService],
@@ -0,0 +1,22 @@
import { DataSource, ViewEntity, ViewColumn } from 'typeorm';
import { EquipoPrograma } from '../equipo-programa.entity';
@ViewEntity({
expression: (dataSource: DataSource) =>
dataSource
.createQueryBuilder()
.select('ep.id_equipo_programa', 'id_equipo_programa')
.addSelect('ep.id_equipo', 'id_equipo')
.addSelect('ep.id_programa', 'id_programa')
.from(EquipoPrograma, 'ep'),
})
export class InformacionEquipoProgramaView {
@ViewColumn()
id_equipo_programa: number;
@ViewColumn()
id_equipo: number;
@ViewColumn()
id_programa: number;
}
@@ -2,7 +2,6 @@ import {
Body,
Controller,
Delete,
ForbiddenException,
Post,
Request,
UseGuards,
@@ -11,13 +10,17 @@ import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger';
import { Operador } from '../operador/entity/operador.entity';
import { EquipoProgramaService } from './equipo-programa.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { CreateEquipoProgramaDto } from './dto/input/create.dto';
import { DeleteEquipoProgramaDto } from './dto/input/delete.dto';
@Controller('equipo-programa')
@ApiTags('equipo-programa')
export class EquipoProgramaController {
constructor(private equipoProgramaService: EquipoProgramaService) {}
constructor(
private equipoProgramaService: EquipoProgramaService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@UseGuards(AuthGuard('jwt'))
@@ -33,14 +36,7 @@ export class EquipoProgramaController {
create(@Request() req, @Body() body: CreateEquipoProgramaDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.equipoProgramaService.create(body.id_equipo, body.id_programa);
}
@@ -58,14 +54,7 @@ export class EquipoProgramaController {
delete(@Request() req, @Body() body: DeleteEquipoProgramaDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.equipoProgramaService.delete(operador, body.id_equipo_programa);
}
}
@@ -4,15 +4,18 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { EquipoProgramaController } from './equipo-programa.controller';
import { EquipoProgramaService } from './equipo-programa.service';
import { EquipoPrograma } from '../equipo-programa/entity/equipo-programa.entity';
import { InformacionEquipoProgramaView } from './entity/views/informacion-equipo-programa.view';
import { EquipoModule } from '../equipo/equipo.module';
import { InstitucionProgramaModule } from '../institucion-programa/institucion-programa.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
forwardRef(() => EquipoModule),
InstitucionProgramaModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([EquipoPrograma]),
TypeOrmModule.forFeature([EquipoPrograma, InformacionEquipoProgramaView]),
ValidarUsuarioModule,
],
controllers: [EquipoProgramaController],
providers: [EquipoProgramaService],
+40 -8
View File
@@ -10,6 +10,7 @@ import { Repository } from 'typeorm';
import { Equipo } from '../equipo/entity/equipo.entity';
import { EquipoPrograma } from './entity/equipo-programa.entity';
import { Programa } from '../institucion-programa/entity/programa.entity';
import { InformacionEquipoProgramaView } from './entity/views/informacion-equipo-programa.view';
import { EquipoService } from '../equipo/equipo.service';
import { InstitucionProgramaService } from '../institucion-programa/institucion-programa.service';
import { Operador } from '../operador/entity/operador.entity';
@@ -19,6 +20,8 @@ export class EquipoProgramaService {
constructor(
@InjectRepository(EquipoPrograma)
private repository: Repository<EquipoPrograma>,
@InjectRepository(InformacionEquipoProgramaView)
private informacionEquipoProgramaView: Repository<InformacionEquipoProgramaView>,
@Inject(forwardRef(() => EquipoService))
private equipoService: EquipoService,
private institucionProgramaService: InstitucionProgramaService,
@@ -29,9 +32,6 @@ export class EquipoProgramaService {
id_equipo: number | Equipo,
id_programa: number | Programa,
) {
const sinPrograma = await this.institucionProgramaService.findProgramaById(
1,
);
const equipo =
typeof id_equipo === 'number'
? await this.equipoService.findById(id_equipo)
@@ -41,13 +41,39 @@ export class EquipoProgramaService {
? await this.institucionProgramaService.findProgramaById(id_programa)
: id_programa;
return this.findEquipoProgramaByEquipoPrograma(equipo, programa)
.then((_) =>
this.findEquipoProgramaByEquipoPrograma(equipo, sinPrograma, false),
)
return this.informacionEquipoPrograma(
equipo.id_equipo,
programa.id_programa,
)
.then((existeEquipoPrograma) => {
if (existeEquipoPrograma)
throw new ConflictException(
'Este software ya fue asignado a este equipo.',
);
return this.informacionEquipoPrograma(equipo.id_equipo, 1);
})
.then(async (existeEquipoSinPrograma) => {
if (existeEquipoSinPrograma)
await this.repository.remove(existeEquipoSinPrograma);
await this.repository.delete({
id_equipo_programa: existeEquipoSinPrograma.id_equipo_programa,
});
return this.repository.save(
this.repository.create({ equipo, programa }),
);
})
.then((equipoPrograma) => ({
message: `Se asignó el software: ${equipoPrograma.programa.programa}, al equipo con número de inventario: ${equipo.numero_inventario}.`,
equipoPrograma,
}));
}
async createCargaMasiva(equipo: Equipo, programa: Programa) {
return this.informacionEquipoPrograma(equipo.id_equipo, 1)
.then(async (existeEquipoSinPrograma) => {
if (existeEquipoSinPrograma)
await this.repository.delete({
id_equipo_programa: existeEquipoSinPrograma.id_equipo_programa,
});
return this.repository.save(
this.repository.create({ equipo, programa }),
);
@@ -120,4 +146,10 @@ export class EquipoProgramaService {
return equipoPrograma;
});
}
informacionEquipoPrograma(id_equipo: number, id_programa: number) {
return this.informacionEquipoProgramaView.findOne({
where: { id_equipo, id_programa },
});
}
}
@@ -0,0 +1,22 @@
import { DataSource, ViewEntity, ViewColumn } from 'typeorm';
import { EquipoTipoEntrada } from '../equipo-tipo-entrada.entity';
@ViewEntity({
expression: (dataSource: DataSource) =>
dataSource
.createQueryBuilder()
.select('ete.id_equipo_tipo_entrada', 'id_equipo_tipo_entrada')
.addSelect('ete.id_equipo', 'id_equipo')
.addSelect('ete.id_tipo_entrada', 'id_tipo_entrada')
.from(EquipoTipoEntrada, 'ete'),
})
export class InformacionEquipoTipoEntradaView {
@ViewColumn()
id_equipo_tipo_entrada: number;
@ViewColumn()
id_equipo: number;
@ViewColumn()
id_tipo_entrada: number;
}
@@ -2,7 +2,6 @@ import {
Body,
Controller,
Delete,
ForbiddenException,
Post,
Request,
UseGuards,
@@ -10,6 +9,7 @@ import {
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger';
import { EquipoTipoEntradaService } from './equipo-tipo-entrada.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { CreateEquipoTipoEntradaDto } from './dto/input/create.dto';
import { DeleteEquipoTipoEntradaDto } from './dto/input/delete.dto';
@@ -17,7 +17,10 @@ import { DeleteEquipoTipoEntradaDto } from './dto/input/delete.dto';
@Controller('equipo-tipo-entrada')
@ApiTags('equipo-tipo-entrada')
export class EquipoTipoEntradaController {
constructor(private equipoTipoEntradaService: EquipoTipoEntradaService) {}
constructor(
private equipoTipoEntradaService: EquipoTipoEntradaService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@UseGuards(AuthGuard('jwt'))
@@ -33,14 +36,7 @@ export class EquipoTipoEntradaController {
create(@Request() req, @Body() body: CreateEquipoTipoEntradaDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.equipoTipoEntradaService.create(
body.id_equipo,
body.id_tipo_entrada,
@@ -61,14 +57,7 @@ export class EquipoTipoEntradaController {
delete(@Request() req, @Body() body: DeleteEquipoTipoEntradaDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.equipoTipoEntradaService.delete(body.id_equipo_tipo_entrada);
}
}
@@ -4,15 +4,21 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { EquipoTipoEntradaController } from './equipo-tipo-entrada.controller';
import { EquipoTipoEntradaService } from './equipo-tipo-entrada.service';
import { EquipoTipoEntrada } from '../equipo-tipo-entrada/entity/equipo-tipo-entrada.entity';
import { InformacionEquipoTipoEntradaView } from './entity/views/informacion-equipo-tipo-entrada.view';
import { EquipoModule } from '../equipo/equipo.module';
import { InstitucionTipoEntradaModule } from '../institucion-tipo-entrada/institucion-tipo-entrada.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
EquipoModule,
InstitucionTipoEntradaModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([EquipoTipoEntrada]),
TypeOrmModule.forFeature([
EquipoTipoEntrada,
InformacionEquipoTipoEntradaView,
]),
ValidarUsuarioModule,
],
controllers: [EquipoTipoEntradaController],
providers: [EquipoTipoEntradaService],
@@ -4,6 +4,7 @@ import { Repository } from 'typeorm';
import { Equipo } from '../equipo/entity/equipo.entity';
import { EquipoTipoEntrada } from './entity/equipo-tipo-entrada.entity';
import { TipoEntrada } from '../institucion-tipo-entrada/entity/tipo-entrada.entity';
import { InformacionEquipoTipoEntradaView } from './entity/views/informacion-equipo-tipo-entrada.view';
import { EquipoService } from '../equipo/equipo.service';
import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/institucion-tipo-entrada.service';
@@ -12,6 +13,8 @@ export class EquipoTipoEntradaService {
constructor(
@InjectRepository(EquipoTipoEntrada)
private repository: Repository<EquipoTipoEntrada>,
@InjectRepository(InformacionEquipoTipoEntradaView)
private informacionEquipoTipoEntradaView: Repository<InformacionEquipoTipoEntradaView>,
private equipoService: EquipoService,
private institucionTipoEntradaService: InstitucionTipoEntradaService,
) {}
@@ -31,10 +34,28 @@ export class EquipoTipoEntradaService {
)
: id_tipo_entrada;
return this.findEquipoTipoEntradaByEquipoTipoEntrada(equipo, tipoEntrada)
.then((_) =>
this.repository.save(this.repository.create({ equipo, tipoEntrada })),
)
return this.informacionEquipoTipoEntrada(
equipo.id_equipo,
tipoEntrada.id_tipo_entrada,
)
.then((existeEquipoTipoEntrada) => {
if (existeEquipoTipoEntrada)
throw new ConflictException(
'Este tipo de entrada ya fue asignado a este equipo.',
);
return this.repository.save(
this.repository.create({ equipo, tipoEntrada }),
);
})
.then((equipoTipoEntrada) => ({
message: `Se asignó el tipo de entrada: ${tipoEntrada.tipo_entrada}, al equipo con número de inventario: ${equipo.numero_inventario}.`,
equipoTipoEntrada,
}));
}
async createCargaMasiva(equipo: Equipo, tipoEntrada: TipoEntrada) {
return this.repository
.save(this.repository.create({ equipo, tipoEntrada }))
.then((equipoTipoEntrada) => ({
message: `Se asignó el tipo de entrada: ${tipoEntrada.tipo_entrada}, al equipo con número de inventario: ${equipo.numero_inventario}.`,
equipoTipoEntrada,
@@ -59,19 +80,9 @@ export class EquipoTipoEntradaService {
});
}
findEquipoTipoEntradaByEquipoTipoEntrada(
equipo: Equipo,
tipoEntrada: TipoEntrada,
validarExistencia = true,
) {
return this.repository
.findOne({ where: { equipo, tipoEntrada } })
.then((equipoTipoEntrada) => {
if (validarExistencia && equipoTipoEntrada)
throw new ConflictException(
'Este tipo de entrada ya fue asignado a este equipo.',
);
return equipoTipoEntrada;
});
informacionEquipoTipoEntrada(id_equipo: number, id_tipo_entrada: number) {
return this.informacionEquipoTipoEntradaView.findOne({
where: { id_equipo, id_tipo_entrada },
});
}
}
@@ -6,54 +6,75 @@ import { Modulo } from '../../../modulo/entity/modulo.entity';
import { EquipoPrograma } from '../../../equipo-programa/entity/equipo-programa.entity';
import { EquipoTipoEntrada } from '../../../equipo-tipo-entrada/entity/equipo-tipo-entrada.entity';
import { Programa } from '../../../institucion-programa/entity/programa.entity';
import { TipoCarrito } from '../../../institucion-tipo-carrito/entity/tipo-carrito.entity';
import { TipoEntrada } from '../../../institucion-tipo-entrada/entity/tipo-entrada.entity';
import { Status } from '../../../status/entity/status.entity';
@ViewEntity({
expression: (dataSource: DataSource) =>
dataSource
.createQueryBuilder()
.from(Equipo, 'e')
.select('e.id_equipo', 'id_equipo')
.addSelect('e.equipo', 'equipo')
.addSelect('e.id_carrito', 'id_carrito')
.addSelect('e.id_status', 'id_status')
.addSelect('e.numero_inventario', 'numero_inventario')
.addSelect('e.prestado', 'prestado')
.addSelect('c.activo', 'activo')
.addSelect('s.id_status', 'id_status')
.addSelect('m.id_modulo', 'id_modulo')
.addSelect('i.id_institucion', 'id_institucion')
.addSelect('c.activo', 'activo_carrito')
.addSelect('c.carrito', 'carrito')
.addSelect('c.id_modulo', 'id_modulo')
.addSelect('c.id_tipo_carrito', 'id_tipo_carrito')
.addSelect('m.activo', 'activo_modulo')
.addSelect('m.id_institucion', 'id_institucion')
.addSelect('i.activo', 'activo_institucion')
// .addSelect('p.id_programa')
// .addSelect('p.id_programa')
// .addSelect('te.id_tipo_entrada')
// .addSelect('tc.id_tipo_carrito')
.from(Equipo, 'e')
.innerJoin(Carrito, 'c', 'c.id_carrito = e.id_carrito')
.innerJoin(EquipoPrograma, 'ps', 'ps.id_equipo = e.id_equipo')
.innerJoin(EquipoTipoEntrada, 'tes', 'tes.id_equipo = e.id_equipo')
.innerJoin(Status, 's', 's.id_status = e.id_status')
// .innerJoin(TipoEntrada, 'te', 'te.id_tipo_entrada = c.id_tipo_entrada')
.innerJoin(Modulo, 'm', 'm.id_modulo = c.id_modulo')
// .innerJoin(Programa, 'p', 'p.id_programa = e.id_programa')
.innerJoin(TipoCarrito, 'tc', 'tc.id_tipo_carrito = c.id_tipo_carrito')
.innerJoin(Institucion, 'i', 'i.id_institucion = m.id_institucion')
.where(
'e.prestado = 1 && s.id_status = 1 && c.activo = 1 && m.activo = 1 && i.activo = 1',
),
.innerJoin(Institucion, 'i', 'i.id_institucion = m.id_institucion'),
// .innerJoin(EquipoPrograma, 'ps', 'ps.id_equipo = e.id_equipo')
// .innerJoin(EquipoTipoEntrada, 'tes', 'tes.id_equipo = e.id_equipo')
// .innerJoin(TipoEntrada, 'te', 'te.id_tipo_entrada = c.id_tipo_entrada')
// .innerJoin(Programa, 'p', 'p.id_programa = e.id_programa')
})
export class EquipoPrestamoView {
export class InformacionEquipoView {
@ViewColumn()
id_equipo: number;
@ViewColumn()
prestado: boolean;
activo_carrito: boolean;
@ViewColumn()
activo: boolean;
activo_institucion: boolean;
@ViewColumn()
id_status: number;
activo_modulo: boolean;
@ViewColumn()
carrito: string;
@ViewColumn()
equipo: string;
@ViewColumn()
id_modulo: number;
@ViewColumn()
id_carrito: number;
@ViewColumn()
id_institucion: number;
@ViewColumn()
id_tipo_carrito: number;
@ViewColumn()
id_status: number;
@ViewColumn()
numero_inventario: string;
@ViewColumn()
prestado: boolean;
}
+8 -25
View File
@@ -18,6 +18,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { EquipoService } from './equipo.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { NumeroInventarioDto } from '../dto/numero-inventario.dto';
import { EquiposDto } from './dto/input/equipos.dto';
@@ -28,7 +29,10 @@ import { EquiposOutputDto } from './dto/output/equipos.dto';
@Controller('equipo')
@ApiTags('equipo')
export class EquipoController {
constructor(private equipoService: EquipoService) {}
constructor(
private equipoService: EquipoService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Serealize(EquipoOutputDto)
@Get('equipo')
@@ -51,14 +55,7 @@ export class EquipoController {
equipo(@Request() req, @Query() query: NumeroInventarioDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.equipoService
.findByNumeroInventario(
parseInt(query.id_institucion),
@@ -159,14 +156,7 @@ export class EquipoController {
equipos(@Request() req, @Query() query: EquiposDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.equipoService.findAll(operador, query);
}
@@ -196,14 +186,7 @@ export class EquipoController {
const operador: Operador = req.user.operador;
const data = { ...body };
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
delete data.id_carrito;
delete data.id_status;
delete data.id_operador;
+4 -2
View File
@@ -4,7 +4,7 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { EquipoController } from './equipo.controller';
import { EquipoService } from './equipo.service';
import { Equipo } from './entity/equipo.entity';
// import { EquipoPrestamoView } from './entity/views/equipo-prestamo.view';
import { InformacionEquipoView } from './entity/views/informacion-equipo.view';
import { CarritoModule } from '../carrito/carrito.module';
import { EquipoProgramaModule } from '../equipo-programa/equipo-programa.module';
import { InstitucionModule } from '../institucion/institucion.module';
@@ -17,6 +17,7 @@ import { ModuloModule } from '../modulo/modulo.module';
import { EquipoMotivoModule } from '../equipo-motivo/equipo-motivo.module';
import { OperadorModule } from '../operador/operador.module';
import { StatusModule } from '../status/status.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
@@ -33,7 +34,8 @@ import { StatusModule } from '../status/status.module';
OperadorModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
StatusModule,
TypeOrmModule.forFeature([Equipo /*, EquipoPrestamoView*/]),
TypeOrmModule.forFeature([Equipo, InformacionEquipoView]),
ValidarUsuarioModule,
],
controllers: [EquipoController],
providers: [EquipoService],
+34 -24
View File
@@ -10,7 +10,6 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Carrito } from '../carrito/entity/carrito.entity';
import { Equipo } from './entity/equipo.entity';
// import { EquipoPrestamoView } from './entity/views/equipo-prestamo.view';
import { Institucion } from '../institucion/entity/institucion.entity';
import { Marca } from '../marca/entity/marca.entity';
import { Modelo } from '../modelo/entity/modelo.entity';
@@ -19,6 +18,7 @@ import { Operador } from '../operador/entity/operador.entity';
import { Programa } from '../institucion-programa/entity/programa.entity';
import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity';
import { TipoEntrada } from '../institucion-tipo-entrada/entity/tipo-entrada.entity';
import { InformacionEquipoView } from './entity/views/informacion-equipo.view';
import { CarritoService } from '../carrito/carrito.service';
import { EquipoProgramaService } from '../equipo-programa/equipo-programa.service';
import { InstitucionService } from '../institucion/institucion.service';
@@ -36,8 +36,8 @@ import { StatusService } from '../status/status.service';
export class EquipoService {
constructor(
@InjectRepository(Equipo) private repository: Repository<Equipo>,
// @InjectRepository(EquipoPrestamoView)
// private equipoPrestamoView: Repository<EquipoPrestamoView>,
@InjectRepository(InformacionEquipoView)
private informacionEquipoView: Repository<InformacionEquipoView>,
private carritoService: CarritoService,
@Inject(forwardRef(() => EquipoProgramaService))
private equipoProgramaService: EquipoProgramaService,
@@ -253,6 +253,25 @@ export class EquipoService {
});
}
async findEquipoByEquipo(
id_carrito: number | Carrito,
equipo: string,
validarNoExiste = true,
) {
const carrito =
typeof id_carrito === 'number'
? await this.carritoService.findById(id_carrito)
: id_carrito;
return this.repository
.findOne({ where: { carrito, equipo } })
.then((equipo) => {
if (validarNoExiste && !equipo)
throw new NotFoundException('No existe este equipo.');
return equipo;
});
}
async findEquipo(
modulo: Modulo,
tipoCarrito: TipoCarrito,
@@ -300,9 +319,7 @@ export class EquipoService {
.where('e.prestado = 0')
.orderBy('c.carrito')
.addOrderBy('e.equipo');
// const a = await this.equipoPrestamoView.find();
// console.log(a);
if (programa) {
query.andWhere('ps.id_programa = :id_programa', {
id_programa: programa.id_programa,
@@ -335,6 +352,18 @@ export class EquipoService {
});
}
informacionEquipoByEquipo(id_carrito: number, equipo: string) {
return this.informacionEquipoView.findOne({
where: { equipo, id_carrito },
});
}
informacionEquipoNumeroInventario(id_institucion: number, equipo: string) {
return this.informacionEquipoView.findOne({
where: { equipo, id_institucion },
});
}
reseteoTotal() {
return this.repository
.createQueryBuilder()
@@ -343,25 +372,6 @@ export class EquipoService {
.execute();
}
async findEquipoByEquipo(
id_carrito: number | Carrito,
equipo: string,
validarNoExiste = true,
) {
const carrito =
typeof id_carrito === 'number'
? await this.carritoService.findById(id_carrito)
: id_carrito;
return this.repository
.findOne({ where: { carrito, equipo } })
.then((equipo) => {
if (validarNoExiste && !equipo)
throw new NotFoundException('No existe este equipo.');
return equipo;
});
}
async update(
// operador: Operador,
attrs: Partial<Equipo>,
@@ -2,7 +2,6 @@ import {
Body,
Controller,
Delete,
ForbiddenException,
Get,
Post,
Query,
@@ -19,6 +18,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { HoraExcepcionService } from './hora-excepcion.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { CreateHoraExcepcionDto } from './dto/input/create.dto';
import { DeleteHoraExcepcionDto } from './dto/input/delete.dto';
@@ -28,7 +28,10 @@ import { HoraExcepcionOutputDto } from './dto/output/hora-excepcion.dto';
@Controller('hora-excepcion')
@ApiTags('hora-excepcion')
export class HoraExcepcionController {
constructor(private horaExcepcionService: HoraExcepcionService) {}
constructor(
private horaExcepcionService: HoraExcepcionService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@UseGuards(AuthGuard('jwt'))
@@ -51,10 +54,7 @@ export class HoraExcepcionController {
create(@Request() req, @Body() body: CreateHoraExcepcionDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.horaExcepcionService.create(
admin,
body.id_institucion_dia,
@@ -76,10 +76,7 @@ export class HoraExcepcionController {
delete(@Request() req, @Body() body: DeleteHoraExcepcionDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.horaExcepcionService.delete(admin, body.id_hora_excepcion);
}
@@ -98,10 +95,7 @@ export class HoraExcepcionController {
get(@Request() req, @Query() query: GetHoraExcepcionDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.horaExcepcionService.findAllByIdInstitucionDia(
parseInt(query.id_institucion_dia),
);
@@ -5,12 +5,14 @@ import { HoraExcepcionController } from './hora-excepcion.controller';
import { HoraExcepcionService } from './hora-excepcion.service';
import { HoraExcepcion } from './entity/hora-excepcion.entity';
import { InstitucionDiaModule } from '../institucion-dia/institucion-dia.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
InstitucionDiaModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([HoraExcepcion]),
ValidarUsuarioModule,
],
controllers: [HoraExcepcionController],
providers: [HoraExcepcionService],
@@ -20,7 +20,7 @@ export class Carrera {
@Column({ type: String, nullable: false, length: 10 })
clave: string;
@ManyToOne(() => Nivel, (nivel) => nivel.carreras, { eager: true })
@ManyToOne(() => Nivel, (nivel) => nivel.carreras)
@JoinColumn({ name: 'id_nivel' })
nivel: Nivel;
@@ -1,7 +1,6 @@
import {
Body,
Controller,
ForbiddenException,
Get,
Put,
Query,
@@ -18,6 +17,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { InstitucionDiaService } from './institucion-dia.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { IdInstitucionDto } from '../dto/id-institucion.dto';
import { UpdateInstitucionDiaDto } from './dto/input/update.dto';
@@ -27,7 +27,10 @@ import { Usuario } from '../usuario/entity/usuario.entity';
@Controller('institucion-dia')
@ApiTags('institucion-dia')
export class InstitucionDiaController {
constructor(private institucionDiaService: InstitucionDiaService) {}
constructor(
private institucionDiaService: InstitucionDiaService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Serealize(InstitucionCarreaOutputDto)
@Get()
@@ -44,10 +47,7 @@ export class InstitucionDiaController {
dias(@Request() req, @Query() query: IdInstitucionDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.institucionDiaService.findAllByIdInstitucion(
parseInt(query.id_institucion),
);
@@ -69,10 +69,7 @@ export class InstitucionDiaController {
hoy(@Request() req, @Query() query: IdInstitucionDto) {
const usuario: Usuario = req.user.usuario;
if (!usuario)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarUsuario(usuario);
return this.institucionDiaService.hoy(parseInt(query.id_institucion));
}
@@ -102,10 +99,7 @@ export class InstitucionDiaController {
update(@Request() req, @Body() body: UpdateInstitucionDiaDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.institucionDiaService.update(admin, body);
}
}
@@ -6,12 +6,14 @@ import { InstitucionDiaService } from './institucion-dia.service';
import { Dia } from './entity/dia.entity';
import { InstitucionDia } from './entity/institucion-dia.entity';
import { InstitucionModule } from '../institucion/institucion.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
InstitucionModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([Dia, InstitucionDia]),
ValidarUsuarioModule,
],
controllers: [InstitucionDiaController],
providers: [InstitucionDiaService],
@@ -1,7 +1,6 @@
import {
Body,
Controller,
ForbiddenException,
Get,
Post,
Put,
@@ -19,6 +18,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { InstitucionInfraccionService } from './institucion-infraccion.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { IdInstitucionDto } from '../dto/id-institucion.dto';
import { CreateInstitucionInfraccionDto } from './dto/input/create.dto';
@@ -31,6 +31,7 @@ import { InstitucionInfraccionOutputDto } from './dto/output/institucion-infracc
export class InstitucionInfraccionController {
constructor(
private institucionInfraccionService: InstitucionInfraccionService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@@ -44,10 +45,7 @@ export class InstitucionInfraccionController {
create(@Request() req, @Body() body: CreateInstitucionInfraccionDto) {
const superAdmin: Operador = req.user.operador;
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.institucionInfraccionService.create(body.infraccion);
}
@@ -59,10 +57,7 @@ export class InstitucionInfraccionController {
get(@Request() req) {
const superAdmin: Operador = req.user.operador;
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.institucionInfraccionService.findAll();
}
@@ -81,14 +76,7 @@ export class InstitucionInfraccionController {
infracciones(@Request() req, @Query() query: IdInstitucionDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.institucionInfraccionService.findAllByIdInstitucion(
parseInt(query.id_institucion),
);
@@ -109,10 +97,7 @@ export class InstitucionInfraccionController {
update(@Request() req, @Body() body: UpdateInstitucionInfraccionDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.institucionInfraccionService.update(admin, body);
}
}
@@ -6,12 +6,14 @@ import { InstitucionInfraccionService } from './institucion-infraccion.service';
import { Infraccion } from './entity/infraccion.entity';
import { InstitucionInfraccion } from './entity/institucion-infraccion.entity';
import { InstitucionModule } from '../institucion/institucion.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
InstitucionModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([Infraccion, InstitucionInfraccion]),
ValidarUsuarioModule,
],
controllers: [InstitucionInfraccionController],
providers: [InstitucionInfraccionService],
@@ -1,6 +1,5 @@
import {
Body,
ForbiddenException,
Controller,
Get,
Post,
@@ -19,6 +18,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { InstitucionProgramaService } from './institucion-programa.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
import { IdInstitucionDto } from '../dto/id-institucion.dto';
@@ -31,7 +31,10 @@ import { ProgramaOutputDto } from './dto/output/programa.dto';
@Controller('institucion-programa')
@ApiTags('institucion-programa')
export class InstitucionProgramaController {
constructor(private institucionProgramaService: InstitucionProgramaService) {}
constructor(
private institucionProgramaService: InstitucionProgramaService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@UseGuards(AuthGuard('jwt'))
@@ -44,10 +47,7 @@ export class InstitucionProgramaController {
create(@Request() req, @Body() body: CreateProgramaDto) {
const superAdmin: Operador = req.user.operador;
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.institucionProgramaService.create(body.programa);
}
@@ -59,15 +59,7 @@ export class InstitucionProgramaController {
get(@Request() req) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarOperador(operador);
return this.institucionProgramaService.findAllProgramas();
}
@@ -86,10 +78,7 @@ export class InstitucionProgramaController {
programas(@Request() req, @Query() query: IdInstitucionDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.institucionProgramaService.findAllByIdInstitucion(
parseInt(query.id_institucion),
);
@@ -111,10 +100,7 @@ export class InstitucionProgramaController {
programasMostrar(@Request() req, @Query() query: IdInstitucionDto) {
const usuario: Usuario = req.user.usuario;
if (!usuario)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarUsuario(usuario);
return this.institucionProgramaService.findAllByIdInstitucion(
parseInt(query.id_institucion),
true,
@@ -137,10 +123,7 @@ export class InstitucionProgramaController {
update(@Request() req, @Body() body: UpdateProgramaDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.institucionProgramaService.update(admin, body);
}
}
@@ -6,12 +6,14 @@ import { InstitucionProgramaService } from './institucion-programa.service';
import { InstitucionPrograma } from './entity/institucion-programa.entity';
import { Programa } from './entity/programa.entity';
import { InstitucionModule } from '../institucion/institucion.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
InstitucionModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([InstitucionPrograma, Programa]),
ValidarUsuarioModule,
],
controllers: [InstitucionProgramaController],
providers: [InstitucionProgramaService],
@@ -1,7 +1,6 @@
import {
Body,
Controller,
ForbiddenException,
Get,
Post,
Put,
@@ -19,6 +18,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { InstitucionTipoCarritoService } from './institucion-tipo-carrito.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
import { IdInstitucionDto } from '../dto/id-institucion.dto';
@@ -33,6 +33,7 @@ import { TipoCarritoOutputDto } from './dto/output/tipo-carrito.dto';
export class InstitucionTipoCarritoController {
constructor(
private institucionTipoCarritoService: InstitucionTipoCarritoService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@@ -46,10 +47,7 @@ export class InstitucionTipoCarritoController {
create(@Request() req, @Body() body: CreateInstitucionTipoCarritoDto) {
const superAdmin: Operador = req.user.operador;
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.institucionTipoCarritoService.create(
body.letra,
body.tipo_carrito,
@@ -66,15 +64,7 @@ export class InstitucionTipoCarritoController {
get(@Request() req) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarOperador(operador);
return this.institucionTipoCarritoService.findAll();
}
@@ -94,10 +84,7 @@ export class InstitucionTipoCarritoController {
tiposCarrito(@Request() req, @Query() query: IdInstitucionDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.institucionTipoCarritoService.findAllByIdInstitucion(
parseInt(query.id_institucion),
);
@@ -119,10 +106,7 @@ export class InstitucionTipoCarritoController {
tiposCarritoMostrar(@Request() req, @Query() query: IdInstitucionDto) {
const usuario: Usuario = req.user.usuario;
if (!usuario)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarUsuario(usuario);
return this.institucionTipoCarritoService.findAllByIdInstitucion(
parseInt(query.id_institucion),
true,
@@ -145,10 +129,7 @@ export class InstitucionTipoCarritoController {
update(@Request() req, @Body() body: UpdateInstitucionTipoCarritoDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.institucionTipoCarritoService.update(admin, body);
}
}
@@ -6,12 +6,14 @@ import { InstitucionTipoCarritoService } from './institucion-tipo-carrito.servic
import { InstitucionTipoCarrito } from './entity/institucion-tipo-carrito.entity';
import { TipoCarrito } from './entity/tipo-carrito.entity';
import { InstitucionModule } from '../institucion/institucion.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
InstitucionModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([InstitucionTipoCarrito, TipoCarrito]),
ValidarUsuarioModule,
],
controllers: [InstitucionTipoCarritoController],
providers: [InstitucionTipoCarritoService],
@@ -1,7 +1,6 @@
import {
Body,
Controller,
ForbiddenException,
Get,
Post,
Put,
@@ -19,6 +18,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { InstitucionTipoEntradaService } from './institucion-tipo-entrada.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
import { IdInstitucionDto } from '../dto/id-institucion.dto';
@@ -31,7 +31,10 @@ import { TipoEntradaOutputDto } from './dto/output/tipo-entrada.dto';
@Controller('institucion-tipo-entrada')
@ApiTags('institucion-tipo-entrada')
export class InstitucionTipoEntradaController {
constructor(private tipoEntradaService: InstitucionTipoEntradaService) {}
constructor(
private tipoEntradaService: InstitucionTipoEntradaService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@UseGuards(AuthGuard('jwt'))
@@ -44,10 +47,7 @@ export class InstitucionTipoEntradaController {
create(@Request() req, @Body() body: CreateInstitucionTipoEntradaDto) {
const superAdmin: Operador = req.user.operador;
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.tipoEntradaService.create(body.tipo_entrada);
}
@@ -61,15 +61,7 @@ export class InstitucionTipoEntradaController {
get(@Request() req) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarOperador(operador);
return this.tipoEntradaService.findAll();
}
@@ -89,10 +81,7 @@ export class InstitucionTipoEntradaController {
tiposEntrada(@Request() req, @Query() query: IdInstitucionDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.tipoEntradaService.findAllByIdInstitucion(
parseInt(query.id_institucion),
);
@@ -114,10 +103,7 @@ export class InstitucionTipoEntradaController {
tipoEntradaMostrar(@Request() req, @Query() query: IdInstitucionDto) {
const usuario: Usuario = req.user.usuario;
if (!usuario)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarUsuario(usuario);
return this.tipoEntradaService.findAllByIdInstitucion(
parseInt(query.id_institucion),
true,
@@ -140,10 +126,7 @@ export class InstitucionTipoEntradaController {
update(@Request() req, @Body() body: UpdateInstitucionTipoEntradaDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.tipoEntradaService.update(admin, body);
}
}
@@ -6,12 +6,14 @@ import { InstitucionTipoEntradaService } from './institucion-tipo-entrada.servic
import { InstitucionModule } from '../institucion/institucion.module';
import { InstitucionTipoEntrada } from './entity/institucion-tipo-entrada.entity';
import { TipoEntrada } from './entity/tipo-entrada.entity';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
InstitucionModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([InstitucionTipoEntrada, TipoEntrada]),
ValidarUsuarioModule,
],
controllers: [InstitucionTipoEntradaController],
providers: [InstitucionTipoEntradaService],
@@ -6,9 +6,5 @@ export class UpdateInstitucionUsuarioInputDto {
@IsBoolean()
@IsOptional()
activo?: boolean;
@IsBoolean()
@IsOptional()
multa?: boolean;
activo: boolean;
}
@@ -1,21 +1,18 @@
import {
Body,
Controller,
ForbiddenException,
Put,
Request,
UseGuards,
} from '@nestjs/common';
import { Body, Controller, Put, Request, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger';
import { InstitucionUsuarioService } from './institucion-usuario.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { UpdateInstitucionUsuarioInputDto } from './dto/input/update.dto';
@Controller('institucion-usuario')
@ApiTags('institucion-usuario')
export class InstitucionUsuarioController {
constructor(private institucionUsuarioService: InstitucionUsuarioService) {}
constructor(
private institucionUsuarioService: InstitucionUsuarioService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Put()
@UseGuards(AuthGuard('jwt'))
@@ -24,13 +21,12 @@ export class InstitucionUsuarioController {
})
@ApiBearerAuth('jwt')
@ApiBody({
description: 'Todas las variables a excepción de id_ son opcionales.',
description: 'Todas las variables son obligatorias.',
examples: {
ejemplo: {
value: {
correo: '',
id_usuario: 1,
telefono: '',
activo: true,
id_institucion_usuario: 1,
},
},
},
@@ -38,14 +34,7 @@ export class InstitucionUsuarioController {
update(@Request() req, @Body() body: UpdateInstitucionUsuarioInputDto) {
const admin: Operador = req.user.operador;
if (
!admin ||
(admin.tipoUsuario.id_tipo_usuario != 3 &&
admin.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(admin);
return this.institucionUsuarioService.update(body);
}
}
@@ -4,11 +4,13 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { InstitucionUsuarioService } from './institucion-usuario.service';
import { InstitucionUsuario } from './entity/institucion-usuario.entity';
import { InstitucionUsuarioController } from './institucion-usuario.controller';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([InstitucionUsuario]),
ValidarUsuarioModule,
],
providers: [InstitucionUsuarioService],
exports: [InstitucionUsuarioService],
@@ -49,11 +49,13 @@ export class InstitucionUsuarioService {
}
update(attrs: Partial<InstitucionUsuario>) {
return this.findById(attrs.id_institucion_usuario).then(
(institucionUsuario) => {
return this.findById(attrs.id_institucion_usuario)
.then((institucionUsuario) => {
Object.assign(institucionUsuario, attrs);
return this.repository.save(institucionUsuario);
},
);
})
.then((_) => ({
message: 'Se guardaron los cambios correctamente.',
}));
}
}
+9 -25
View File
@@ -18,6 +18,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { InstitucionService } from './institucion.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { IdInstitucionDto } from '../dto/id-institucion.dto';
import { UpdateInstitucionDto } from './dto/input/update.dto';
@@ -29,7 +30,10 @@ import { InstitucionesMinOutputDto } from './dto/output/instituciones-min.dto';
@Controller('institucion')
@ApiTags('institucion')
export class InstitucionController {
constructor(private institucionService: InstitucionService) {}
constructor(
private institucionService: InstitucionService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Serealize(InstitucionesMinOutputDto)
@Get('instituciones-activas')
@@ -50,10 +54,7 @@ export class InstitucionController {
get(@Request() req) {
const superAdmin: Operador = req.user.operador;
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.institucionService.findAll();
}
@@ -72,14 +73,7 @@ export class InstitucionController {
institucion(@Request() req, @Query() query: IdInstitucionDto) {
const admin: Operador = req.user.operador;
if (
!admin ||
(admin.tipoUsuario.id_tipo_usuario != 2 &&
admin.tipoUsuario.id_tipo_usuario != 3)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarSuperAdminAdmin(admin);
return this.institucionService
.findById(parseInt(query.id_institucion))
.then((institucion) => {
@@ -104,10 +98,7 @@ export class InstitucionController {
instituciones(@Request() req) {
const superAdmin: Operador = req.user.operador;
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.institucionService.findAll();
}
@@ -140,14 +131,7 @@ export class InstitucionController {
update(@Request() req, @Body() body: UpdateInstitucionDto) {
const admin: Operador = req.user.operador;
if (
!admin ||
(admin.tipoUsuario.id_tipo_usuario != 2 &&
admin.tipoUsuario.id_tipo_usuario != 3)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarSuperAdminAdmin(admin);
return this.institucionService.update(admin, body);
}
}
+2
View File
@@ -4,11 +4,13 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { InstitucionController } from './institucion.controller';
import { InstitucionService } from './institucion.service';
import { Institucion } from './entity/institucion.entity';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([Institucion]),
ValidarUsuarioModule,
],
controllers: [InstitucionController],
providers: [InstitucionService],
+7 -15
View File
@@ -1,7 +1,6 @@
import {
Body,
Controller,
ForbiddenException,
Get,
Post,
Query,
@@ -18,6 +17,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { MarcaService } from './marca.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { CreateMarcaDto } from './dto/input/create.dto';
import { MarcaDto } from './dto/input/marca.dto';
@@ -26,7 +26,10 @@ import { MarcaOutputDto } from './dto/output/marca.dto';
@Controller('marca')
@ApiTags('marca')
export class MarcaController {
constructor(private marcaService: MarcaService) {}
constructor(
private marcaService: MarcaService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@UseGuards(AuthGuard('jwt'))
@@ -39,10 +42,7 @@ export class MarcaController {
create(@Request() req, @Body() body: CreateMarcaDto) {
const superAdmin: Operador = req.user.operador;
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.marcaService.create(body.marca, body.tipo);
}
@@ -59,15 +59,7 @@ export class MarcaController {
get(@Request() req, @Query() query: MarcaDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarOperador(operador);
return this.marcaService.findAll(query.tipo);
}
}
+2
View File
@@ -4,11 +4,13 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { MarcaController } from './marca.controller';
import { MarcaService } from './marca.service';
import { Marca } from './entity/marca.entity';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([Marca]),
ValidarUsuarioModule,
],
controllers: [MarcaController],
providers: [MarcaService],
+7 -10
View File
@@ -18,6 +18,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { ModeloService } from './modelo.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { CreateModeloDto } from './dto/input/create.dto';
import { ModeloDto } from './dto/input/modelo.dto';
@@ -26,7 +27,10 @@ import { ModeloOutputDto } from './dto/output/modelo.dto';
@Controller('modelo')
@ApiTags('modelo')
export class ModeloController {
constructor(private modeloService: ModeloService) {}
constructor(
private modeloService: ModeloService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@UseGuards(AuthGuard('jwt'))
@@ -39,6 +43,7 @@ export class ModeloController {
create(@Request() req, @Body() body: CreateModeloDto) {
const superAdmin: Operador = req.user.operador;
this.validarUsuarioService.validarSuperAdmin(superAdmin);
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
@@ -59,15 +64,7 @@ export class ModeloController {
get(@Request() req, @Query() query: ModeloDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para accedar a esta información.',
);
this.validarUsuarioService.validarOperador(operador);
return this.modeloService.findAll(query.tipo);
}
}
+2
View File
@@ -4,11 +4,13 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { ModeloController } from './modelo.controller';
import { ModeloService } from './modelo.service';
import { Modelo } from './entity/modelo.entity';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([Modelo]),
ValidarUsuarioModule,
],
controllers: [ModeloController],
providers: [ModeloService],
+9 -24
View File
@@ -1,7 +1,6 @@
import {
Body,
Controller,
ForbiddenException,
Get,
Post,
Put,
@@ -19,8 +18,8 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { ModuloService } from './modulo.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
import { IdInstitucionDto } from '../dto/id-institucion.dto';
import { CreateModuloDto } from './dto/input/create.dto';
import { ModuloDto } from './dto/input/modulo.dto';
@@ -31,7 +30,10 @@ import { ModuloMinOutputDto } from './dto/output/modulo-min.dto';
@Controller('modulo')
@ApiTags('modulo')
export class ModuloController {
constructor(private moduloService: ModuloService) {}
constructor(
private moduloService: ModuloService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@UseGuards(AuthGuard('jwt'))
@@ -44,10 +46,7 @@ export class ModuloController {
create(@Request() req, @Body() body: CreateModuloDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.moduloService.create(admin, body.modulo);
}
@@ -66,10 +65,7 @@ export class ModuloController {
modulo(@Request() req, @Query() query: ModuloDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.moduloService.findById(parseInt(query.id_modulo));
}
@@ -88,15 +84,7 @@ export class ModuloController {
modulos(@Request() req, @Query() query: IdInstitucionDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarOperador(operador);
return this.moduloService.findAllByIdInstitucion(
parseInt(query.id_institucion),
);
@@ -134,10 +122,7 @@ export class ModuloController {
update(@Request() req, @Body() body: UpdateModuloDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.moduloService.update(admin, body);
}
}
+2
View File
@@ -5,12 +5,14 @@ import { ModuloController } from './modulo.controller';
import { ModuloService } from './modulo.service';
import { Modulo } from './entity/modulo.entity';
import { InstitucionModule } from '../institucion/institucion.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
InstitucionModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([Modulo]),
ValidarUsuarioModule,
],
controllers: [ModuloController],
providers: [ModuloService],
+11 -44
View File
@@ -1,7 +1,6 @@
import {
Body,
Controller,
ForbiddenException,
Get,
Post,
Put,
@@ -19,6 +18,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { MultaService } from './multa.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
import { IdUsuarioDto } from '../dto/id-usuario.dto';
@@ -35,7 +35,10 @@ import { MultasUsuarioOutputDto } from './dto/output/multas-usuario.dto';
@Controller('multa')
@ApiTags('multa')
export class MultaController {
constructor(private multaService: MultaService) {}
constructor(
private multaService: MultaService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@UseGuards(AuthGuard('jwt'))
@@ -57,14 +60,7 @@ export class MultaController {
multar(@Request() req, @Body() body: MultarDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.multaService.create(
body.id_prestamo,
body.id_operador,
@@ -102,15 +98,7 @@ export class MultaController {
multas(@Request() req, @Query() query: MultasDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.multaService.findAll(query);
}
@@ -134,14 +122,7 @@ export class MultaController {
multasEquipo(@Request() req, @Query() query: IdEquipoPaginaDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.multaService.findAllByIdEquipo(
parseInt(query.id_equipo),
parseInt(query.pagina),
@@ -168,15 +149,7 @@ export class MultaController {
multasUsuario(@Request() req, @Query() query: IdUsuarioPaginaDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.multaService.findAllByIdUsuario(
parseInt(query.id_usuario),
parseInt(query.pagina),
@@ -199,10 +172,7 @@ export class MultaController {
multasActivas(@Request() req, @Query() query: IdUsuarioDto) {
const usuario: Usuario = req.user.usuario;
if (!usuario)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarUsuario(usuario);
return this.multaService.findMultasActivas(parseInt(query.id_usuario));
}
@@ -220,10 +190,7 @@ export class MultaController {
quitarMulta(@Request() req, @Body() body: QuitarMultarDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.multaService.quitarMulta(body.id_institucion_usuario);
}
+2
View File
@@ -11,6 +11,7 @@ import { InstitucionUsuarioModule } from '../institucion-usuario/institucion-usu
import { OperadorModule } from '../operador/operador.module';
import { PrestamoModule } from '../prestamo/prestamo.module';
import { UsuarioModule } from '../usuario/usuario.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
@@ -23,6 +24,7 @@ import { UsuarioModule } from '../usuario/usuario.module';
OperadorModule,
TypeOrmModule.forFeature([Multa]),
UsuarioModule,
ValidarUsuarioModule,
],
controllers: [MultaController],
providers: [MultaService],
+2 -3
View File
@@ -157,10 +157,10 @@ export class MultaService {
.innerJoinAndSelect('m.institucion', 'i')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ca.nivel', 'n')
.orderBy('i.institucion')
.addOrderBy('u.usuario')
.addOrderBy('mu.activo', 'DESC')
.addOrderBy('mu.id_multa', 'DESC')
.addOrderBy('u.usuario')
.skip((parseInt(filtros.pagina) - 1) * 25)
.take(25);
@@ -193,7 +193,6 @@ export class MultaService {
.innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ca.nivel', 'n')
.orderBy('mu.id_multa', 'DESC')
.skip((pagina - 1) * 25)
.take(25)
@@ -0,0 +1,40 @@
import { DataSource, ViewEntity, ViewColumn } from 'typeorm';
import { Institucion } from '../../../institucion/entity/institucion.entity';
import { TipoUsuario } from '../../../tipo-usuario/entity/tipo-usuario.entity';
import { Operador } from '../operador.entity';
@ViewEntity({
expression: (dataSource: DataSource) =>
dataSource
.createQueryBuilder()
.select('o.id_operador', 'id_operador')
.addSelect('o.activo', 'activo')
.addSelect('o.id_institucion', 'id_institucion')
.addSelect('o.id_tipo_usuario', 'id_tipo_usuario')
.addSelect('o.nombre', 'nombre')
.addSelect('o.operador', 'operador')
.addSelect('o.password', 'password')
.from(Operador, 'o'),
})
export class InformacionOperadorView {
@ViewColumn()
id_operador: number;
@ViewColumn()
activo: boolean;
@ViewColumn()
id_institucion: number;
@ViewColumn()
id_tipo_usuario: number;
@ViewColumn()
nombre: string;
@ViewColumn()
operador: string;
@ViewColumn()
password: string;
}
+10 -34
View File
@@ -1,7 +1,6 @@
import {
Body,
Controller,
ForbiddenException,
Get,
Post,
Put,
@@ -19,6 +18,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { OperadorService } from './operador.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from './entity/operador.entity';
import { CreateAdminDto } from './dto/input/create-admin.dto';
import { CreateOperadorDto } from './dto/input/create-operador.dto';
@@ -29,7 +29,10 @@ import { OperadorOutputDto } from './dto/output/operador.dto';
@Controller('operador')
@ApiTags('operador')
export class OperadorController {
constructor(private operadorService: OperadorService) {}
constructor(
private operadorService: OperadorService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post('admin')
@UseGuards(AuthGuard('jwt'))
@@ -51,10 +54,7 @@ export class OperadorController {
createAdmin(@Request() req, @Body() body: CreateAdminDto) {
const superAdmin: Operador = req.user.operador;
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.operadorService.create(
body.id_institucion,
3,
@@ -84,10 +84,7 @@ export class OperadorController {
createOperador(@Request() req, @Body() body: CreateOperadorDto) {
const admin: Operador = req.user.operador;
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdmin(admin);
return this.operadorService.create(
admin.institucion,
4,
@@ -132,14 +129,7 @@ export class OperadorController {
operadores(@Request() req, @Query() query: OperadoresDto) {
const admin: Operador = req.user.operador;
if (
!admin ||
(admin.tipoUsuario.id_tipo_usuario != 2 &&
admin.tipoUsuario.id_tipo_usuario != 3)
)
throw new ForbiddenException(
'No tienes permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarSuperAdminAdmin(admin);
return this.operadorService.findAll(query);
}
@@ -156,14 +146,7 @@ export class OperadorController {
passwordResset(@Request() req, @Body() body: UpdateOperadorDto) {
const admin: Operador = req.user.operador;
if (
!admin ||
(admin.tipoUsuario.id_tipo_usuario != 2 &&
admin.tipoUsuario.id_tipo_usuario != 3)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarSuperAdminAdmin(admin);
return this.operadorService.passwordReset(
admin,
body.id_operador,
@@ -192,14 +175,7 @@ export class OperadorController {
update(@Request() req, @Body() body: UpdateOperadorDto) {
const admin: Operador = req.user.operador;
if (
!admin ||
(admin.tipoUsuario.id_tipo_usuario != 2 &&
admin.tipoUsuario.id_tipo_usuario != 3)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarSuperAdminAdmin(admin);
return this.operadorService.update(admin, body);
}
}
+4 -1
View File
@@ -4,10 +4,12 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { OperadorController } from './operador.controller';
import { OperadorService } from './operador.service';
import { Operador } from './entity/operador.entity';
import { InformacionOperadorView } from './entity/views/informacion-operador.view';
import { BcryptModule } from '../bcrypt/bcrypt.module';
import { InstitucionModule } from '../institucion/institucion.module';
import { NodemailerModule } from '../nodemailer/nodemailer.module';
import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
@@ -16,7 +18,8 @@ import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module';
NodemailerModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TipoUsuarioModule,
TypeOrmModule.forFeature([Operador]),
TypeOrmModule.forFeature([Operador, InformacionOperadorView]),
ValidarUsuarioModule,
],
controllers: [OperadorController],
providers: [OperadorService],
+50
View File
@@ -7,6 +7,7 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Between, Repository } from 'typeorm';
import { Institucion } from '../institucion/entity/institucion.entity';
import { Operador } from './entity/operador.entity';
import { InformacionOperadorView } from './entity/views/informacion-operador.view';
import { BcryptService } from '../bcrypt/bcrypt.service';
import { InstitucionService } from '../institucion/institucion.service';
import { NodemailerService } from '../nodemailer/nodemailer.service';
@@ -16,6 +17,8 @@ import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service';
export class OperadorService {
constructor(
@InjectRepository(Operador) private repository: Repository<Operador>,
@InjectRepository(InformacionOperadorView)
private informacionOperadorView: Repository<InformacionOperadorView>,
private bcryptService: BcryptService,
private institucionService: InstitucionService,
private nodemailerService: NodemailerService,
@@ -170,6 +173,53 @@ export class OperadorService {
});
}
informacionAdmin(admin: string) {
return this.informacionOperadorView
.findOne({
where: {
operador: admin,
id_tipo_usuario: Between(2, 3),
},
})
.then((admin) => {
if (!admin) return { operador: null, activo: null, password: null };
return {
operador: {
id_operador: admin.id_operador,
nombre: admin.nombre,
operador: admin.operador,
institucion: admin.id_institucion
? { id_institucion: admin.id_institucion }
: null,
tipoUsuario: { id_tipo_usuario: admin.id_tipo_usuario },
},
activo: admin.activo,
password: admin.password,
};
});
}
informacionOperador(institucion: Institucion, operador: string) {
return this.informacionOperadorView
.findOne({
where: { operador, id_institucion: institucion.id_institucion },
})
.then((operador) => {
if (!operador) return { operador: null, activo: null, password: null };
return {
operador: {
id_operador: operador.id_operador,
nombre: operador.nombre,
operador: operador.operador,
institucion: { id_institucion: operador.id_institucion },
tipoUsuario: { id_tipo_usuario: operador.id_tipo_usuario },
},
activo: operador.activo,
password: operador.password,
};
});
}
passwordReset(admin: Operador, id_operador: number, password?: string) {
return this.findById(id_operador)
.then((operador) => {
+9
View File
@@ -1,4 +1,5 @@
import {
IsBooleanString,
IsDateString,
IsNotEmpty,
IsNumberString,
@@ -10,6 +11,14 @@ export class HistorialDto {
@IsNumberString()
pagina: string;
@IsBooleanString()
@IsOptional()
cancelado_operador?: string;
@IsBooleanString()
@IsOptional()
cancelado_usuario?: string;
@IsString()
@IsNotEmpty()
@IsOptional()
+23 -97
View File
@@ -1,7 +1,6 @@
import {
Body,
Controller,
ForbiddenException,
Get,
Post,
Put,
@@ -19,6 +18,7 @@ import {
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { PrestamoService } from './prestamo.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { IdEquipoPaginaDto } from '../dto/id-equipo-pagina.dto';
import { IdUsuarioDto } from '../dto/id-usuario.dto';
@@ -45,7 +45,10 @@ import { Usuario } from '../usuario/entity/usuario.entity';
@Controller('prestamo')
@ApiTags('prestamo')
export class PrestamoController {
constructor(private prestamoService: PrestamoService) {}
constructor(
private prestamoService: PrestamoService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Serealize(ActivosOutputDto)
@Get('activos')
@@ -111,14 +114,7 @@ export class PrestamoController {
activos(@Request() req, @Query() query: ActivosDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.prestamoService.findAll(query);
}
@@ -137,14 +133,7 @@ export class PrestamoController {
cancelarOperador(@Request() req, @Body() body: CancelarOperadorDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.prestamoService.cancelarOperador(
body.id_prestamo,
body.id_operador,
@@ -165,10 +154,7 @@ export class PrestamoController {
cancelarUsuario(@Request() req, @Body() body: CancelarUsuarioDto) {
const usuario: Usuario = req.user.usuario;
if (!usuario)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarUsuario(usuario);
return this.prestamoService.cancelarUsuario(body.id_prestamo);
}
@@ -186,14 +172,7 @@ export class PrestamoController {
entregar(@Request() req, @Body() body: EntregarDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.prestamoService.entregar(body.id_prestamo, body.id_operador);
}
@@ -273,14 +252,7 @@ export class PrestamoController {
historial(@Request() req, @Query() query: HistorialDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarOperador(operador);
return this.prestamoService.findAll(query);
}
@@ -305,14 +277,7 @@ export class PrestamoController {
historialEquipo(@Request() req, @Query() query: IdEquipoPaginaDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.prestamoService.findAllByIdEquipo(
parseInt(query.id_equipo),
parseInt(query.pagina),
@@ -340,14 +305,7 @@ export class PrestamoController {
historialUsuario(@Request() req, @Query() query: IdUsuarioPaginaDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.prestamoService.findAllByIdUsuario(
parseInt(query.id_usuario),
parseInt(query.pagina),
@@ -376,10 +334,7 @@ export class PrestamoController {
pedir(@Request() req, @Body() body: PedirDto) {
const usuario: Usuario = req.user.usuario;
if (!usuario)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarUsuario(usuario);
return this.prestamoService.create(
usuario,
body.id_modulo,
@@ -400,18 +355,13 @@ export class PrestamoController {
type: 'text',
})
prestamoIdPrestamo(@Request() req, @Query() query: IdPrestamoDto) {
const operador: Operador = req.user.operador;
const usuario: Usuario = req.user.usuario;
const usuarioOperador: Operador | Usuario =
req.user.operador || req.user.usuario;
if (
operador &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
return this.prestamoService.findByIdController(parseInt(query.id_prestamo));
if ('id_usuario' in usuarioOperador)
this.validarUsuarioService.validarUsuario(usuarioOperador);
else this.validarUsuarioService.validarAdminOperador(usuarioOperador);
return this.prestamoService.findByIdController(parseInt(query.id_prestamo));
}
@Serealize(PrestamoOutputDto)
@@ -430,10 +380,7 @@ export class PrestamoController {
prestamoIdUsuario(@Request() req, @Query() query: IdUsuarioDto) {
const usuario: Usuario = req.user.usuario;
if (!usuario)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarUsuario(usuario);
return this.prestamoService.findByIdUsuario(parseInt(query.id_usuario));
}
@@ -461,14 +408,7 @@ export class PrestamoController {
) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.prestamoService.findByNumeroInventario(
parseInt(query.id_institucion),
query.numero_inventario,
@@ -495,14 +435,7 @@ export class PrestamoController {
regresarIdPrestamo(@Request() req, @Body() body: RegresarIdPrestamoDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.prestamoService.regresarIdPrestamo(
body.id_operador,
body.id_prestamo,
@@ -534,14 +467,7 @@ export class PrestamoController {
) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(operador);
return this.prestamoService.regresarNumeroInventario(
body.id_operador,
body.numero_inventario,
+2
View File
@@ -17,6 +17,7 @@ import { MultaModule } from '../multa/multa.module';
import { PasscodeModule } from '../passcode/passcode.module';
import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module';
import { UsuarioModule } from '../usuario/usuario.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
@@ -34,6 +35,7 @@ import { UsuarioModule } from '../usuario/usuario.module';
TypeOrmModule.forFeature([Prestamo]),
TipoUsuarioModule,
UsuarioModule,
ValidarUsuarioModule,
],
controllers: [PrestamoController],
providers: [AppGateway, PrestamoService],
+22 -5
View File
@@ -288,6 +288,8 @@ export class PrestamoService {
async findAll(filtros: {
pagina: string;
activo?: string | boolean;
cancelado_operador?: string;
cancelado_usuario?: string;
carrito?: string;
equipo?: string;
fechaFin?: string;
@@ -344,8 +346,10 @@ export class PrestamoService {
.innerJoinAndSelect('m.institucion', 'i')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ca.nivel', 'n')
.orderBy('p.id_prestamo', 'DESC')
.orderBy(
'p.id_prestamo',
filtros.activo && typeof filtros.activo === 'boolean' ? 'ASC' : 'DESC',
)
.addOrderBy('i.institucion')
.addOrderBy('m.modulo')
.addOrderBy('tc.tipo_carrito')
@@ -362,6 +366,22 @@ export class PrestamoService {
activo: filtros.activo === 'true',
});
}
if (filtros.cancelado_operador)
query.andWhere('p.cancelado_operador = :cancelado_operador', {
cancelado_operador: filtros.cancelado_operador === 'true',
});
if (filtros.cancelado_usuario)
query.andWhere('p.cancelado_usuario = :cancelado_usuario', {
cancelado_usuario: filtros.cancelado_usuario === 'true',
});
if (filtros.fechaInicio)
query.andWhere('p.fecha_inicio >= :fechaInicio', {
fechaInicio: filtros.fechaInicio,
});
if (filtros.fechaFin)
query.andWhere('p.fecha_inicio <= :fechaFin', {
fechaFin: filtros.fechaFin,
});
if (filtros.id_prestamo)
query.andWhere('p.id_prestamo LIKE :id_prestamo', {
id_prestamo: `%${filtros.id_prestamo}%`,
@@ -451,7 +471,6 @@ export class PrestamoService {
.innerJoinAndSelect('m.institucion', 'i')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ca.nivel', 'n')
.orderBy('p.id_prestamo', 'DESC')
.skip((pagina - 1) * 25)
.take(25)
@@ -476,7 +495,6 @@ export class PrestamoService {
.innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ca.nivel', 'n')
.innerJoinAndSelect('m.institucion', 'i')
.where('p.id_prestamo = :id_prestamo', {
id_prestamo,
@@ -589,7 +607,6 @@ export class PrestamoService {
.innerJoinAndSelect('m.institucion', 'i')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ca.nivel', 'n')
.where('p.activo = 1')
.getOne(),
)
+7 -17
View File
@@ -1,21 +1,19 @@
import {
Controller,
ForbiddenException,
Get,
Request,
UseGuards,
} from '@nestjs/common';
import { Controller, Get, Request, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { StatusService } from './status.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { StatusOutputDto } from './dto/output/status.dto';
import { Operador } from '../operador/entity/operador.entity';
@Controller('status')
@ApiTags('status')
export class StatusController {
constructor(private statusService: StatusService) {}
constructor(
private statusService: StatusService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Serealize(StatusOutputDto)
@Get()
@@ -25,15 +23,7 @@ export class StatusController {
get(@Request() req) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
this.validarUsuarioService.validarOperador(operador);
return this.statusService.findAll();
}
}
+2
View File
@@ -4,11 +4,13 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { StatusController } from './status.controller';
import { StatusService } from './status.service';
import { Status } from './entity/status.entity';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([Status]),
ValidarUsuarioModule,
],
controllers: [StatusController],
providers: [StatusService],
+8 -19
View File
@@ -1,6 +1,5 @@
import {
Body,
ConflictException,
Controller,
Get,
Post,
@@ -11,6 +10,7 @@ import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { TipoUsuarioService } from './tipo-usuario.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { CreateTipoUsuarioDto } from './dto/input/create.dto';
import { TipoUsuarioOutputDto } from './dto/output/tipo-usuario.dto';
@@ -18,7 +18,10 @@ import { TipoUsuarioOutputDto } from './dto/output/tipo-usuario.dto';
@Controller('tipo-usuario')
@ApiTags('tipo-usuario')
export class TipoUsuarioController {
constructor(private tipoUsuarioService: TipoUsuarioService) {}
constructor(
private tipoUsuarioService: TipoUsuarioService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post()
@UseGuards(AuthGuard('jwt'))
@@ -31,10 +34,7 @@ export class TipoUsuarioController {
create(@Request() req, @Body() body: CreateTipoUsuarioDto) {
const superAdmin: Operador = req.user.operador;
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ConflictException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.tipoUsuarioService.create(body.tipo_usuario);
}
@@ -48,10 +48,7 @@ export class TipoUsuarioController {
get(@Request() req) {
const superAdmin: Operador = req.user.operador;
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
throw new ConflictException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.tipoUsuarioService.findAll();
}
@@ -66,15 +63,7 @@ export class TipoUsuarioController {
operador(@Request() req) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ConflictException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarOperador(operador);
return this.tipoUsuarioService.findAll('operador');
}
}
+2
View File
@@ -4,11 +4,13 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { TipoUsuarioController } from './tipo-usuario.controller';
import { TipoUsuarioService } from './tipo-usuario.service';
import { TipoUsuario } from './entity/tipo-usuario.entity';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([TipoUsuario]),
ValidarUsuarioModule,
],
controllers: [TipoUsuarioController],
providers: [TipoUsuarioService],
+33 -4
View File
@@ -5,6 +5,7 @@ import {
Post,
Query,
Response,
Request,
UploadedFile,
UseGuards,
UseInterceptors,
@@ -13,23 +14,31 @@ import { AuthGuard } from '@nestjs/passport';
import { FileInterceptor } from '@nestjs/platform-express';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { UploadFileService } from './upload-file.service';
import { Operador } from '../operador/entity/operador.entity';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { IdInstitucionDto } from '../dto/id-institucion.dto';
@Controller('upload-file')
@ApiTags('upload-file')
export class UploadFileController {
constructor(private uploadFileService: UploadFileService) {}
constructor(
private uploadFileService: UploadFileService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post('carga-masiva-equipos')
@UseGuards(AuthGuard('jwt'))
@UseInterceptors(FileInterceptor('csv'))
@ApiBearerAuth('jwt')
cargaMasivaEquipos(
@Request() req,
@UploadedFile() file: Express.Multer.File,
@Query() query: IdInstitucionDto,
) {
const admin: Operador = req.user.operador;
const path = file ? `${file.destination}/${file.filename}` : null;
this.validarUsuarioService.validarAdmin(admin);
if (!file) throw new BadRequestException('No se mandó ningún archivo.');
return this.uploadFileService.createEquipos(
path,
@@ -42,11 +51,14 @@ export class UploadFileController {
@UseInterceptors(FileInterceptor('csv'))
@ApiBearerAuth('jwt')
cargaMasivaUsuarios(
@Request() req,
@UploadedFile() file: Express.Multer.File,
@Query() query: IdInstitucionDto,
) {
const admin: Operador = req.user.operador;
const path = file ? `${file.destination}/${file.filename}` : null;
this.validarUsuarioService.validarAdmin(admin);
if (!file) throw new BadRequestException('No se mandó ningún archivo.');
return this.uploadFileService.createUsuarios(
path,
@@ -57,7 +69,14 @@ export class UploadFileController {
@Get('download-logo')
@UseGuards(AuthGuard('jwt'))
@ApiBearerAuth('jwt')
downloadLogo(@Response() res, @Query() query: IdInstitucionDto) {
downloadLogo(
@Request() req,
@Response() res,
@Query() query: IdInstitucionDto,
) {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(operador);
return this.uploadFileService
.downloadLogo(parseInt(query.id_institucion))
.then((logo) => res.download(logo));
@@ -66,14 +85,20 @@ export class UploadFileController {
@Get('download-plantilla-equipos')
@UseGuards(AuthGuard('jwt'))
@ApiBearerAuth('jwt')
downloadPlantillaEquipos(@Response() res) {
downloadPlantillaEquipos(@Request() req, @Response() res) {
const admin: Operador = req.user.operador;
this.validarUsuarioService.validarAdmin(admin);
return res.download('./upload/plantilla_equipos.csv');
}
@Get('download-plantilla-usuarios')
@UseGuards(AuthGuard('jwt'))
@ApiBearerAuth('jwt')
downloadPlantillaUsuarios(@Response() res) {
downloadPlantillaUsuarios(@Request() req, @Response() res) {
const admin: Operador = req.user.operador;
this.validarUsuarioService.validarAdmin(admin);
return res.download('./upload/plantilla_alumnos.csv');
}
@@ -82,9 +107,13 @@ export class UploadFileController {
@ApiBearerAuth('jwt')
@UseInterceptors(FileInterceptor('logo'))
uploadLogo(
@Request() req,
@UploadedFile() file: Express.Multer.File,
@Query() query: IdInstitucionDto,
) {
const admin: Operador = req.user.operador;
this.validarUsuarioService.validarAdmin(admin);
return this.uploadFileService.uploadLogo(
file,
parseInt(query.id_institucion),
+2
View File
@@ -19,6 +19,7 @@ import { ModeloModule } from '../modelo/modelo.module';
import { ModuloModule } from '../modulo/modulo.module';
import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module';
import { UsuarioModule } from '../usuario/usuario.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
@@ -49,6 +50,7 @@ import { UsuarioModule } from '../usuario/usuario.module';
PassportModule.register({ defaultStrategy: 'jwt' }),
TipoUsuarioModule,
UsuarioModule,
ValidarUsuarioModule,
],
controllers: [UploadFileController],
providers: [AppGateway, UploadFileService],
+158 -122
View File
@@ -131,7 +131,8 @@ export class UploadFileService {
errores: string[],
equiposNuevos: Equipo[],
) {
let error = this.errorBase(index);
const errorAux = this.errorBase(index);
let error = errorAux;
if (
!dataEquipo.carrito ||
@@ -145,23 +146,38 @@ export class UploadFileService {
!dataEquipo.tipo
) {
if (!dataEquipo.carrito) error += ' falta del campo carrito';
if (error != this.errorBase(index)) error += ',';
if (!dataEquipo.entradas) error += ' falta del campo entradas';
if (error != this.errorBase(index)) error += ',';
if (!dataEquipo.equipo) error += ' falta del campo equipo';
if (error != this.errorBase(index)) error += ',';
if (!dataEquipo.marca) error += ' falta del campo marca';
if (error != this.errorBase(index)) error += ',';
if (!dataEquipo.modelo) error += ' falta del campo modelo';
if (error != this.errorBase(index)) error += ',';
if (!dataEquipo.modulo) error += ' falta del campo modulo';
if (error != this.errorBase(index)) error += ',';
if (!dataEquipo.numero_inventario)
if (!dataEquipo.entradas) {
if (error != errorAux) error += ',';
error += ' falta del campo entradas';
}
if (!dataEquipo.equipo) {
if (error != errorAux) error += ',';
error += ' falta del campo equipo';
}
if (!dataEquipo.marca) {
if (error != errorAux) error += ',';
error += ' falta del campo marca';
}
if (!dataEquipo.modelo) {
if (error != errorAux) error += ',';
error += ' falta del campo modelo';
}
if (!dataEquipo.modulo) {
if (error != errorAux) error += ',';
error += ' falta del campo modulo';
}
if (!dataEquipo.numero_inventario) {
if (error != errorAux) error += ',';
error += ' falta del campo numero_inventario';
if (error != this.errorBase(index)) error += ',';
if (!dataEquipo.numero_serie) error += ' falta del campo numero_serie';
if (error != this.errorBase(index)) error += ',';
if (!dataEquipo.tipo) error += ' falta del campo tipo';
}
if (!dataEquipo.numero_serie) {
if (error != errorAux) error += ',';
error += ' falta del campo numero_serie';
}
if (!dataEquipo.tipo) {
if (error != errorAux) error += ',';
error += ' falta del campo tipo';
}
errores.push(error + '.');
return;
}
@@ -195,138 +211,158 @@ export class UploadFileService {
false,
)
: null;
// let equipo = carrito
// ? await this.equipoService.findEquipoByEquipo(
// carrito,
// dataEquipo.equipo,
// false,
// )
// : null;
let equipo = carrito
? await this.equipoService.findEquipoByEquipo(
carrito,
? await this.equipoService.informacionEquipoByEquipo(
carrito.id_carrito,
dataEquipo.equipo,
false,
)
: null;
if (!tipoCarrito || !marca || !modelo || !modulo || !carrito) {
if (!tipoCarrito) error += ' no existe este tipo de carrito';
if (error != this.errorBase(index)) error += ',';
if (!marca) error += ' no existe esta marca';
if (error != this.errorBase(index)) error += ',';
if (!modelo) error += ' no existe este modelo';
if (error != this.errorBase(index)) error += ',';
if (!modulo) error += ' no existe este módulo';
if (error != this.errorBase(index)) error += ',';
if (!carrito) error += ' no existe este carrito';
if (!marca) {
if (error != errorAux) error += ',';
error += ' no existe esta marca';
}
if (!modelo) {
if (error != errorAux) error += ',';
error += ' no existe este modelo';
}
if (!modulo) {
if (error != errorAux) error += ',';
error += ' no existe este módulo';
}
if (!carrito) {
if (error != errorAux) error += ',';
error += ' no existe este carrito';
}
errores.push(error + '.');
return;
}
if (equipo) {
errores.push(
`${error} ya existe un equipo de cómputo con el sobrenombre: ${equipo.equipo} en el carrito: ${equipo.carrito.carrito}.`,
`${error} ya existe un equipo de cómputo con el sobrenombre: ${equipo.equipo} en el carrito: ${equipo.carrito}.`,
// `${error} ya existe un equipo de cómputo con el sobrenombre: ${equipo.equipo} en el carrito: ${equipo.carrito.carrito}.`,
);
return;
} else {
equipo = await this.equipoService.findByNumeroInventario(
institucion,
// equipo = await this.equipoService.findByNumeroInventario(
// institucion,
// dataEquipo.numero_inventario,
// false,
// );
equipo = await this.equipoService.informacionEquipoNumeroInventario(
institucion.id_institucion,
dataEquipo.numero_inventario,
false,
);
if (equipo) {
errores.push(
`${error} ya existe un equipo con ese número de inventario en esta institución.`,
);
return;
}
equipo = await this.equipoService.create(
carrito,
dataEquipo.equipo,
dataEquipo.numero_inventario,
dataEquipo.numero_serie,
marca,
modelo,
);
await this.equipoService
.create(
carrito,
dataEquipo.equipo,
dataEquipo.numero_inventario,
dataEquipo.numero_serie,
marca,
modelo,
)
.then(async (equipo) => {
const entradas = dataEquipo.entradas.split(',');
const programas = dataEquipo.programas
? dataEquipo.programas.split(',')
: [];
const entradas = dataEquipo.entradas.split(',');
const programas = dataEquipo.programas
? dataEquipo.programas.split(',')
: [];
equipo.programas = [];
equipo.tiposEntradas = [];
for (let j = 0; j < entradas.length; j++) {
const tipoEntrada =
await this.institucionTipoEntradaService.findTipoEntradaByTipoEntrada(
entradas[j].trim(),
false,
);
const existeEquipoTipoEntrada = tipoEntrada
? await this.equipoTipoEntradaService.informacionEquipoTipoEntrada(
equipo.id_equipo,
tipoEntrada.id_tipo_entrada,
)
: null;
equipo.programas = [];
equipo.tiposEntradas = [];
for (let j = 0; j < entradas.length; j++) {
const tipoEntrada =
await this.institucionTipoEntradaService.findTipoEntradaByTipoEntrada(
entradas[j].trim(),
false,
);
const existeEquipoTipoEntrada = tipoEntrada
? await this.equipoTipoEntradaService.findEquipoTipoEntradaByEquipoTipoEntrada(
equipo,
tipoEntrada,
false,
)
: null;
if (!tipoEntrada || existeEquipoTipoEntrada) {
if (!tipoEntrada)
errores.push(
`No se asignó el conector: ${
entradas[j]
}, al equipo de la linea ${
index + 2
} porque no existe este conector.`,
);
if (existeEquipoTipoEntrada)
errores.push(
`El conector: ${
entradas[j]
}, ya fue asignado al equipo de la linea ${index + 2}.`,
);
continue;
}
await this.equipoTipoEntradaService
.createCargaMasiva(equipo, tipoEntrada)
.then((res) => {
equipo.tiposEntradas.push(res.equipoTipoEntrada);
mensajes.push(res.message);
});
}
for (let j = 0; j < programas.length; j++) {
const programa =
await this.institucionProgramaService.findProgramaByPrograma(
programas[j].trim(),
false,
);
const existeEquipoPrograma = programa
? await this.equipoProgramaService.informacionEquipoPrograma(
equipo.id_equipo,
programa.id_programa,
)
: null;
if (!tipoEntrada || existeEquipoTipoEntrada) {
if (!tipoEntrada)
errores.push(
`No se asignó el conector: ${
entradas[j]
}, al equipo de la linea ${
index + 2
} porque no existe este conector.`,
);
if (existeEquipoTipoEntrada)
errores.push(
`El conector: ${
entradas[j]
}, ya fue asignado al equipo de la linea ${index + 2}.`,
);
continue;
}
await this.equipoTipoEntradaService
.create(equipo, tipoEntrada)
.then((res) => {
equipo.tiposEntradas.push(res.equipoTipoEntrada);
mensajes.push(res.message);
});
}
for (let j = 0; j < programas.length; j++) {
const programa =
await this.institucionProgramaService.findProgramaByPrograma(
programas[j].trim(),
false,
);
const existeEquipoPrograma = programa
? await this.equipoProgramaService.findEquipoProgramaByEquipoPrograma(
equipo,
programa,
false,
)
: null;
if (!programa || existeEquipoPrograma) {
if (!programa)
errores.push(
`No se asignó el software: ${
programas[j]
}, al equipo de la linea ${
index + 2
} porque no existe este software.`,
);
if (existeEquipoPrograma)
errores.push(
`El programa: ${
programas[j]
}, ya lo tiene asignado el equipo de la linea ${index + 2}.`,
);
continue;
}
await this.equipoProgramaService
.create(equipo, programa)
.then((res) => {
equipo.programas.push(res.equipoPrograma);
mensajes.push(res.message);
});
}
equiposNuevos.push(equipo);
if (!programa || existeEquipoPrograma) {
if (!programa)
errores.push(
`No se asignó el software: ${
programas[j]
}, al equipo de la linea ${
index + 2
} porque no existe este software.`,
);
if (existeEquipoPrograma)
errores.push(
`El programa: ${
programas[j]
}, ya lo tiene asignado el equipo de la linea ${index + 2}.`,
);
continue;
}
await this.equipoProgramaService
.createCargaMasiva(equipo, programa)
.then((res) => {
equipo.programas.push(res.equipoPrograma);
mensajes.push(res.message);
});
}
equiposNuevos.push(equipo);
});
}
}
@@ -0,0 +1,62 @@
import { DataSource, ViewEntity, ViewColumn } from 'typeorm';
import { InstitucionCarrera } from '../../../institucion-carrera/entity/institucion-carrera.entity';
import { InstitucionUsuario } from '../../../institucion-usuario/entity/institucion-usuario.entity';
import { Usuario } from '../usuario.entity';
@ViewEntity({
expression: (dataSource: DataSource) =>
dataSource
.createQueryBuilder()
.select('u.id_usuario', 'id_usuario')
.addSelect('u.id_tipo_usuario', 'id_tipo_usuario')
.addSelect('u.nombre', 'nombre')
.addSelect('u.password', 'password')
.addSelect('u.usuario', 'usuario')
.addSelect('iu.activo', 'activo')
.addSelect('iu.id_institucion_carrera', 'id_institucion_carrera')
.addSelect('iu.id_institucion_usuario', 'id_institucion_usuario')
.addSelect('iu.multa', 'multa')
.addSelect('ic.id_carrera', 'id_carrera')
.addSelect('ic.id_institucion', 'id_institucion')
.from(Usuario, 'u')
.innerJoin(InstitucionUsuario, 'iu', 'iu.id_usuario = u.id_usuario')
.innerJoin(
InstitucionCarrera,
'ic',
'ic.id_institucion_carrera = iu.id_institucion_carrera',
),
})
export class InformacionUsuarioView {
@ViewColumn()
id_usuario: number;
@ViewColumn()
activo: boolean;
@ViewColumn()
id_carrera: number;
@ViewColumn()
id_institucion: number;
@ViewColumn()
id_institucion_carrera: number;
@ViewColumn()
id_institucion_usuario: number;
@ViewColumn()
id_tipo_usuario: number;
@ViewColumn()
multa: boolean;
@ViewColumn()
nombre: string;
@ViewColumn()
password: string;
@ViewColumn()
usuario: string;
}
+10 -36
View File
@@ -1,7 +1,6 @@
import {
Body,
Controller,
ForbiddenException,
Get,
Post,
Put,
@@ -20,6 +19,7 @@ import {
import { Recaptcha } from '@nestlab/google-recaptcha';
import { Serealize } from '../interceptors/serialize.interceptor';
import { UsuarioService } from './usuario.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { RegistrarUsuarioInputDto } from './dto/input/registrar.dto';
import { UpdateUsuarioInputDto } from './dto/input/update.dto';
@@ -31,10 +31,13 @@ import { UsuariosOutputDto } from './dto/output/usuarios.dto';
@Controller('usuario')
@ApiTags('usuario')
export class UsuarioController {
constructor(private usuarioService: UsuarioService) {}
constructor(
private usuarioService: UsuarioService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Post('registrar')
// @Recaptcha()
@Recaptcha()
@ApiOperation({
description: 'Enpoint que realiza el registro de un usuario.',
})
@@ -77,14 +80,7 @@ export class UsuarioController {
update(@Request() req, @Body() body: UpdateUsuarioInputDto) {
const admin: Operador = req.user.operador;
if (
!admin ||
(admin.tipoUsuario.id_tipo_usuario != 3 &&
admin.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(admin);
return this.usuarioService.update(body);
}
@@ -101,14 +97,7 @@ export class UsuarioController {
passwordResset(@Request() req, @Body() body: UpdateUsuarioInputDto) {
const admin: Operador = req.user.operador;
if (
!admin ||
(admin.tipoUsuario.id_tipo_usuario != 3 &&
admin.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(admin);
return this.usuarioService.passwordReset(body.id_usuario);
}
@@ -127,14 +116,7 @@ export class UsuarioController {
usuario(@Request() req, @Query() query: UsuarioInputDto) {
const admin: Operador = req.user.operador;
if (
!admin ||
(admin.tipoUsuario.id_tipo_usuario != 3 &&
admin.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarAdminOperador(admin);
return this.usuarioService.findByUsuario(query.usuario, true, true);
}
@@ -184,15 +166,7 @@ export class UsuarioController {
usuarios(@Request() req, @Query() query: UsuariosInputDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
this.validarUsuarioService.validarOperador(operador);
return this.usuarioService.findAll(query);
}
}
+4 -1
View File
@@ -4,12 +4,14 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { UsuarioController } from './usuario.controller';
import { UsuarioService } from './usuario.service';
import { Usuario } from './entity/usuario.entity';
import { InformacionUsuarioView } from './entity/views/informacion-usuario.view';
import { BcryptModule } from '../bcrypt/bcrypt.module';
import { InstitucionModule } from '../institucion/institucion.module';
import { InstitucionCarreraModule } from '../institucion-carrera/institucion-carrera.module';
import { InstitucionUsuarioModule } from '../institucion-usuario/institucion-usuario.module';
import { NodemailerModule } from '../nodemailer/nodemailer.module';
import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
imports: [
@@ -20,7 +22,8 @@ import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module';
NodemailerModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TipoUsuarioModule,
TypeOrmModule.forFeature([Usuario]),
TypeOrmModule.forFeature([Usuario, InformacionUsuarioView]),
ValidarUsuarioModule,
],
controllers: [UsuarioController],
providers: [UsuarioService],
+42 -2
View File
@@ -8,6 +8,7 @@ import { Repository } from 'typeorm';
import { InstitucionCarrera } from '../institucion-carrera/entity/institucion-carrera.entity';
import { TipoUsuario } from '../tipo-usuario/entity/tipo-usuario.entity';
import { Usuario } from './entity/usuario.entity';
import { InformacionUsuarioView } from './entity/views/informacion-usuario.view';
import { BcryptService } from '../bcrypt/bcrypt.service';
import { InstitucionService } from '../institucion/institucion.service';
import { InstitucionCarreraService } from '../institucion-carrera/institucion-carrera.service';
@@ -19,6 +20,8 @@ import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service';
export class UsuarioService {
constructor(
@InjectRepository(Usuario) private repository: Repository<Usuario>,
@InjectRepository(InformacionUsuarioView)
private informacionUsuarioView: Repository<InformacionUsuarioView>,
private bcryptService: BcryptService,
private institucionService: InstitucionService,
private institucionCarreraService: InstitucionCarreraService,
@@ -128,7 +131,7 @@ export class UsuarioService {
});
}
findByUsuario(
async findByUsuario(
usuario: string,
validarNoExiste = true,
password = false,
@@ -154,6 +157,43 @@ export class UsuarioService {
});
}
informacionUsuarioByUsuario(usuario: string) {
return this.informacionUsuarioView
.find({ where: { usuario } })
.then((data) => {
const instituciones: {
id_institucion_usuario: number;
institucionCarrera: {
id_institucion_carrera: number;
institucion: { id_institucion: number };
carrera: { id_carrera: number };
};
}[] = [];
if (data.length === 0) return { usuario: null, password: null };
for (let i = 0; i < data.length; i++)
if (data[i].activo && !data[i].multa)
instituciones.push({
id_institucion_usuario: data[i].id_institucion_usuario,
institucionCarrera: {
id_institucion_carrera: data[i].id_institucion_carrera,
institucion: { id_institucion: data[i].id_institucion },
carrera: { id_carrera: data[i].id_carrera },
},
});
return {
usuario: {
id_usuario: data[0].id_usuario,
nombre: data[0].nombre,
usuario: data[0].usuario,
instituciones,
tipoUsuario: { id_tipo_usuario: data[0].id_tipo_usuario },
},
password: data[0].password,
};
});
}
passwordReset(id_usuario: number) {
const password = this.bcryptService.generarPassword();
@@ -164,7 +204,7 @@ export class UsuarioService {
})
.then((usuario) =>
this.nodemailerService.sendEmail({
email: `${usuario.usuario}@pcpuma.acatlan.unam.mx`,
email: usuario.correo,
subject: 'Credenciales Pc Puma',
html: this.nodemailerService.correoPasswordUsuario(password),
}),
@@ -0,0 +1,8 @@
import { Module } from '@nestjs/common';
import { ValidarUsuarioService } from './validar-usuario.service';
@Module({
providers: [ValidarUsuarioService],
exports: [ValidarUsuarioService],
})
export class ValidarUsuarioModule {}
@@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { ValidarUsuarioService } from './validar-usuario.service';
describe('ValidarUsuarioService', () => {
let service: ValidarUsuarioService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [ValidarUsuarioService],
}).compile();
service = module.get<ValidarUsuarioService>(ValidarUsuarioService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});
@@ -0,0 +1,53 @@
import { ForbiddenException, Injectable } from '@nestjs/common';
import { Operador } from 'src/operador/entity/operador.entity';
import { Usuario } from 'src/usuario/entity/usuario.entity';
@Injectable()
export class ValidarUsuarioService {
validarUsuario(usuario: Usuario) {
if (!usuario) this.sinPermisos();
}
validarAdmin(admin: Operador) {
if (!admin || admin.tipoUsuario.id_tipo_usuario != 3) this.sinPermisos();
}
validarAdminOperador(admin: Operador) {
if (
!admin ||
(admin.tipoUsuario.id_tipo_usuario != 3 &&
admin.tipoUsuario.id_tipo_usuario != 4)
)
this.sinPermisos();
}
validarOperador(operador: Operador) {
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 2 &&
operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
this.sinPermisos();
}
validarSuperAdmin(superAdmin: Operador) {
if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2)
this.sinPermisos();
}
validarSuperAdminAdmin(admin: Operador) {
if (
!admin ||
(admin.tipoUsuario.id_tipo_usuario != 2 &&
admin.tipoUsuario.id_tipo_usuario != 3)
)
this.sinPermisos();
}
sinPermisos() {
throw new ForbiddenException(
'No tienes los permisos necesarios para realizar esta acción.',
);
}
}
+5 -5
View File
@@ -1,5 +1,5 @@
numero_cuenta,nombres,apellido_p,apellido_m,carrera,tipo_usuario,rfc
316313528,LEMUEL HELON,MARQUEZ,ROSAS,MATEMATICAS APLICADAS Y COMPUTACION,Alumno,
316019251,MARCO ANTONIO,ROMERO,VAZQUEZ,ACTUARIA,Alumno,
316304326,JEREMY,CARRERA,SERRANO,ARQUITECTURA,Alumno,
419085500,ANDRES HERNAN,SAAVEDRA,TREJO,,Profesor,KDIE993388EOX
numero_cuenta,nombres,apellido_p,apellido_m,carrera,tipo_usuario,rfc,correo
316313528,LEMUEL HELON,MARQUEZ,ROSAS,MATEMATICAS APLICADAS Y COMPUTACION,Alumno,,
316019251,MARCO ANTONIO,ROMERO,VAZQUEZ,ACTUARIA,Alumno,,
316304326,JEREMY,CARRERA,SERRANO,ARQUITECTURA,Alumno,,
419085500,ANDRES HERNAN,SAAVEDRA,TREJO,,Profesor,KDIE993388EOX,
1 numero_cuenta nombres apellido_p apellido_m carrera tipo_usuario rfc correo
2 316313528 LEMUEL HELON MARQUEZ ROSAS MATEMATICAS APLICADAS Y COMPUTACION Alumno
3 316019251 MARCO ANTONIO ROMERO VAZQUEZ ACTUARIA Alumno
4 316304326 JEREMY CARRERA SERRANO ARQUITECTURA Alumno
5 419085500 ANDRES HERNAN SAAVEDRA TREJO Profesor KDIE993388EOX