false, 'message' => 'Falta el parámetro usuario_id']); exit(); } $stmt = $pdo->prepare(" SELECT id, dni, nombre, apellidos, email, telefono, rol, estado, fecha_registro, ultimo_acceso FROM usuarios WHERE id = :usuario_id LIMIT 1 "); $stmt->execute([':usuario_id' => $usuario_id]); $usuario = $stmt->fetch(); if (!$usuario) { http_response_code(404); echo json_encode(['success' => false, 'message' => 'Usuario no encontrado']); exit(); } echo json_encode([ 'success' => true, 'message' => 'Datos de usuario obtenidos correctamente', 'data' => $usuario ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); break; // ========================================== // 2. PUT: Actualizar datos del perfil // ========================================== case 'PUT': $input = json_decode(file_get_contents('php://input'), true); if (!isset($input['id']) || !isset($input['usuario_id'])) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Faltan campos obligatorios: id y usuario_id']); exit(); } $id = (int)$input['id']; $usuario_id = (int)$input['usuario_id']; // Seguridad: Verificar que el usuario solo puede modificar su propio perfil // (A menos que en el futuro añadas un rol de admin que pueda editar otros) if ($id !== $usuario_id) { http_response_code(403); echo json_encode(['success' => false, 'message' => 'No autorizado: solo puedes modificar tu propio perfil']); exit(); } // Construir la consulta de actualización dinámicamente $fields = []; $params = [':id' => $id]; if (isset($input['nombre'])) { $fields[] = "nombre = :nombre"; $params[':nombre'] = trim($input['nombre']); } if (isset($input['apellidos'])) { $fields[] = "apellidos = :apellidos"; $params[':apellidos'] = trim($input['apellidos']); } if (isset($input['telefono'])) { // Validar teléfono español if (!preg_match('/^[0-9]{9}$/', $input['telefono'])) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Formato de teléfono no válido']); exit(); } $fields[] = "telefono = :telefono"; $params[':telefono'] = trim($input['telefono']); } // Si envía una nueva contraseña/código de seguridad, la hasheamos if (isset($input['password'])) { if (strlen($input['password']) < 6) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'La contraseña debe tener al menos 6 caracteres']); exit(); } $fields[] = "password = :password"; $params[':password'] = password_hash($input['password'], PASSWORD_BCRYPT, ['cost' => 10]); } if (isset($input['codigo_seguridad'])) { if (strlen($input['codigo_seguridad']) < 4) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'El código de seguridad debe tener al menos 4 caracteres']); exit(); } $fields[] = "codigo_seguridad = :codigo_seguridad"; $params[':codigo_seguridad'] = password_hash($input['codigo_seguridad'], PASSWORD_BCRYPT, ['cost' => 10]); } if (empty($fields)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'No se proporcionaron campos para actualizar']); exit(); } $sql = "UPDATE usuarios SET " . implode(', ', $fields) . " WHERE id = :id"; $stmt = $pdo->prepare($sql); $stmt->execute($params); echo json_encode([ 'success' => true, 'message' => 'Perfil actualizado correctamente' ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); break; // ========================================== // Método no permitido // ========================================== default: http_response_code(405); echo json_encode(['success' => false, 'message' => 'Método no permitido. Use GET o PUT.']); break; } } catch (PDOException $e) { http_response_code(500); echo json_encode([ 'success' => false, 'message' => 'Error en el servidor', 'error' => $e->getMessage() ]); } ?>