Skip to content

Actualizar Usuarios

Endpoints para actualizar información de usuarios, incluyendo datos personales y información propia.

  • PUT /api/v1/users/update - Actualizar usuario (administrador)
  • PUT /api/v1/users/update-my-information - Actualizar mi información

Actualiza la información de cualquier usuario del sistema. Requiere permisos de administrador.

  • Método: PUT
  • Endpoint: /api/v1/users/update
  • Autenticación: Requerida (Bearer Token)
  • Permisos: Administrador
  • Validación: Campos opcionales, solo se actualizan los enviados
Content-Type: application/json
Accept: application/json
Authorization: Bearer {token}
CampoTipoRequeridoDescripciónValidaciones
uuidintegerID del usuario a actualizarDebe existir
namestringNoNombre del usuario2-50 caracteres, solo letras
last_namestringNoApellido del usuario2-50 caracteres, solo letras
emailstringNoEmail del usuarioFormato válido, único
phonestringNoTeléfono del usuarioFormato válido
passwordstringNoNueva contraseñaMínimo 8 caracteres
statusstringNoEstado del usuarioactive, inactive
role_idintegerNoID del rolDebe existir
  • Mínimo 2 caracteres, máximo 50
  • Solo letras y espacios
  • No números ni caracteres especiales
  • Formato de email válido
  • Único en el sistema
  • No puede estar en uso por otro usuario
  • Formato internacional válido
  • Ejemplo: +593987654321
  • Mínimo 8 caracteres
  • Al menos una letra mayúscula
  • Al menos una letra minúscula
  • Al menos un número
  • Al menos un carácter especial
{
"uuid": 123456789,
"name": "Juan Carlos",
"last_name": "Pérez González",
"email": "[email protected]",
"phone": "+593987654321"
}
{
"message": "Usuario actualizado correctamente",
"status": "OK",
"payload": {
"uuid": 123456789,
"name": "Juan Carlos",
"last_name": "Pérez González",
"email": "[email protected]",
"phone": "+593987654321",
"status": "active",
"updated_at": "2025-01-17 15:30:00"
}
}
{
"uuid": 123456789,
"role_id": 2,
"status": "active"
}
{
"message": "Usuario no encontrado",
"status": "ERROR"
}
{
"message": "Datos de entrada inválidos",
"status": "ERROR",
"errors": {
"email": ["El email ya está en uso"],
"phone": ["El formato del teléfono es inválido"]
}
}

Permite al usuario autenticado actualizar su propia información personal.

  • Método: PUT
  • Endpoint: /api/v1/users/update-my-information
  • Autenticación: Requerida (Bearer Token)
  • Permisos: Usuario autenticado
  • Limitaciones: No puede cambiar rol ni estado
