listo logins

This commit is contained in:
lemuel 2022-10-23 17:52:46 -05:00
parent 4417ac9fa1
commit b7926e1402
26 changed files with 145 additions and 88 deletions

View File

@ -25,7 +25,7 @@ export class AuthService {
) {}
loginAdmin(admin: string, password: string) {
return this.operadorService.findInfoOperadorAdmin(admin).then((admin) => {
return this.operadorService.findAdmin(admin).then((admin) => {
this.validacionBasica(admin, password);
this.validacionOperador(admin);
@ -49,7 +49,7 @@ export class AuthService {
const modulo = await this.moduloService.findInfoModuloById(id_modulo);
return this.operadorService
.findInfoOperador(modulo.institucion, operador)
.findOperador(modulo.institucion, operador)
.then((operador) => {
this.validacionBasica(operador, password);
this.validacionOperador(operador);
@ -69,9 +69,9 @@ export class AuthService {
},
};
// "Firmo"/creo el token
if (operador.tipoUsuario.id_tipo_usuario === 4)
JwtPayload.Modulo.id_modulo = modulo.id_modulo;
JwtPayload.Modulo = { id_modulo: modulo.id_modulo };
// "Firmo"/creo el token
return { token: this.jwtService.sign(JwtPayload) };
});
}

View File

@ -21,9 +21,10 @@ 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 { IdInstitucionDto } from '../dto/input/id-institucion.dto';
import { CreateCarreraProgramaDto } from './dto/input/create.dto';
import { DeleteCarreraProgramaDto } from './dto/input/delete.dto';
import { MessageOutputDto } from '../dto/output/message.dto';
import { CarreraProgramaOutputDto } from './dto/output/carrera-programa.dto';
@Controller('carrera-programa')
@ -34,6 +35,7 @@ export class CarreraProgramaController {
private validarUsuarioService: ValidarUsuarioService,
) {}
@Serealize(MessageOutputDto)
@Post()
@UseGuards(AuthGuard('jwt'))
@ApiOperation({
@ -58,6 +60,7 @@ export class CarreraProgramaController {
);
}
@Serealize(MessageOutputDto)
@Delete()
@UseGuards(AuthGuard('jwt'))
@ApiOperation({
@ -93,7 +96,7 @@ export class CarreraProgramaController {
const usuarioOperador: Operador | Usuario =
req.user.operador || req.user.usuario;
if ('id_usuario' in usuarioOperador)
if (usuarioOperador instanceof Usuario)
this.validarUsuarioService.validarUsuario(usuarioOperador);
else this.validarUsuarioService.validarAdmin(usuarioOperador);
return this.carreraProgramaService.findByIdInstitucion(

View File

@ -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 { InstitucionUsuarioModule } from '../institucion-usuario/institucion-usuario.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@Module({
@ -14,6 +15,7 @@ import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module'
InstitucionModule,
InstitucionCarreraModule,
InstitucionProgramaModule,
InstitucionUsuarioModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([CarreraPrograma]),
ValidarUsuarioModule,

View File

@ -12,6 +12,7 @@ import { Usuario } from '../usuario/entity/usuario.entity';
import { InstitucionService } from '../institucion/institucion.service';
import { InstitucionCarreraService } from '../institucion-carrera/institucion-carrera.service';
import { InstitucionProgramaService } from '../institucion-programa/institucion-programa.service';
import { InstitucionUsuarioService } from '../institucion-usuario/institucion-usuario.service';
@Injectable()
export class CarreraProgramaService {
@ -21,6 +22,7 @@ export class CarreraProgramaService {
private institucionService: InstitucionService,
private institucionCarreraService: InstitucionCarreraService,
private institucionProgramaService: InstitucionProgramaService,
private institucionUsuarioService: InstitucionUsuarioService,
) {}
async create(
@ -35,6 +37,7 @@ export class CarreraProgramaService {
id_programa,
);
// Valido que el admin que esta realizando esta acción le pertenezca la carrera
if (
admin.institucion.id_institucion !=
institucionCarrera.institucion.id_institucion
@ -42,13 +45,16 @@ export class CarreraProgramaService {
throw new ForbiddenException(
'Esta carrera no pertenece a tu institución.',
);
// Busco un registro que ya contenga la info mandada
return this.repository
.findOne({ where: { institucionCarrera, programa } })
.then((existeCarretaPrograma) => {
// Si lo encuentro saco error
if (existeCarretaPrograma)
throw new ConflictException(
'Ya se asignó este programa a esta carrera.',
);
// Guardar registro
return this.repository.save(
this.repository.create({
institucionCarrera,
@ -64,6 +70,8 @@ export class CarreraProgramaService {
delete(admin: Operador, id_carrera_programa: number) {
return this.findById(id_carrera_programa)
.then((carreraPrograma) => {
// Valido que la asociación entre una carrera y un programa le
// pertenezcan al admin que realiza esta acción
if (
admin.institucion.id_institucion !=
carreraPrograma.institucionCarrera.institucion.id_institucion
@ -71,6 +79,7 @@ export class CarreraProgramaService {
throw new ForbiddenException(
'No puedes eliminar esta asociación porque no pertenece a tu institución.',
);
// Elimino
return this.repository.delete(carreraPrograma);
})
.then((_) => ({
@ -94,31 +103,26 @@ export class CarreraProgramaService {
) {
return this.institucionService
.findInfoInstitucionById(id_institucion)
.then((institucion) => {
.then(async (institucion) => {
// Si es un Operador
if (usuarioOperador instanceof Operador) {
// Valido que la info le pertenezca al operador que la solicita
if (
usuarioOperador.institucion.id_institucion !=
institucion.id_institucion
)
throw new ForbiddenException(
'No puedes acceder a esta información porque no perteneces a esta institución.',
'No puedes acceder a esta información porque no le pertenece a tu institución.',
);
} else {
let lePertenece = false;
for (let i = 0; i < usuarioOperador.instituciones.length; i++)
if (
usuarioOperador.instituciones[i].institucionCarrera.institucion
.id_institucion === institucion.id_institucion
) {
lePertenece = true;
break;
}
if (!lePertenece)
throw new ForbiddenException(
'No puedes acceder a esta información porque no perteneces a esta institución.',
);
}
} else
await this.institucionUsuarioService
.findByIdUsuarioIdInstitucion(usuarioOperador, institucion)
.then((institucionUsuario) => {
if (!institucionUsuario)
throw new ForbiddenException(
'No puedes acceder a esta información porque no perteneces a esta institución.',
);
});
return this.repository.find({
join: {
alias: 'cp',

View File

@ -0,0 +1,6 @@
import { Expose } from 'class-transformer';
export class MessageOutputDto {
@Expose()
message;
}

View File

@ -10,7 +10,7 @@ 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 { IdEquipoPaginaDto } from '../dto/input/id-equipo-pagina.dto';
import { EquipoMotivoOutputDto } from './dto/output/equipo-motivo.dto';
@Controller('equipo-motivo')

View File

@ -2,7 +2,7 @@ import { Controller, Get, Query } from '@nestjs/common';
import { ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { InstitucionCarreraService } from './institucion-carrera.service';
import { IdInstitucionDto } from '../dto/id-institucion.dto';
import { IdInstitucionDto } from '../dto/input/id-institucion.dto';
import { InstitucionCarreaOutputDto } from './dto/output/institucion-carrera.dto';
@Controller('institucion-carrera')

View File

@ -19,7 +19,7 @@ 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 { IdInstitucionDto } from '../dto/input/id-institucion.dto';
import { UpdateInstitucionDiaDto } from './dto/input/update.dto';
import { InstitucionCarreaOutputDto } from './dto/output/institucion-carrera.dto';
import { Usuario } from '../usuario/entity/usuario.entity';

View File

@ -20,7 +20,7 @@ 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 { IdInstitucionDto } from '../dto/input/id-institucion.dto';
import { CreateInstitucionInfraccionDto } from './dto/input/create.dto';
import { UpdateInstitucionInfraccionDto } from './dto/input/update.dto';
import { InfraccionOutputDto } from './dto/output/infraccion.dto';

View File

@ -21,7 +21,7 @@ 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';
import { IdInstitucionDto } from '../dto/input/id-institucion.dto';
import { CreateProgramaDto } from './dto/input/create.dto';
import { UpdateProgramaDto } from './dto/input/update.dto';
import { InstitucionProgramaOutputDto } from './dto/output/institucion-programa.dto';

View File

@ -21,7 +21,7 @@ import { InstitucionTipoCarritoService } from './institucion-tipo-carrito.servic
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 { IdInstitucionDto } from '../dto/input/id-institucion.dto';
import { CreateInstitucionTipoCarritoDto } from './dto/input/create.dto';
import { UpdateInstitucionTipoCarritoDto } from './dto/input/update.dto';
import { InstitucionTiposCarritoOutputDto } from './dto/output/institucion-tipos-carrito.dto';

View File

@ -21,7 +21,7 @@ import { InstitucionTipoEntradaService } from './institucion-tipo-entrada.servic
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 { IdInstitucionDto } from '../dto/input/id-institucion.dto';
import { CreateInstitucionTipoEntradaDto } from './dto/input/create.dto';
import { UpdateInstitucionTipoEntradaDto } from './dto/input/update.dto';
import { InstitucionTipoEntradaOutputDto } from './dto/output/institucion-tipo-entrada.dto';

View File

@ -1,6 +1,7 @@
import { ConflictException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Institucion } from 'src/institucion/entity/institucion.entity';
import { InstitucionCarrera } from '../institucion-carrera/entity/institucion-carrera.entity';
import { InstitucionUsuario } from './entity/institucion-usuario.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
@ -45,6 +46,20 @@ export class InstitucionUsuarioService {
});
}
findAllByIdUsuarioIdInstitucion(id_usuario: number, id_institucion: number) {
return this.informacionInstitucionUsuarioView
.find({ where: { id_institucion, id_usuario } })
.then((infoInstitucionesUsuario) => {
const institucionesUsuario: InstitucionUsuario[] = [];
for (let i = 0; i < infoInstitucionesUsuario.length; i++)
institucionesUsuario.push(
this.viewToInstitucionUsuario(infoInstitucionesUsuario[i]),
);
return institucionesUsuario;
});
}
findFullInfoAllByIdUsuarioIdInstitucion(
id_usuario: number,
id_institucion: number,
@ -109,20 +124,6 @@ export class InstitucionUsuarioService {
});
}
findAllByIdUsuarioIdInstitucion(id_usuario: number, id_institucion: number) {
return this.informacionInstitucionUsuarioView
.find({ where: { id_institucion, id_usuario } })
.then((infoInstitucionesUsuario) => {
const institucionesUsuario: InstitucionUsuario[] = [];
for (let i = 0; i < infoInstitucionesUsuario.length; i++)
institucionesUsuario.push(
this.viewToInstitucionUsuario(infoInstitucionesUsuario[i]),
);
return institucionesUsuario;
});
}
findById(id_institucion_usuario: number) {
return this.informacionInstitucionUsuarioView
.findOne({ where: { id_institucion_usuario } })
@ -133,6 +134,19 @@ export class InstitucionUsuarioService {
});
}
findByIdUsuarioIdInstitucion(usuario: Usuario, institucion: Institucion) {
return this.informacionInstitucionUsuarioView
.findOne({
where: {
id_institucion: institucion.id_institucion,
id_usuario: usuario.id_usuario,
},
})
.then((infoInstitucionUsuario) =>
this.viewToInstitucionUsuario(infoInstitucionUsuario),
);
}
findByIdUsuarioIdInstitucionCarrera(
id_usuario: number,
id_institucion_carrera: number,

View File

@ -20,7 +20,7 @@ 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 { IdInstitucionDto } from '../dto/input/id-institucion.dto';
import { UpdateInstitucionDto } from './dto/input/update.dto';
import { InstitucionOutputDto } from './dto/output/institucion.dto';
import { InstitucionMinOutputDto } from './dto/output/institucion-min.dto';

View File

@ -14,6 +14,10 @@ export class InstitucionService {
@InjectRepository(Institucion) private repository: Repository<Institucion>,
) {}
crearInstitucion(id_institucion: number) {
return this.repository.create({ id_institucion });
}
findById(id_institucion: number) {
return this.repository
.findOne({ where: { id_institucion } })

View File

@ -21,7 +21,7 @@ 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 { IdInstitucionDto } from '../dto/id-institucion.dto';
import { IdInstitucionDto } from '../dto/input/id-institucion.dto';
import { CreateModuloDto } from './dto/input/create.dto';
import { ModuloDto } from './dto/input/modulo.dto';
import { UpdateModuloDto } from './dto/input/update.dto';

View File

@ -21,12 +21,12 @@ 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';
import { IdEquipoPaginaDto } from '../dto/id-equipo-pagina.dto';
import { IdUsuarioDto } from '../dto/input/id-usuario.dto';
import { IdEquipoPaginaDto } from '../dto/input/id-equipo-pagina.dto';
import { MultarDto } from './dto/input/multar.dto';
import { MultasDto } from './dto/input/multas.dto';
import { QuitarMultarDto } from './dto/input/quitar.dto';
import { IdUsuarioPaginaDto } from '../dto/id-usuario-pagina.dto';
import { IdUsuarioPaginaDto } from '../dto/input/id-usuario-pagina.dto';
import { MultasOutputDto } from './dto/output/multas.dto';
import { MultasEquipoOutputDto } from './dto/output/multas-equipo.dto';
import { MultasMinOutputDto } from './dto/output/multas-min.dto';

View File

@ -32,6 +32,12 @@ export class Operador {
@Column({ type: String, nullable: false, length: 60 })
password: string;
@Column({ type: Number, nullable: true })
id_institucion: number;
@Column({ type: Number, nullable: true })
id_tipo_usuario: number;
@ManyToOne(() => Institucion, (institucion) => institucion.operadores)
@JoinColumn({ name: 'id_institucion' })
institucion: Institucion;

View File

@ -45,7 +45,7 @@ export class OperadorService {
'No se puede asignar un tipo de usuario distinto a admin y operador',
);
// Ver si existe un admin con ese usaurio
return this.findInfoOperadorAdmin(operador)
return this.findAdmin(operador)
.then((existeAdmin) => {
// Error si lo hay
if (existeAdmin)
@ -53,7 +53,7 @@ export class OperadorService {
'Ya existe un admin con ese nombre, intenta de nuevo con otro.',
);
// Ver que haya un operador en esta institución con este usuario
return this.findInfoOperador(institucion, operador);
return this.findOperador(institucion, operador);
})
.then(async (existeOperador) => {
// Error si lo hay
@ -159,35 +159,39 @@ export class OperadorService {
});
}
findInfoOperador(institucion: Institucion, operador: string) {
return this.repository.findOne({
select: {
id_operador: true,
activo: true,
nombre: true,
password: true,
institucion: { id_institucion: true },
tipoUsuario: { id_tipo_usuario: true },
},
where: { operador, institucion },
});
findAdmin(admin: string) {
return this.repository
.findOne({
select: {
id_operador: true,
activo: true,
nombre: true,
password: true,
id_institucion: true,
id_tipo_usuario: true,
},
where: {
operador: admin,
tipoUsuario: { id_tipo_usuario: Between(2, 3) },
},
})
.then((admin) => this.llenarIds(admin));
}
findInfoOperadorAdmin(admin: string) {
return this.repository.findOne({
select: {
id_operador: true,
activo: true,
nombre: true,
password: true,
institucion: { id_institucion: true },
tipoUsuario: { id_tipo_usuario: true },
},
where: {
operador: admin,
tipoUsuario: { id_tipo_usuario: Between(2, 3) },
},
});
findOperador(institucion: Institucion, operador: string) {
return this.repository
.findOne({
select: {
id_operador: true,
activo: true,
nombre: true,
password: true,
id_institucion: true,
id_tipo_usuario: true,
},
where: { operador, institucion },
})
.then((operador) => this.llenarIds(operador));
}
findInfoOperadorById(id_operador: number) {
@ -196,19 +200,29 @@ export class OperadorService {
select: {
id_operador: true,
activo: true,
correo : true,
institucion: { id_institucion: true },
tipoUsuario: { id_tipo_usuario: true },
correo: true,
id_institucion: true,
id_tipo_usuario: true,
},
where: { id_operador },
})
.then((operador) => {
if (!operador)
throw new NotFoundException('No existe este id operador.');
return operador;
return this.llenarIds(operador);
});
}
llenarIds(operador: Operador) {
operador.tipoUsuario = this.tipoUsuarioService.crearTipoUsuario(
operador.id_tipo_usuario,
);
operador.institucion = this.institucionService.crearInstitucion(
operador.id_institucion,
);
return operador;
}
passwordReset(admin: Operador, id_operador: number, password?: string) {
return this.findInfoOperadorById(id_operador)
.then((operador) => {

View File

@ -20,9 +20,9 @@ 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';
import { IdUsuarioPaginaDto } from '../dto/id-usuario-pagina.dto';
import { IdEquipoPaginaDto } from '../dto/input/id-equipo-pagina.dto';
import { IdUsuarioDto } from '../dto/input/id-usuario.dto';
import { IdUsuarioPaginaDto } from '../dto/input/id-usuario-pagina.dto';
import { NumeroInventarioDto } from '../dto/numero-inventario.dto';
import { ActivosDto } from './dto/input/activos.dto';
import { CancelarUsuarioDto } from './dto/input/cancelar-usuario.dto';
@ -359,7 +359,7 @@ export class PrestamoController {
const usuarioOperador: Operador | Usuario =
req.user.operador || req.user.usuario;
if ('id_usuario' in usuarioOperador)
if (usuarioOperador instanceof Usuario)
this.validarUsuarioService.validarUsuario(usuarioOperador);
else this.validarUsuarioService.validarAdminOperador(usuarioOperador);
return this.prestamoService.prestamoInfoById(parseInt(query.id_prestamo));

View File

@ -26,6 +26,10 @@ export class TipoUsuarioService {
}));
}
crearTipoUsuario(id_tipo_usuario: number) {
return this.repository.create({ id_tipo_usuario });
}
findAll(informacion?: string) {
const query = this.repository
.createQueryBuilder('tu')

View File

@ -16,7 +16,7 @@ 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';
import { IdInstitucionDto } from '../dto/input/id-institucion.dto';
@Controller('upload-file')
@ApiTags('upload-file')