Files
html/api/send-controller.php
2026-04-12 22:57:03 +02:00

84 lines
4.9 KiB
PHP

<?php
require_once __DIR__ . '/_secrets.php';
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$action = $_GET['action'] ?? $_POST['action'] ?? 'status';
$token = $_GET['token'] ?? $_POST['token'] ?? '';
if (!in_array($token, ['WEVADS2026','ETHICA_API_2026_SECURE'])) die(json_encode(['error'=>'token']));
$rf = '/tmp/wevads_send_rate_' . date('YmdH');
$rate = file_exists($rf) ? (int)file_get_contents($rf) : 0;
$MX = 100;
try { $db = new PDO('pgsql:host=10.1.0.3;port=5432;dbname=adx_system','admin',weval_secret('WEVAL_PG_ADMIN_PASS'),[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_TIMEOUT=>5]); $db->exec("SET search_path TO admin"); } catch(Exception $e) { die(json_encode(['error'=>$e->getMessage()])); }
function v2e_send($to, $subject, $html, $method, $from_name) {
$ch = curl_init('http://127.0.0.1/api/wevads-v2-engine.php?action=send_test&token=WEVADS2026');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['to'=>$to,'subject'=>$subject,'html'=>$html,'method'=>$method,'from_name'=>$from_name]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
$r = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (!$r) return ['status'=>'error','error'=>'V2E unreachable'];
$j = json_decode($r, true);
return $j ?: ['status'=>'error','error'=>'Invalid V2E response'];
}
switch($action) {
case 'status':
$gs=(int)$db->query("SELECT COUNT(*) FROM graph_accounts WHERE can_send=true")->fetchColumn();
$st=(int)$db->query("SELECT COUNT(*) FROM brain_seeds")->fetchColumn();
$ls=$db->query("SELECT MAX(created_at) FROM graph_send_log")->fetchColumn();
$ts=(int)$db->query("SELECT COUNT(*) FROM graph_send_log")->fetchColumn();
$td=(int)$db->query("SELECT COUNT(*) FROM graph_send_log WHERE created_at::date=CURRENT_DATE")->fetchColumn();
$cp=(int)$db->query("SELECT COUNT(*) FROM campaigns WHERE status='paused'")->fetchColumn();
$ca=(int)$db->query("SELECT COUNT(*) FROM campaigns WHERE status='active'")->fetchColumn();
$sq=(int)$db->query("SELECT COUNT(*) FROM send_queue")->fetchColumn();
echo json_encode(['ok'=>1,'controller'=>'v1.0','auto_mode'=>file_exists('/tmp/wevads_auto_mode'),'safety'=>['rate_this_hour'=>$rate,'max_per_hour'=>$MX,'dangerous_crons_disabled'=>true],'graph'=>['senders_available'=>$gs,'seeds_total'=>$st,'total_sent_alltime'=>$ts,'sent_today'=>$td,'last_send'=>$ls],'campaigns'=>['active'=>$ca,'paused'=>$cp,'queue'=>$sq],'pmta'=>true]);
break;
case 'seed_test':
if($rate>=$MX)die(json_encode(['error'=>"Rate: $rate/$MX"]));
$to=$_POST['to']??$_GET['to']??'';
$su=$_POST['subject']??$_GET['subject']??'Test '.date('H:i');
$ht=$_POST['html']??$_GET['html']??'<p>Test</p>';
$fn=$_POST['from_name']??$_GET['from_name']??'WEVAL';
$me=$_POST['method']??$_GET['method']??'PMTA_Direct';
$li=min((int)($_POST['limit']??$_GET['limit']??1),10);
if(!$to)die(json_encode(['error'=>'to required']));
$rcpts=array_slice(array_map('trim',explode(',',$to)),0,$li);
$res=[];
foreach($rcpts as $r) {
$sr = v2e_send($r, $su, $ht, $me, $fn);
$ok = !empty($sr['sent']) || !empty($sr['ok']);
$res[] = ['to'=>$r,'method'=>$me,'status'=>$ok?'sent':'error','tracking_id'=>$sr['tracking_id']??'','response'=>$sr['detail']['response']??($sr['error']??'')];
if($ok) file_put_contents($rf, ++$rate);
}
echo json_encode(['ok'=>1,'method'=>$me,'results'=>$res,'rate'=>"$rate/$MX"]);
break;
case 'seed_check':
$rc=[];foreach($db->query("SELECT sender_email,recipient_email,recipient_isp,subject,status,created_at FROM graph_send_log ORDER BY created_at DESC LIMIT 10") as $r)$rc[]=$r;
echo json_encode(['ok'=>1,'recent'=>$rc]);break;
case 'campaign_pause':
$id=(int)($_POST['campaign_id']??$_GET['campaign_id']??0);
if($id)$db->prepare("UPDATE campaigns SET status='paused' WHERE id=?")->execute([$id]);
else $db->exec("UPDATE campaigns SET status='paused' WHERE status IN('sending','active')");
echo json_encode(['ok'=>1,'paused'=>true]);break;
case 'campaign_resume':
$id=(int)($_POST['campaign_id']??$_GET['campaign_id']??0);
if(!$id)die(json_encode(['error'=>'id']));
$db->prepare("UPDATE campaigns SET status='active' WHERE id=?")->execute([$id]);
echo json_encode(['ok'=>1,'resumed'=>$id]);break;
case 'campaigns_list':
$c=[];foreach($db->query("SELECT id,name,status,created_at FROM campaigns ORDER BY id DESC LIMIT 30") as $r)$c[]=$r;
echo json_encode(['ok'=>1,'campaigns'=>$c]);break;
case 'auto_toggle':
$f='/tmp/wevads_auto_mode';
if(file_exists($f)){unlink($f);echo json_encode(['ok'=>1,'auto_mode'=>false]);}
else{file_put_contents($f,date('c'));echo json_encode(['ok'=>1,'auto_mode'=>true]);}
break;
default:
echo json_encode(['actions'=>['status','seed_test','seed_check','campaign_pause','campaign_resume','campaigns_list','auto_toggle']]);
}