import { createClientFromRequest } from "npm:@base44/sdk@0.8.41"; import { secrets } from "base44:runtime"; // Base44: base44/functions/dpia-scraper/entry.ts export default async function (req) { try { const base44 = createClientFromRequest(req); const user = await base44.auth.me().catch(() => null); if (!user) return Response.json({ success: false, error: "Inicia sesión" }, { status: 401 }); // Esta herramienta permite gastar saldo, publicar y eliminar archivos. if (user.role !== "admin") { return Response.json({ success: false, error: "Requiere administrador" }, { status: 403 }); } const input = await req.json(); const routes = { estado: ["GET", "/estado"], authCheck: ["GET", "/auth/check"], marketplaces: ["GET", "/marketplaces"], scrapingSheet: ["POST", "/scraping/sheet"], scrapingImagenes: ["POST", "/scraping/imagenes"], trabajos: ["GET", "/trabajos"], resultado: ["POST", "/trabajos/resultado"], leerArchivo: ["GET", "/archivos/"], eliminarArchivo: ["DELETE", "/archivos/"], relaciones: ["GET", "/relaciones"], amazon: ["POST", "/scraping/amazon"], ebay: ["POST", "/scraping/ebay"], aliexpress: ["POST", "/scraping/aliexpress"], mercadolibre: ["POST", "/scraping/mercadolibre"], imagenesAsin: ["POST", "/imagenes/asin"], publicar: ["POST", "/publicaciones"] }; const route = Object.hasOwn(routes, input.action) ? routes[input.action] : null; if (!route) return Response.json({ success: false, error: "Acción inválida" }, { status: 400 }); const base = secrets.get("SCRAPER_URL"); const key = secrets.get("SCRAPER_API_KEY"); if (!base || !key) { return Response.json({ success: false, error: "Configura SCRAPER_URL y SCRAPER_API_KEY" }, { status: 503 }); } const [method, path] = route; let suffix = path; if (input.action === "leerArchivo" || input.action === "eliminarArchivo") { if (typeof input.archivo !== "string" || !/^[^/\\\x00]+\.json$/.test(input.archivo)) { return Response.json({ success: false, error: "Nombre de archivo inválido" }, { status: 400 }); } suffix += encodeURIComponent(input.archivo); } const url = new URL(base.replace(/\/$/, "") + suffix); if (input.action === "trabajos") url.searchParams.set("lugar", input.lugar || "argentina"); if (input.action === "relaciones") url.searchParams.set("sheet_name", input.sheet_name || "argentina"); if (input.action === "authCheck") url.searchParams.set("permiso", input.permiso || "scraper:read"); const response = await fetch(url, { method, headers: { Authorization: `Bearer ${key}`, "Content-Type": "application/json" }, ...(method === "POST" ? { body: JSON.stringify(input.body || {}) } : {}) }); const text = await response.text(); let result; try { result = JSON.parse(text); } catch { return Response.json({ success: false, error: "El servidor no devolvió JSON" }, { status: 502 }); } return Response.json(result, { status: response.status }); } catch (error) { console.error("DPIA scraper:", error); return Response.json({ success: false, error: "No se pudo completar la petición" }, { status: 502 }); } }