false, 'error' => 'Método no permitido']); exit; } try { $userId = intval($_GET['user_id'] ?? 0); $status = trim($_GET['status'] ?? ''); if (!$userId) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'Se requiere user_id']); exit; } $db = Database::getInstance(); // Obtener solicitudes $sql = "SELECT fr.*, CASE WHEN fr.expires_at < NOW() AND fr.status = 'pending' THEN 'expired' ELSE fr.status END as effective_status, (SELECT COUNT(*) FROM file_request_uploads fru WHERE fru.request_id = fr.id) as upload_count FROM file_requests fr WHERE fr.user_id = ?"; $params = [$userId]; if (!empty($status)) { if ($status === 'active') { $sql .= " AND fr.status IN ('pending','uploaded') AND fr.expires_at > NOW()"; } else { $sql .= " AND fr.status = ?"; $params[] = $status; } } $sql .= " ORDER BY fr.created_at DESC LIMIT 20"; $requests = $db->fetchAll($sql, $params); // Obtener uploads de las solicitudes $uploads = []; $requestIds = array_column($requests, 'id'); if (!empty($requestIds)) { $placeholders = implode(',', array_fill(0, count($requestIds), '?')); $uploads = $db->fetchAll( "SELECT fru.*, fr.token as request_token FROM file_request_uploads fru JOIN file_requests fr ON fru.request_id = fr.id WHERE fru.request_id IN ({$placeholders}) ORDER BY fru.created_at DESC", $requestIds ); // Agregar URLs públicas $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'; $appUrl = $protocol . '://' . $_SERVER['HTTP_HOST']; foreach ($uploads as &$upload) { $upload['file_url'] = $appUrl . '/' . $upload['file_path']; $upload['thumb_url'] = $upload['thumbnail_path'] ? $appUrl . '/' . $upload['thumbnail_path'] : null; } } echo json_encode([ 'success' => true, 'requests' => $requests, 'uploads' => $uploads, ]); } catch (Exception $e) { error_log('Error en get_file_requests: ' . $e->getMessage()); http_response_code(500); echo json_encode(['success' => false, 'error' => 'Error interno']); }