Initial commit — Serveur Lucas SmartEye

API réception alertes chute (SmartEye/YOLO), analyse IA (Gemini 2.5 Flash),
gestion alertes avec escalade (watchdog), notifications Firebase,
dashboard web, documentation MkDocs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Debian
2026-03-14 21:26:06 +01:00
commit 24dbc7cd6a
64 changed files with 9677 additions and 0 deletions

90
register_token.php Normal file
View File

@@ -0,0 +1,90 @@
<?php
/**
* register_token.php — Enregistrement token FCM
*
* Appelé par LucasApp au premier lancement ou lors d'un refresh token.
* Ajoute le token FCM à la liste des tokens du client (dédupliqué).
*
* POST /register_token.php
* Content-Type: application/json
* {"client_id": "Demo_01", "fcm_token": "fheHxy..."}
*/
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; }
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
die(json_encode(["success" => false, "message" => "Méthode non autorisée"]));
}
$input = json_decode(file_get_contents("php://input"), true);
$client_id = $input['client_id'] ?? '';
$fcm_token = $input['fcm_token'] ?? '';
$password = $input['password'] ?? '';
if (empty($client_id) || empty($fcm_token) || empty($password)) {
http_response_code(400);
die(json_encode(["success" => false, "message" => "client_id, fcm_token et password requis"]));
}
$DB_FILE = "database.json";
$db = json_decode(file_get_contents($DB_FILE), true);
if (!$db || !isset($db['clients'])) {
http_response_code(500);
die(json_encode(["success" => false, "message" => "Base de données introuvable"]));
}
// Trouver le client par name
$found_key = null;
foreach ($db['clients'] as $key => $c) {
if (strcasecmp($c['name'] ?? '', $client_id) === 0) {
$found_key = $key;
break;
}
}
if ($found_key === null) {
http_response_code(404);
die(json_encode(["success" => false, "message" => "Client inconnu"]));
}
// Vérification mot de passe (bcrypt)
$password_hash = $db['clients'][$found_key]['password_hash'] ?? null;
if ($password_hash === null) {
http_response_code(403);
die(json_encode(["success" => false, "message" => "Compte non configuré"]));
}
if (!password_verify($password, $password_hash)) {
http_response_code(401);
die(json_encode(["success" => false, "message" => "Mot de passe incorrect"]));
}
// Initialiser fcm_tokens si absent
if (!isset($db['clients'][$found_key]['fcm_tokens'])) {
$db['clients'][$found_key]['fcm_tokens'] = [];
}
// Dédupliquer
if (!in_array($fcm_token, $db['clients'][$found_key]['fcm_tokens'])) {
$db['clients'][$found_key]['fcm_tokens'][] = $fcm_token;
file_put_contents($DB_FILE, json_encode($db, JSON_PRETTY_PRINT));
$cameras = [];
foreach ($db['clients'][$found_key]['cameras'] ?? [] as $cam) {
if (!empty($cam['port_rtsp'])) {
$cameras[] = ["name" => $cam['marque'] . ' ' . $cam['modele'], "rtsp_port" => (int)$cam['port_rtsp']];
}
}
echo json_encode(["success" => true, "message" => "Token enregistré", "smarteye_token" => $db['clients'][$found_key]['token'] ?? '', "jetson_ip" => $db['clients'][$found_key]['jetson_ip'] ?? '', "server_ip" => "57.128.74.87", "cameras" => $cameras]);
} else {
$cameras = [];
foreach ($db['clients'][$found_key]['cameras'] ?? [] as $cam) {
if (!empty($cam['port_rtsp'])) {
$cameras[] = ["name" => $cam['marque'] . ' ' . $cam['modele'], "rtsp_port" => (int)$cam['port_rtsp']];
}
}
echo json_encode(["success" => true, "message" => "Token déjà enregistré", "smarteye_token" => $db['clients'][$found_key]['token'] ?? '', "jetson_ip" => $db['clients'][$found_key]['jetson_ip'] ?? '', "server_ip" => "57.128.74.87", "cameras" => $cameras]);
}
?>