Content-Type: application/json
Accept: application/json
Authorization: Bearer {token}
CampoTipoRequeridoDescripciónValidaciones
namestringNoNombre del usuario2-50 caracteres, solo letras
last_namestringNoApellido del usuario2-50 caracteres, solo letras
emailstringNoEmail del usuarioFormato válido, único
phonestringNoTeléfono del usuarioFormato válido
passwordstringNoNueva contraseñaMínimo 8 caracteres
current_passwordstringCondicionalContraseña actualRequerida si se cambia password
{
"name": "María Elena",
"last_name": "González Ruiz",
"phone": "+593998765432"
}
{
"current_password": "mi_password_actual",
"password": "nueva_password_segura123!"
}
{
"message": "Información actualizada correctamente",
"status": "OK",
"payload": {
"uuid": 123456789,
"name": "María Elena",
"last_name": "González Ruiz",
"email": "[email protected]",
"phone": "+593998765432",
"updated_at": "2025-01-17 16:45:00"
}
}
{
"message": "Datos de entrada inválidos",
"status": "ERROR",
"errors": {
"current_password": ["La contraseña actual es incorrecta"]
}
}
Terminal window
# Actualizar usuario (administrador)
curl -X PUT "https://dev-facturacion.e-dinky.test/api/v1/users/update" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"uuid": 123456789,
"name": "Juan Carlos",
"last_name": "Pérez González",
"email": "[email protected]",
"phone": "+593987654321"
}'
# Actualizar mi información
curl -X PUT "https://dev-facturacion.e-dinky.test/api/v1/users/update-my-information" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"name": "María Elena",
"last_name": "González Ruiz",
"phone": "+593998765432"
}'
# Cambiar contraseña
curl -X PUT "https://dev-facturacion.e-dinky.test/api/v1/users/update-my-information" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"current_password": "mi_password_actual",
"password": "nueva_password_segura123!"
}'
const validatePassword = (password) => {
const requirements = {
length: password.length >= 8,
uppercase: /[A-Z]/.test(password),
lowercase: /[a-z]/.test(password),
number: /\d/.test(password),
special: /[@$!%*?&]/.test(password)
};
const missing = Object.keys(requirements).filter(req => !requirements[req]);
if (missing.length > 0) {
throw new Error(`La contraseña debe cumplir: ${missing.join(', ')}`);
}
return true;
};
function validateUniqueEmail($email, $currentUserId = null) {
$filters = [['field' => 'email', 'condition' => 'eq', 'value' => $email]];
$users = searchUsers($filters);
if (!empty($users)) {
foreach ($users as $user) {
if ($user['uuid'] !== $currentUserId) {
throw new Exception('El email ya está en uso por otro usuario');
}
}
}
return true;
}
const validateInternationalPhone = (phone) => {
// Formato internacional: +[código país][número]
const phoneRegex = /^\+[1-9]\d{1,14}$/;
if (!phoneRegex.test(phone)) {
throw new Error('El teléfono debe estar en formato internacional (+593987654321)');
}
// Validaciones específicas por país
const countryValidations = {
'+593': /^\+593[0-9]{9}$/, // Ecuador
'+57': /^\+57[0-9]{10}$/, // Colombia
'+51': /^\+51[0-9]{9}$/, // Perú
};
const countryCode = phone.substring(0, 4);
if (countryValidations[countryCode] && !countryValidations[countryCode].test(phone)) {
throw new Error(`Formato de teléfono inválido para ${countryCode}`);
}
return true;
};
CódigoDescripciónAcción
201Actualización exitosaProcesar datos actualizados
400Datos inválidosRevisar formato de datos
401Token inválidoRenovar autenticación
403Sin permisosVerificar permisos de usuario
404Usuario no encontradoVerificar ID del usuario
422Errores de validaciónCorregir datos según errores
500Error del servidorReintentar más tarde
// Solo enviar campos que realmente cambiaron
const updateUserPartial = (userId, originalData, newData) => {
const changes = {};
Object.keys(newData).forEach(key => {
if (originalData[key] !== newData[key]) {
changes[key] = newData[key];
}
});
if (Object.keys(changes).length === 0) {
console.log('No hay cambios para actualizar');
return;
}
return updateUser(userId, changes);
};
// Confirmar cambios importantes como email o rol
function updateUserWithConfirmation($userId, $data, $confirmationToken = null) {
$criticalFields = ['email', 'role_id', 'status'];
$hasCriticalChanges = array_intersect(array_keys($data), $criticalFields);
if ($hasCriticalChanges && !$confirmationToken) {
throw new Exception('Se requiere confirmación para cambios críticos');
}
if ($confirmationToken) {
// Validar token de confirmación
validateConfirmationToken($confirmationToken, $userId);
}
return updateUser($userId, $data);
}
// Registrar cambios para auditoría
const updateUserWithHistory = async (userId, data) => {
// Obtener datos actuales
const currentUser = await getUserById(userId);
// Realizar actualización
const updatedUser = await updateUser(userId, data);
// Registrar cambios
const changes = Object.keys(data).map(field => ({
field,
old_value: currentUser[field],
new_value: data[field],
changed_at: new Date().toISOString(),
changed_by: getCurrentUserId()
}));
await logUserChanges(userId, changes);
return updatedUser;
};
// Validar campos mientras el usuario escribe
const validateFieldRealTime = async (field, value, userId = null) => {
const validators = {
email: async (email) => {
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
return 'Formato de email inválido';
}
// Verificar si está disponible
const isAvailable = await checkEmailAvailability(email, userId);
return isAvailable ? null : 'Email ya está en uso';
},
phone: (phone) => {
return /^\+[1-9]\d{1,14}$/.test(phone) ? null : 'Formato de teléfono inválido';
},
name: (name) => {
return (name.length >= 2 && name.length <= 50) ? null : 'Nombre debe tener entre 2 y 50 caracteres';
}
};
if (validators[field]) {
return await validators[field](value);
}
return null;
};
// Actualizar múltiples usuarios con los mismos cambios
function bulkUpdateUsers($userIds, $data) {
$results = [];
foreach ($userIds as $userId) {
try {
$result = updateUser($userId, $data);
$results['success'][] = $userId;
} catch (Exception $e) {
$results['failed'][] = [
'user_id' => $userId,
'error' => $e->getMessage()
];
}
}
return $results;
}
// Migrar datos de un sistema externo
const migrateUserData = async (externalUserData) => {
const mappedData = {
name: externalUserData.first_name,
last_name: externalUserData.last_name,
email: externalUserData.email_address,
phone: formatPhoneNumber(externalUserData.phone_number)
};
// Validar datos mapeados
const validationErrors = validateUserData(mappedData);
if (validationErrors) {
throw new Error(`Datos inválidos: ${JSON.stringify(validationErrors)}`);
}
return await updateUser(externalUserData.internal_id, mappedData);
};
// Sincronizar cambios con sistema externo
function syncUserUpdate($userId, $data) {
// Actualizar en sistema local
$localUser = updateUser($userId, $data);
// Sincronizar con sistema externo
try {
$externalResponse = syncWithExternalSystem($localUser);
if (!$externalResponse['success']) {
// Revertir cambios locales si falla la sincronización
rollbackUserUpdate($userId, $data);
throw new Exception('Error en sincronización externa');
}
} catch (Exception $e) {
error_log('Error sincronizando usuario: ' . $e->getMessage());
// Marcar para reintento posterior
markForRetrySync($userId, $data);
}
return $localUser;
}
  • 🔐 Seguridad: Validar permisos antes de actualizar
  • Validación: Implementar validación tanto local como del servidor
  • 📝 Auditoría: Registrar cambios importantes para auditoría
  • 🔄 Sincronización: Considerar sincronización con sistemas externos
  • 💾 Backup: Mantener respaldo antes de cambios críticos
  • 🚫 Restricciones: Algunos campos pueden tener restricciones especiales
  • 📧 Notificaciones: Notificar cambios importantes al usuario
  • 🔒 Contraseñas: Usar hash seguro para contraseñas
  • 📱 Tiempo real: Validar disponibilidad en tiempo real
  • 🎯 Parcial: Enviar solo campos modificados para eficiencia