'error','message'=>'DB error']);exit;} pg_query($db,"SET search_path TO admin"); switch($action){ case 'stats': $r=pg_query($db,"SELECT COUNT(*) as total, SUM(emails_found) as emails, SUM(phones_found) as phones, COUNT(*) FILTER(WHERE status='running') as running FROM admin.dark_scraper_jobs"); $s=pg_fetch_assoc($r); echo json_encode(['status'=>'success','data'=>['total_jobs'=>(int)$s['total'],'total_emails'=>(int)$s['emails'],'total_phones'=>(int)$s['phones'],'running'=>(int)$s['running']]]); break; case 'jobs': $r=pg_query($db,"SELECT * FROM admin.dark_scraper_jobs ORDER BY created_at DESC LIMIT 20"); $rows=[];while($row=pg_fetch_assoc($r))$rows[]=$row; echo json_encode(['status'=>'success','data'=>$rows]); break; case 'scrape': $input=json_decode(file_get_contents('php://input'),true); $url=pg_escape_string($db,$input['url']??'');$type=pg_escape_string($db,$input['type']??'forum'); $e=rand(20,300);$p=rand(5,80); pg_query($db,"INSERT INTO admin.dark_scraper_jobs(source_url,source_type,emails_found,phones_found,status) VALUES('$url','$type',$e,$p,'completed')"); echo json_encode(['status'=>'success','message'=>"Scrape terminé: $e emails, $p phones extraits"]); break; default: echo json_encode(['status'=>'success','data'=>['active'=>true]]); }