Files
html/api/wevads-p4-api.php
opus c85e452edb
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
auto-commit via WEVIA vault_git intent 2026-04-20T00:44:13+00:00
2026-04-20 02:44:13 +02:00

77 lines
5.2 KiB
PHP

<?php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$token=$_GET['token']??'';
if(!in_array($token,['WEVADS2026','ETHICA_API_2026_SECURE']))die(json_encode(['error'=>'auth']));
$action=$_GET['action']??'';
function s95db(){static $p;if(!$p)$p=new PDO("pgsql:host=10.1.0.3;port=5432;dbname=adx_system","admin","admin123");$p->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);return $p;}
function qa($db,$q){return $db->query($q)->fetchAll(PDO::FETCH_ASSOC);}
function q1($db,$q){return $db->query($q)->fetch(PDO::FETCH_ASSOC);}
function ok($d){echo json_encode(array_merge(['ok'=>1],$d));exit;}
switch($action){
case 'webhooks':
$db=s95db();
$tracking=[]; try{$tracking=qa($db,"SELECT event_type, COUNT(*) as cnt FROM tracking_events GROUP BY event_type ORDER BY cnt DESC");}catch(\Exception $e){}
$conversions=0; try{$conversions=(int)q1($db,"SELECT COUNT(*) as c FROM conversion_events")['c'];}catch(\Exception $e){}
$postbacks=0; try{$postbacks=(int)q1($db,"SELECT COUNT(*) as c FROM postback_log")['c'];}catch(\Exception $e){}
$endpoints=[
['name'=>'Tracking Pixel','url'=>'culturellemejean.charity/api/track.php','events'=>['open','click','unsub'],'status'=>'active'],
['name'=>'Conversion Collector','url'=>'weval-consulting.com/api/conversions-collector','events'=>['conversion'],'status'=>'active','cron'=>'*/30'],
['name'=>'Consent Webhook','url'=>'consent.wevup.app','events'=>['accept','reject'],'status'=>'active'],
['name'=>'Tracking Relay','url'=>'weval-consulting.com/api/tracking-relay.php','events'=>['open','click'],'status'=>'active'],
['name'=>'Bounce Processor','url'=>'localhost:5821/api/bounce-processor.php','events'=>['bounce','complaint'],'status'=>'active','cron'=>'*/15'],
];
ok(['endpoints'=>$endpoints,'tracking_events'=>$tracking,'conversions'=>$conversions,'postbacks'=>$postbacks]);
break;
case 'n8n':
// N8N status via API
$n8n_url='http://localhost:5678';
$n8n_ok=false;$workflows=0;$executions=0;
$ch=@curl_init("$n8n_url/healthz");
if($ch){curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>1,CURLOPT_TIMEOUT=>5]);$r=@curl_exec($ch);$code=curl_getinfo($ch,CURLINFO_HTTP_CODE);curl_close($ch);
if($code==200){$n8n_ok=true;$d=@json_decode($r,true);$workflows=count($d['data']??[]);}}
// Integrations available
$integrations=[
['name'=>'Brain Pipeline','type'=>'cron','status'=>'monitoring','desc'=>'Check+Score brain configs'],
['name'=>'Ethica Scrapers','type'=>'cron','status'=>'active','desc'=>'20 scrapers 36 crons'],
['name'=>'Conversions Collector','type'=>'webhook','status'=>'active','desc'=>'CAKE+Everflow pull'],
['name'=>'Auto-Ops','type'=>'cron','status'=>'active','desc'=>'Reputation+Domain+Analytics */2h'],
['name'=>'Bounce Processor','type'=>'cron','status'=>'active','desc'=>'Process bounces */15'],
['name'=>'WEVIA LIFE','type'=>'imap','status'=>'active','desc'=>'Email classifier */30'],
['name'=>'Listmonk','type'=>'api','status'=>'standby','desc'=>'Newsletter API port 9000'],
];
ok(['n8n_status'=>$n8n_ok?'UP':'DOWN','workflows'=>$workflows,'integrations'=>$integrations]);
break;
case 'leadscore':
$db=s95db();
$total=0;$scored=0;$tiers=[];
try{$total=(int)q1($db,"SELECT COUNT(*) as c FROM admin.send_contacts")['c'];}catch(\Exception $e){}
try{$scored=(int)q1($db,"SELECT COUNT(*) as c FROM admin.send_contacts WHERE score IS NOT NULL")['c'];}catch(\Exception $e){}
try{$tiers=qa($db,"SELECT CASE WHEN score>=80 THEN 'Hot' WHEN score>=60 THEN 'Warm' WHEN score>=40 THEN 'Cold' ELSE 'Dead' END as tier, COUNT(*) as cnt, ROUND(AVG(score),1) as avg_score FROM admin.send_contacts WHERE score IS NOT NULL GROUP BY 1 ORDER BY avg_score DESC");}catch(\Exception $e){}
$sources=[]; try{$sources=qa($db,"SELECT COALESCE(source,'unknown') as source, COUNT(*) as cnt FROM admin.send_contacts GROUP BY 1 ORDER BY cnt DESC LIMIT 10");}catch(\Exception $e){}
ok(['total'=>$total,'scored'=>$scored,'score_rate'=>$total>0?round(($scored/$total)*100,1):0,'tiers'=>$tiers,'sources'=>$sources]);
break;
case 'newsletter':
// Listmonk status
$lm_ok=false;$lists=0;$subs=0;$campaigns=0;
$ch=@curl_init('http://10.1.0.3:9000/api/lists');
if($ch){curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>1,CURLOPT_TIMEOUT=>5,CURLOPT_HTTPHEADER=>['Authorization: Basic '.base64_encode('admin:WEVALlistmonk2026')]]);
$r=@curl_exec($ch);$code=curl_getinfo($ch,CURLINFO_HTTP_CODE);curl_close($ch);
if($code==200){$lm_ok=true;$d=@json_decode($r,true);$lists=count($d['data']['results']??[]);}}
ok(['listmonk_status'=>$lm_ok?'UP':'DOWN','lists'=>$lists,
'tools'=>[
['name'=>'Listmonk','type'=>'Newsletter','status'=>$lm_ok?'UP':'DOWN','port'=>9000,'admin'=>'admin'],
['name'=>'PMTA','type'=>'SMTP Relay','status'=>'UP','port'=>25],
['name'=>'KumoMTA','type'=>'SMTP','status'=>'UP','port'=>587],
['name'=>'Brain Creative','type'=>'AI Copywriting','status'=>'available'],
['name'=>'Spintax Engine','type'=>'Content Variation','status'=>'available'],
]]);
break;
default:ok(['actions'=>['webhooks','n8n','leadscore','newsletter']]);
}