Files
wevads-platform/scripts/opt__wevads-arsenal__public__api__shadow-responder.php
2026-02-26 04:53:11 +01:00

158 lines
5.7 KiB
PHP
Executable File

<?php
require_once("/opt/wevads/config/credentials.php");
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
$db_config = [
'host' => 'localhost',
'dbname' => 'wevads',
'user' => 'admin',
'password' => WEVADS_DB_PASS
];
try {
$pdo = new PDO(
"pgsql:host={$db_config['host']};dbname={$db_config['dbname']}",
$db_config['user'],
$db_config['password'],
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$pdo->exec("SET search_path TO admin, public;");
$action = $_GET['action'] ?? 'stats';
switch ($action) {
case 'inbox':
$stmt = $pdo->query("
SELECT * FROM admin.shadow_responses
WHERE direction = 'in' AND ai_response IS NULL
ORDER BY created_at DESC
LIMIT 30
");
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode([
'status' => 'success',
'data' => $data,
'count' => count($data),
'message' => 'Emails entrants à traiter'
]);
break;
case 'history':
$stmt = $pdo->query("
SELECT * FROM admin.shadow_responses
WHERE ai_response IS NOT NULL
ORDER BY created_at DESC
LIMIT 50
");
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode([
'status' => 'success',
'data' => $data,
'count' => count($data),
'message' => 'Historique des réponses'
]);
break;
case 'stats':
$stats = $pdo->query("
SELECT
COUNT(*) as total_in,
SUM(CASE WHEN ai_response IS NOT NULL THEN 1 ELSE 0 END) as auto_responded,
SUM(CASE WHEN converted = true THEN 1 ELSE 0 END) as converted,
ROUND(100.0 * SUM(CASE WHEN ai_response IS NOT NULL THEN 1 ELSE 0 END) / COUNT(*), 2) as auto_rate,
ROUND(100.0 * SUM(CASE WHEN converted = true THEN 1 ELSE 0 END) / COUNT(*), 2) as conversion_rate
FROM admin.shadow_responses
")->fetch(PDO::FETCH_ASSOC);
echo json_encode([
'status' => 'success',
'data' => $stats,
'summary' => 'Shadow Responder Statistics'
]);
break;
case 'respond':
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
$id = $input['id'] ?? null;
$response = $input['response'] ?? '';
if (!$id) {
echo json_encode(['status' => 'error', 'message' => 'ID requis']);
break;
}
$stmt = $pdo->prepare("
UPDATE admin.shadow_responses
SET ai_response = :response, ai_provider = 'deepseek'
WHERE id = :id
");
$stmt->execute([':response' => $response, ':id' => $id]);
echo json_encode([
'status' => 'success',
'message' => 'Réponse enregistrée',
'rows_updated' => $stmt->rowCount()
]);
}
break;
case 'auto_mode':
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
$enabled = $input['enabled'] ?? false;
// Simuler le stockage dans un fichier de config
$configFile = '/tmp/shadow_auto_mode.json';
file_put_contents($configFile, json_encode(['auto_mode' => $enabled, 'updated' => time()]));
echo json_encode([
'status' => 'success',
'message' => 'Mode auto ' . ($enabled ? 'activé' : 'désactivé'),
'auto_mode' => $enabled
]);
} else {
$configFile = '/tmp/shadow_auto_mode.json';
$config = file_exists($configFile) ? json_decode(file_get_contents($configFile), true) : ['auto_mode' => false];
echo json_encode([
'status' => 'success',
'auto_mode' => $config['auto_mode'] ?? false,
'updated' => $config['updated'] ?? null
]);
}
break;
default:
echo json_encode([
'status' => 'error',
'message' => 'Action non reconnue',
'available_actions' => [
'GET ?action=inbox' => 'Emails entrants à traiter',
'GET ?action=history' => 'Historique des réponses',
'GET ?action=stats' => 'Statistiques',
'POST ?action=respond' => 'Enregistrer une réponse IA',
'POST ?action=auto_mode' => 'Activer/désactiver mode auto'
]
]);
}
} catch (PDOException $e) {
echo json_encode([
'status' => 'error',
'message' => 'Erreur base de données: ' . $e->getMessage(),
'fallback' => [
'status' => 'shadow_fallback',
'inbox' => [
['id' => 1, 'lead_email' => 'test@example.com', 'subject' => 'Test']
],
'data' => ['total_in' => 15, 'auto_responded' => 8, 'converted' => 3]
]
]);
}
?>