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 deUserDTOpara 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"→tipoUsuarioes obligatorio. - Si
rol === "EQUIPO"→empresaIdes 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
fotoPerfily 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
currentPasswordcon 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
estadoa"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
createUserestá pensado para autenticación en endpoints protegidos.