Sauvegarde vers le serveur
This commit is contained in:
85
public/sync_global.php
Normal file
85
public/sync_global.php
Normal file
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
|
||||
// 1. Récupération du Token dans les Headers
|
||||
$headers = getallheaders();
|
||||
$authHeader = $headers['Authorization'] ?? '';
|
||||
|
||||
if (!preg_match('/Bearer\s(\S+)/', $authHeader, $matches)) {
|
||||
die(json_encode(['status' => 'error', 'message' => 'Non authentifié']));
|
||||
}
|
||||
|
||||
$token = $matches[1];
|
||||
|
||||
// 2. Décodage du Payload du JWT
|
||||
$tokenParts = explode('.', $token);
|
||||
if (count($tokenParts) < 2) {
|
||||
die(json_encode(['status' => 'error', 'message' => 'Format Token invalide']));
|
||||
}
|
||||
|
||||
$payloadJson = base64_decode(str_replace(['-', '_'], ['+', '/'], $tokenParts[1]));
|
||||
$payload = json_decode($payloadJson, true);
|
||||
|
||||
// Nettoyage du login pour le nom du dossier
|
||||
$userLogin = preg_replace('/[^a-zA-Z0-9\-\.]/', '', $payload['preferred_username'] ?? $payload['sub'] ?? '');
|
||||
|
||||
if (empty($userLogin)) {
|
||||
die(json_encode(['status' => 'error', 'message' => 'Login non trouvé']));
|
||||
}
|
||||
|
||||
// 3. Définition du chemin (vérifie que ce dossier est accessible en écriture)
|
||||
$userDir = $_SERVER['DOCUMENT_ROOT'] . '/../data/' . $userLogin . '/';
|
||||
if (!is_dir($userDir)) {
|
||||
mkdir($userDir, 0755, true);
|
||||
}
|
||||
|
||||
// 4. RÉCUPÉRATION DE LA CONFIG (Envoyée en JSON via FormData dans script.js)
|
||||
$configData = isset($_POST['config']) ? json_decode($_POST['config'], true) : null;
|
||||
|
||||
if (!$configData) {
|
||||
// Fallback si tu envoies les champs un par un au lieu d'un objet config
|
||||
$index = $_POST['index'] ?? $_POST['id'] ?? null;
|
||||
} else {
|
||||
$index = $configData['id'] ?? $configData['index'] ?? null;
|
||||
}
|
||||
|
||||
if ($index === null) {
|
||||
die(json_encode(['status' => 'error', 'message' => 'Index/ID manquant']));
|
||||
}
|
||||
|
||||
// 5. Sauvegarde Audio
|
||||
$extension = 'mp3'; // par défaut
|
||||
if (isset($_FILES['audio'])) {
|
||||
// On essaie de deviner l'extension si non fournie dans le nom
|
||||
$originalName = $_FILES['audio']['name'];
|
||||
$extension = pathinfo($originalName, PATHINFO_EXTENSION);
|
||||
|
||||
// Si le Blob n'a pas d'extension (souvent le cas avec JS), on force selon le mime ou mp3
|
||||
if (empty($extension)) {
|
||||
$finfo = new finfo(FILEINFO_MIME_TYPE);
|
||||
$mime = $finfo->file($_FILES['audio']['tmp_name']);
|
||||
$map = ['audio/wav' => 'wav', 'audio/opus' => 'opus', 'audio/ogg' => 'ogg', 'audio/mpeg' => 'mp3'];
|
||||
$extension = $map[$mime] ?? 'mp3';
|
||||
}
|
||||
|
||||
move_uploaded_file($_FILES['audio']['tmp_name'], $userDir . "sound-$index." . $extension);
|
||||
}
|
||||
|
||||
// 6. Sauvegarde Config (on fusionne les infos)
|
||||
$finalConfig = [
|
||||
'id' => (int)$index,
|
||||
'name' => $configData['name'] ?? ($_POST['name'] ?? 'Sans titre'),
|
||||
'loop' => isset($configData['loop']) ? (bool)$configData['loop'] : ($_POST['loop'] === 'true'),
|
||||
'volume' => isset($configData['volume']) ? (float)$configData['volume'] : (float)($_POST['volume'] ?? 1),
|
||||
'extension' => $extension,
|
||||
'updated_at' => date('Y-m-d H:i:s')
|
||||
];
|
||||
|
||||
file_put_contents($userDir . "config-$index.json", json_encode($finalConfig, JSON_PRETTY_PRINT));
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'user' => $userLogin,
|
||||
'index' => $index,
|
||||
'file' => "sound-$index.$extension"
|
||||
]);
|
||||
Reference in New Issue
Block a user