Files
html/api/wire-conversion-tracking.sh
2026-04-19 19:20:03 +02:00

102 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# WEVAL — Wire Chatbot→Sales Conversion Tracking
# Crée table chatbot_conversions + API endpoint /api/chatbot-conversion-track.php
# Doctrine #5 zero écrasement — skip si déjà existant
set -euo pipefail
PG_PASS="admin123"
PG_HOST="10.1.0.3"
PG_USER="admin"
PG_DB="adx_system"
# 1. Créer table chatbot_conversions (idempotent)
psql_cmd() {
PGPASSWORD="$PG_PASS" timeout 10 psql -h "$PG_HOST" -U "$PG_USER" -d "$PG_DB" -c "$1" 2>&1
}
TABLE_EXISTS=$(PGPASSWORD="$PG_PASS" timeout 10 psql -h "$PG_HOST" -U "$PG_USER" -d "$PG_DB" -tAc "SELECT 1 FROM pg_tables WHERE tablename='chatbot_conversions'" 2>&1 || echo "")
if [ "$TABLE_EXISTS" != "1" ]; then
psql_cmd "CREATE TABLE IF NOT EXISTS chatbot_conversions (
id BIGSERIAL PRIMARY KEY,
session_id TEXT NOT NULL,
event TEXT NOT NULL,
vertical TEXT,
source TEXT,
data JSONB,
url TEXT,
referrer TEXT,
ip INET,
user_agent TEXT,
ts TIMESTAMPTZ DEFAULT NOW()
);"
psql_cmd "CREATE INDEX IF NOT EXISTS idx_chatbot_conv_session ON chatbot_conversions(session_id);"
psql_cmd "CREATE INDEX IF NOT EXISTS idx_chatbot_conv_vertical ON chatbot_conversions(vertical);"
psql_cmd "CREATE INDEX IF NOT EXISTS idx_chatbot_conv_event ON chatbot_conversions(event);"
psql_cmd "CREATE INDEX IF NOT EXISTS idx_chatbot_conv_ts ON chatbot_conversions(ts DESC);"
echo "TABLE_CREATED: chatbot_conversions with 4 indexes"
else
echo "TABLE_EXISTS: chatbot_conversions (skip creation — doctrine #5)"
fi
# 2. Créer API endpoint /api/chatbot-conversion-track.php
ENDPOINT="/var/www/html/api/chatbot-conversion-track.php"
if [ -f "$ENDPOINT" ]; then
echo "ENDPOINT_EXISTS: $ENDPOINT (skip — doctrine #5)"
else
cat > "$ENDPOINT" <<'PHP'
<?php
// WEVAL — Chatbot→Sales Conversion Tracking Endpoint
// Non-blocking insert + JSON response
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }
$input = json_decode(file_get_contents('php://input'), true) ?: [];
$event = $input['event'] ?? '';
$session_id = $input['session_id'] ?? ('anon-' . substr(md5(($_SERVER['REMOTE_ADDR']??'') . date('Ymd')), 0, 16));
$vertical = $input['vertical'] ?? null;
$source = $input['source'] ?? null;
$data = $input['data'] ?? null;
$url = $input['url'] ?? ($_SERVER['HTTP_REFERER'] ?? null);
$referrer = $input['referrer'] ?? null;
if (empty($event)) {
http_response_code(400);
echo json_encode(['ok' => false, 'error' => 'event required']);
exit;
}
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'] ?? ($_SERVER['HTTP_X_FORWARDED_FOR'] ?? ($_SERVER['REMOTE_ADDR'] ?? null));
if ($ip && strpos($ip, ',') !== false) $ip = trim(explode(',', $ip)[0]);
$ua = substr($_SERVER['HTTP_USER_AGENT'] ?? '', 0, 500);
try {
$pdo = new PDO('pgsql:host=10.1.0.3;port=5432;dbname=adx_system', 'admin', 'admin123', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_TIMEOUT => 3
]);
$stmt = $pdo->prepare('INSERT INTO chatbot_conversions (session_id, event, vertical, source, data, url, referrer, ip, user_agent) VALUES (?, ?, ?, ?, ?::jsonb, ?, ?, ?, ?)');
$stmt->execute([
$session_id, $event, $vertical, $source,
$data ? json_encode($data) : null,
$url, $referrer, $ip, $ua
]);
echo json_encode(['ok' => true, 'session_id' => $session_id, 'event' => $event]);
} catch (Exception $e) {
error_log('[chatbot-conv-track] ' . $e->getMessage());
echo json_encode(['ok' => false, 'error' => 'store_failed']);
}
PHP
chown www-data:www-data "$ENDPOINT"
chmod 644 "$ENDPOINT"
echo "ENDPOINT_CREATED: $ENDPOINT"
fi
# 3. Sanity check
COUNT=$(PGPASSWORD="$PG_PASS" timeout 10 psql -h "$PG_HOST" -U "$PG_USER" -d "$PG_DB" -tAc "SELECT COUNT(*) FROM chatbot_conversions" 2>&1 || echo "N/A")
echo "CONVERSIONS_STORED_COUNT: $COUNT"
echo "WIRE_OK"