diff --git a/server.js b/server.js index 5d0e527..3cfe94a 100644 --- a/server.js +++ b/server.js @@ -1912,6 +1912,41 @@ app.post("/providers/scraped", authMiddleware, async (req, res) => { } }); +// ========================================== +// 📤 OBTENER SERVICIOS PARA EL BUZÓN (RUTA GET - NO BORRAR) +// ========================================== +app.get("/providers/scraped", authMiddleware, async (req, res) => { + try { + const q = await pool.query(` + SELECT + s.*, + ap.token as active_token, + EXTRACT(EPOCH FROM (ap.expires_at - CURRENT_TIMESTAMP)) as seconds_left, + u.full_name as current_worker_name, + (SELECT json_agg(json_build_object('name', u2.full_name, 'phone', u2.phone)) + FROM assignment_pings ap2 + JOIN users u2 ON ap2.user_id = u2.id + WHERE ap2.scraped_id = s.id AND ap2.status IN ('expired', 'rejected')) as attempted_workers_data + FROM scraped_services s + LEFT JOIN assignment_pings ap ON s.id = ap.scraped_id AND ap.status = 'pending' + LEFT JOIN users u ON ap.user_id = u.id + WHERE s.owner_id = $1 + ORDER BY s.created_at DESC + `, [req.user.accountId]); + + const services = q.rows.map(row => { + if (row.seconds_left && row.seconds_left > 0) { + row.token_expires_at = new Date(Date.now() + (row.seconds_left * 1000)); + } else if (row.seconds_left <= 0) { + row.token_expires_at = new Date(Date.now() - 1000); + } + delete row.seconds_left; + return row; + }); + res.json({ ok: true, services }); + } catch (e) { res.status(500).json({ ok: false }); } +}); + // ========================================== // 🤖 RUTA DE AUTOMATIZACIÓN (MEJORADA) // ==========================================