Files
tripz-llc/backend/marketing_engine/index.php
T
Hamza-AyedandClaude Opus 5 4d8414c96b feat: استيراد كود سيرو إلى تريبز (سيرو @ecfe7568) — بلا تعديل
قرار المالك 2026-07-27: باك إند سيرو PHP هو المعتمد، وتطبيقاته المجرّبة
ميدانياً تحل محل إعادة البناء المؤرشفة. سيرو نفسه لم يُمسّ.

الخريطة:
  backend · payment_server · loction_server · ride_server ·
  passenger_server · docker · dashboard · stress_test  → الجذر
  siro_rider  → apps/rider          siro_driver  → apps/driver
  siro_admin  → dashboards/admin    siro_service → dashboards/service
  android_bot → apps/android_bot    socialBot    → apps/socialBot

نُسخ المتعقَّب في git سيرو فقط عبر `git archive` (3,198 ملفاً / ~169 م.ب)
لا `cp -r` — فاستُثنيت مخلفات البناء تلقائياً. بلا أي تعديل محتوى عمداً:
كل ما يلي يصير فرقاً مقروءاً مقابل المصدر.

لم يُستورد وسببه: siromove.com (الموقع التسويقي يبقى marketing/ في تريبز،
سيرو فيه 8 ملفات) · docs و planning (تريبز له docs/ الخاص) · deploy.sh
(ليس نشراً على سيرفر بل `git add . && git push origin --all` — فخّ في
مستودع آخر) · transit_dashboard (بانتظار قرار مصير backend-transit و
dashboards/transit-web).

⚠️ لا يبني بعد — ثلاثة نواقص متوقعة ومقصودة:
1. `.env` و `lib/env/env.g.dart` غير متعقَّبين في سيرو (أسرار لكل مستأجر):
   كل تطبيق فلاتر يحتاج .env خاصاً ثم توليد env.g.dart بـ build_runner.
2. إعدادات Firebase (9 ملفات google-services.json و GoogleService-Info.plist)
   يستبعدها .gitignore تريبز — ولكل مستأجر مشروع Firebase خاص أصلاً.
3. apps/driver في سيرو يشير إلى `../../Intaleq/packages/get` خارج المستودع →
   يجب ضمّ الحزم داخله أسوة بـ apps/rider.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 05:14:13 +03:00

131 lines
4.9 KiB
PHP

<?php
// ============================================================
// marketing_engine/index.php
// Main API endpoint for the Marketing Microservice
// ============================================================
require_once __DIR__ . '/../core/bootstrap.php';
require_once __DIR__ . '/../functions.php';
require_once __DIR__ . '/../core/Services/SiroGeminiService.php';
require_once __DIR__ . '/../core/Services/FcmService.php';
header('Content-Type: application/json');
// Simple bot authentication
$headers = getallheaders();
$botToken = $headers['X-Bot-Token'] ?? '';
// if ($botToken !== 'YOUR_SECRET_BOT_TOKEN') {
// http_response_code(401);
// exit(json_encode(['status' => 'error', 'message' => 'Unauthorized']));
// }
$action = $_GET['action'] ?? '';
$platform = $_GET['platform'] ?? 'facebook';
try {
$con = Database::get('main');
switch ($action) {
case 'get_task':
$stmt = $con->prepare("
SELECT id, type, target_url
FROM marketing_tasks
WHERE status = 'pending' AND platform = ?
ORDER BY id ASC LIMIT 1
");
$stmt->execute([$platform]);
$task = $stmt->fetch(PDO::FETCH_ASSOC);
if ($task) {
$update = $con->prepare("UPDATE marketing_tasks SET status = 'in_progress' WHERE id = ?");
$update->execute([$task['id']]);
echo json_encode(['status' => 'success', 'data' => $task]);
} else {
echo json_encode(['status' => 'success', 'message' => 'No tasks available', 'data' => null]);
}
break;
case 'complete_task':
$taskId = $_POST['task_id'] ?? null;
$result = $_POST['result'] ?? '';
if ($taskId) {
$stmt = $con->prepare("UPDATE marketing_tasks SET status = 'completed', completed_at = NOW() WHERE id = ?");
$stmt->execute([$taskId]);
echo json_encode(['status' => 'success']);
} else {
echo json_encode(['status' => 'error', 'message' => 'task_id required']);
}
break;
case 'fail_task':
$taskId = $_POST['task_id'] ?? null;
$errorMsg = $_POST['error_message'] ?? 'Unknown error';
if ($taskId) {
$stmt = $con->prepare("UPDATE marketing_tasks SET status = 'failed', error_message = ? WHERE id = ?");
$stmt->execute([$errorMsg, $taskId]);
echo json_encode(['status' => 'success']);
} else {
echo json_encode(['status' => 'error', 'message' => 'task_id required']);
}
break;
case 'evaluate_posts':
$input = json_decode(file_get_contents('php://input'), true);
$posts = $input['posts'] ?? [];
if (empty($posts)) {
echo json_encode(['status' => 'success', 'data' => null]);
break;
}
$gemini = new SiroGeminiService();
$reportHtml = $gemini->evaluatePostsForReporting($posts);
if ($reportHtml) {
// Save to database
$stmt = $con->prepare("INSERT INTO marketing_reports (platform, report_html) VALUES (?, ?)");
$stmt->execute([$platform, $reportHtml]);
$reportId = $con->lastInsertId();
// Send FCM notification to admins
$fcm = new FcmService();
$fcm->send(
token: '/topics/admin_alerts',
title: 'New Social Media Intelligence Report 📊',
body: "A new autonomous analysis report for {$platform} has been generated.",
data: [
'type' => 'marketing_report',
'report_id' => $reportId,
'platform' => $platform
],
category: 'marketing_report'
);
}
echo json_encode(['status' => 'success', 'message' => 'Posts evaluated and report saved']);
break;
case 'get_reports':
$stmt = $con->prepare("
SELECT id, platform, report_html, is_weekly, created_at
FROM marketing_reports
ORDER BY created_at DESC
LIMIT 50
");
$stmt->execute();
$reports = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode(['status' => 'success', 'data' => $reports]);
break;
default:
echo json_encode(['status' => 'error', 'message' => 'Invalid action']);
}
} catch (Exception $e) {
http_response_code(500);
echo json_encode(['status' => 'error', 'message' => 'Server error: ' . $e->getMessage()]);
}