usuario service final

This commit is contained in:
xXpuma99Xx 2022-12-23 16:18:46 -06:00
parent 8ab7bcc215
commit 58be316277
2 changed files with 54 additions and 41 deletions

View File

@ -98,10 +98,10 @@ export class UsuarioController {
examples: { ejemplo: { value: { id_usuario: 1 } } },
})
passwordResset(@Request() req, @Body() body: UpdateUsuarioInputDto) {
const admin: Operador = req.user.operador;
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(admin);
return this.usuarioService.passwordReset(body.id_usuario);
this.validarUsuarioService.validarAdminOperador(operador);
return this.usuarioService.passwordReset(operador, body.id_usuario);
}
@Serealize(UsuarioOutputDto)

View File

@ -6,6 +6,8 @@ import {
import { InjectRepository } from '@nestjs/typeorm';
import { FindOptionsWhere, Repository } from 'typeorm';
import { InstitucionCarrera } from '../institucion-carrera/entity/institucion-carrera.entity';
import { InstitucionUsuario } from '../institucion-usuario/entity/institucion-usuario.entity';
import { Operador } from '../operador/entity/operador.entity';
import { TipoUsuario } from '../tipo-usuario/entity/tipo-usuario.entity';
import { Usuario } from './entity/usuario.entity';
import { FullInformacionUsuarioView } from './entity/views/full-informacion-usuario.view';
@ -15,7 +17,6 @@ import { InstitucionCarreraService } from '../institucion-carrera/institucion-ca
import { InstitucionUsuarioService } from '../institucion-usuario/institucion-usuario.service';
import { NodemailerService } from '../nodemailer/nodemailer.service';
import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
@Injectable()
export class UsuarioService {
@ -31,15 +32,15 @@ export class UsuarioService {
private tipoUsuarioService: TipoUsuarioService,
) {}
async create(
create(
usuario: string,
nombre: string,
tipoUsuario: TipoUsuario,
institucionCarrera: InstitucionCarrera,
correo: string,
rfc?: string,
) {
// Crear y gurdar registro
): Promise<InstitucionUsuario> {
// Creamos y guardamos un registro
return this.repository
.save(
this.repository.create({
@ -47,11 +48,11 @@ export class UsuarioService {
tipoUsuario,
usuario,
correo,
rfc: rfc ? rfc : '',
rfc: rfc || '',
}),
)
.then((usuario) =>
// Le asigna la carrera enviada
// Le asignamos la carrera enviada
this.institucionUsuarioService.create(institucionCarrera, usuario),
);
}
@ -65,7 +66,7 @@ export class UsuarioService {
nombre?: string;
password?: string;
usuario?: string;
}) {
}): Promise<[Usuario[], number]> {
const carrera = filtros.id_carrera
? await this.institucionCarreraService.findCarreraByIdCarrera(
parseInt(filtros.id_carrera),
@ -90,7 +91,10 @@ export class UsuarioService {
.take(25)
.skip((parseInt(filtros.pagina) - 1) * 25);
if (filtros.password)
if (
filtros.password &&
(filtros.password === 'true' || filtros.password === 'false')
)
query.andWhere(
`u.password IS ${filtros.password === 'true' ? 'NOT' : ''} NULL`,
);
@ -153,7 +157,7 @@ export class UsuarioService {
findById(id_usuario: number) {
return this.repository
.findOne({
select: ['id_usuario', 'correo', 'password', 'usuario', 'nombre'],
select: ['id_usuario', 'correo', 'password', 'usuario'],
where: { id_usuario },
})
.then((usuario) => {
@ -172,24 +176,27 @@ export class UsuarioService {
});
}
passwordReset(id_usuario: number) {
// Genero password
const password = this.bcryptService.generarPassword();
passwordReset(
operador: Operador,
id_usuario: number,
): Promise<{ message: string }> {
const password = this.bcryptService.generarPassword(); // Generamos una password
return this.findById(id_usuario)
.then((usuario) => {
// Solo se puede actualizar password si no esta registrado, password = registro
.then(async (usuario) => {
await this.validarsOperadorMod(usuario, operador);
// Solo se puede reenviar password si no esta registrad@, tener password = registro
if (!usuario.password)
throw new ConflictException(
'No se puede enviar una contraseña a un usuario no registrado.',
);
// Asigno nueva password
// Actualizamos password
usuario.password = this.bcryptService.encriptar(password);
// Guardar
// Guardamos cambios
return this.repository.save(usuario);
})
.then((usuario) =>
// Envio correo con credenciales
// Enviamos un correo con credenciales
this.nodemailerService.sendEmail({
email: usuario.correo,
subject: 'Credenciales Pc Puma',
@ -206,23 +213,21 @@ export class UsuarioService {
usuario: string,
telefono: string,
rfc = '',
) {
): Promise<{ message: string }> {
const institucionCarrera = await this.institucionCarreraService.findById(
id_institucion_carrera,
);
// Genero password
const password = this.bcryptService.generarPassword();
const password = this.bcryptService.generarPassword(); // Generamos un password
let message: string;
// Buscamos usuario
return this.findByUsuario(usuario, rfc)
.then(async (existeUsuario) => {
// Ai no existe o tiene contraseña, es decir que esta registrado, saca error
// Si no existe o tiene contraseña, es decir que esta registrado, sacamos error
if (!existeUsuario || existeUsuario.password)
throw new ConflictException(
'Verificar sus datos, cualquier duda asistir al módulo PC PUMA.',
);
// Ver si el alumno pertenece a esta carrera
// Validamos que el alunmo pertenezca a la carrera enviada
return this.institucionUsuarioService.findFullInfoByIdUsuarioIdInstitucionCarrera(
existeUsuario,
institucionCarrera,
@ -246,11 +251,11 @@ export class UsuarioService {
institucionUsuario.usuario.telefono = telefono;
institucionUsuario.usuario.password =
this.bcryptService.encriptar(password);
// Guardar
// Guardamos cambios
return this.repository.save(institucionUsuario.usuario);
})
.then((usuario) =>
// Enviar credenciales al correo
// Enviamos un correo con credenciales
this.nodemailerService.sendEmail({
email: usuario.correo,
subject: 'Credenciales Pc Puma',
@ -260,26 +265,19 @@ export class UsuarioService {
.then((_) => ({ message }));
}
save(usuario: Usuario) {
save(usuario: Usuario): Promise<{ message: string }> {
return this.repository
.save(usuario)
.then((_) => ({ message: 'Se guardaron los cambios correctamente.' }));
}
update(operador: Operador, attrs: Partial<Usuario>) {
update(
operador: Operador,
attrs: Partial<Usuario>,
): Promise<{ message: string }> {
return this.findById(attrs.id_usuario)
.then(async (usuario) => {
const institucionesUsuario =
await this.institucionUsuarioService.findAllByIdUsuarioIdInstitucion(
usuario,
operador.institucion,
);
// Si el array no trae elementos significa que el usurio existe pero no le pertenece a quien pide la info
if (institucionesUsuario.length === 0)
throw new ConflictException(
'Este usuario no pertenece a tu institución.',
);
await this.validarsOperadorMod(usuario, operador);
// Asignamos valores enviados al objeto
Object.assign(usuario, attrs);
// Guardamos cambios
@ -287,4 +285,19 @@ export class UsuarioService {
})
.then((_) => ({ message: 'Se guardaron los cambios correctamente.' }));
}
private async validarsOperadorMod(
usuario: Usuario,
operador: Operador,
): Promise<void> {
return this.institucionUsuarioService
.findAllByIdUsuarioIdInstitucion(usuario, operador.institucion)
.then((institucionesUsuario) => {
// Si el array no trae elementos significa que el usuario existe pero no le pertenece a la institución de admin
if (institucionesUsuario.length === 0)
throw new ConflictException(
'No puedes modificar la información este usuario porque no pertenece a tu institución.',
);
});
}
}