Servicio de Usuarios
Este servicio gestiona todas las operaciones relacionadas con usuarios, incluyendo creación, consulta, actualización, eliminación, reactivación, cambio de contraseña y manejo de empresas.
Incluye además la generación de tokens JWT al momento de crear usuarios.
📍 Ubicación
src/services/user.service.ts
📦 Dependencias
prisma
— Cliente de base de datos.cloudinary
— Manejo de imágenes de perfil.bcryptjs
— Encriptación de contraseñas.jsonwebtoken
— Generación y verificación de tokens JWT.UserDTO
— Definición de datos de usuario.
🔑 Variables de Entorno
JWT_SECRET
— Clave secreta para firmar tokens JWT.
📜 Funciones
1. getAllUsers(filters: Partial<UserDTO>)
Obtiene una lista de usuarios filtrada por campos opcionales.
Parámetros:
filters
: Objeto parcial con propiedades deUserDTO
para filtrar (búsqueda insensible a mayúsculas enusername
,correo
,nombreCompleto
).
Retorna:
Lista de usuarios coincidentes.
2. getUserById(id: number)
Obtiene un usuario específico por su idUsuario
.
Parámetros:
id
: Número identificador del usuario.
Retorna:
El usuario encontrado o null
si no existe.
3. createUser(data: UserDTO)
Crea un nuevo usuario con validaciones según su rol y retorna también un token JWT.
Validaciones:
- Si
rol === "USUARIO"
→tipoUsuario
es obligatorio. - Si
rol === "EQUIPO"
→empresaId
es obligatorio y debe pertenecer a una empresa de tipo"EMPRESARIAL"
. - Contraseña siempre encriptada antes de guardar.
- Estado inicial
"activo"
.
Payload del token generado (24h
de expiración):
{
"id": idUsuario,
"username": username,
"correo": correo,
"rol": rol,
"tipoUsuario": tipoUsuario,
"rolEquipo": rolEquipo,
"perfilCompleto": perfilCompleto,
"empresaId": empresaId
}
Retorna:
{
user: UsuarioCreado,
token: string
}
Errores posibles:
"El tipoUsuario es obligatorio para rol USUARIO"
"empresaId es obligatorio para rol EQUIPO"
"La empresa especificada no existe o no es de tipo EMPRESARIAL"
4. getEmpresaById(id: number)
Obtiene una empresa validando que sea de tipo "EMPRESARIAL"
.
Parámetros:
id
: ID de la empresa.
Errores:
"Empresa no encontrada"
"El usuario no es de tipo EMPRESARIAL"
5. updateUser(id: number, data: Partial<UserDTO>)
Actualiza un usuario existente.
Restricciones:
- No se permite cambiar el rol.
- Si se envía una nueva contraseña, se encripta antes de guardar.
- Si se envía nueva
fotoPerfil
y el usuario ya tenía una, la anterior se elimina de Cloudinary.
Errores:
"Usuario no encontrado"
"No está permitido cambiar el rol del usuario."
6. changeUserPassword(id: number, currentPassword: string, newPassword: string)
Cambia la contraseña de un usuario validando la actual.
Parámetros:
id
: ID del usuario.currentPassword
: Contraseña actual.newPassword
: Nueva contraseña.
Flujo:
- Verifica que el usuario exista.
- Compara
currentPassword
con la almacenada. - Si coincide, hashea y actualiza la contraseña.
Retorna:
{ message: "Contraseña actualizada correctamente" }
Errores:
"Usuario no encontrado"
"La contraseña actual es incorrecta"
7. reactivarUsuario(id: number)
Restaura el estado de un usuario a "activo"
si estaba inactivo o eliminado.
Errores:
"Usuario no encontrado"
"El usuario ya está activo"
8. deleteUser(id: number)
Elimina lógicamente un usuario (no se borra de la base de datos).
Acciones:
- Cambia
estado
a"inactivo"
. - Asigna fecha a
deletedAt
. - Si el usuario es EMPRESA (
rol === "USUARIO"
ytipoUsuario === "EMPRESARIAL"
), inactiva a todo su equipo (rol: "EQUIPO"
) que esté activo.
Errores:
"Usuario no encontrado"
🧠 Observaciones
- Todas las contraseñas se almacenan encriptadas con
bcryptjs
. - El borrado es blando (soft delete), permitiendo reactivación posterior.
- El servicio centraliza la lógica de roles y relaciones empresa–equipo.
- El token JWT generado en
createUser
está pensado para autenticación en endpoints protegidos.