up
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
/**
|
||||
* POST /api/lab/save_lab_user.php
|
||||
* Crea o actualiza un usuario del sistema.
|
||||
* Solo admins.
|
||||
*
|
||||
* Body JSON:
|
||||
* { id?, username, full_name, email?, password?, role_id, is_active?, enfermera_id? }
|
||||
*/
|
||||
require_once __DIR__ . '/_helpers.php';
|
||||
requireMethod('POST');
|
||||
requireAdmin();
|
||||
|
||||
$body = inputJson();
|
||||
$id = isset($body['id']) ? (int)$body['id'] : null;
|
||||
$username = trim($body['username'] ?? '');
|
||||
$fullName = trim($body['full_name'] ?? '');
|
||||
$email = trim($body['email'] ?? '');
|
||||
$password = $body['password'] ?? '';
|
||||
$roleId = isset($body['role_id']) ? (int)$body['role_id'] : null;
|
||||
$isActive = isset($body['is_active']) ? (int)(bool)$body['is_active'] : 1;
|
||||
$enfermeraId = isset($body['enfermera_id']) && $body['enfermera_id'] !== '' && $body['enfermera_id'] !== null
|
||||
? (int)$body['enfermera_id'] : null;
|
||||
|
||||
if (!$username) jsonError('El nombre de usuario es obligatorio');
|
||||
if (!$fullName) jsonError('El nombre completo es obligatorio');
|
||||
if (!$roleId) jsonError('Debes seleccionar un rol');
|
||||
|
||||
// Validar username (solo alfanumérico + guión bajo)
|
||||
if (!preg_match('/^[a-zA-Z0-9_\.]{3,50}$/', $username)) {
|
||||
jsonError('El username solo puede tener letras, números, puntos y guiones bajos (3-50 caracteres)');
|
||||
}
|
||||
|
||||
$db = Database::getInstance();
|
||||
|
||||
// Obtener slug del rol
|
||||
$role = $db->fetch("SELECT id, slug FROM roles WHERE id = ?", [$roleId]);
|
||||
if (!$role) jsonError('Rol no encontrado', 404);
|
||||
$roleSlug = $role['slug'];
|
||||
|
||||
// Si el rol es enfermero y no hay enfermera_id, buscar si tiene ya uno vinculado
|
||||
// (se puede crear sin vincular y vincularlo después desde la pantalla de Enfermeras)
|
||||
|
||||
if ($id) {
|
||||
// ── Actualizar ──────────────────────────────────────────
|
||||
$existing = $db->fetch("SELECT id, username FROM admin_users WHERE id = ?", [$id]);
|
||||
if (!$existing) jsonError('Usuario no encontrado', 404);
|
||||
|
||||
// Verificar duplicado de username (excluir el propio)
|
||||
$dup = $db->fetch("SELECT id FROM admin_users WHERE username = ? AND id != ?", [$username, $id]);
|
||||
if ($dup) jsonError('Ese nombre de usuario ya está en uso');
|
||||
|
||||
$params = [$username, $fullName, $email ?: null, $roleId, $roleSlug, $isActive, $enfermeraId, $id];
|
||||
$sql = "UPDATE admin_users
|
||||
SET username=?, full_name=?, email=?, role_id=?, role=?, is_active=?, enfermera_id=?, updated_at=NOW()
|
||||
WHERE id=?";
|
||||
|
||||
if ($password) {
|
||||
if (strlen($password) < 6) jsonError('La contraseña debe tener al menos 6 caracteres');
|
||||
$hash = password_hash($password, PASSWORD_BCRYPT);
|
||||
$sql = "UPDATE admin_users
|
||||
SET username=?, full_name=?, email=?, role_id=?, role=?, is_active=?, enfermera_id=?, password_hash=?, updated_at=NOW()
|
||||
WHERE id=?";
|
||||
$params = [$username, $fullName, $email ?: null, $roleId, $roleSlug, $isActive, $enfermeraId, $hash, $id];
|
||||
}
|
||||
|
||||
$db->query($sql, $params);
|
||||
jsonOk(['id' => $id], 'Usuario actualizado correctamente');
|
||||
|
||||
} else {
|
||||
// ── Crear ────────────────────────────────────────────────
|
||||
if (!$password) jsonError('La contraseña es obligatoria al crear un usuario');
|
||||
if (strlen($password) < 6) jsonError('La contraseña debe tener al menos 6 caracteres');
|
||||
|
||||
$dup = $db->fetch("SELECT id FROM admin_users WHERE username = ?", [$username]);
|
||||
if ($dup) jsonError('Ese nombre de usuario ya está en uso');
|
||||
|
||||
$hash = password_hash($password, PASSWORD_BCRYPT);
|
||||
|
||||
$db->query(
|
||||
"INSERT INTO admin_users (username, full_name, email, password_hash, role_id, role, is_active, enfermera_id)
|
||||
VALUES (?,?,?,?,?,?,?,?)",
|
||||
[$username, $fullName, $email ?: null, $hash, $roleId, $roleSlug, $isActive, $enfermeraId]
|
||||
);
|
||||
$newId = $db->lastInsertId();
|
||||
jsonOk(['id' => $newId], 'Usuario creado correctamente');
|
||||
}
|
||||
Reference in New Issue
Block a user