56 lines
1.7 KiB
PHP
56 lines
1.7 KiB
PHP
<?php
|
|
require __DIR__ . '/../db.php'; // ligação PDO $pdo
|
|
|
|
header('Content-Type: application/json');
|
|
|
|
// Ler JSON do POST
|
|
$input = json_decode(file_get_contents('php://input'), true);
|
|
if (!$input || empty($input['uid']) || empty($input['acks']) || !is_array($input['acks'])) {
|
|
http_response_code(400);
|
|
echo json_encode(['ok'=>false,'err'=>'dados_invalidos']);
|
|
exit;
|
|
}
|
|
|
|
$uid = $input['uid'];
|
|
$acks = $input['acks'];
|
|
|
|
try {
|
|
$pdo->beginTransaction();
|
|
|
|
// Obter ID do device
|
|
$stmt = $pdo->prepare("SELECT id FROM devices WHERE uid=? LIMIT 1 FOR UPDATE");
|
|
$stmt->execute([$uid]);
|
|
$dev = $stmt->fetchColumn();
|
|
if (!$dev) {
|
|
http_response_code(404);
|
|
echo json_encode(['ok'=>false,'err'=>'device']);
|
|
exit;
|
|
}
|
|
|
|
// Atualizar status de cada comando
|
|
$stmtDone = $pdo->prepare("UPDATE commands SET status='done', ack_ts=NOW() WHERE id=? AND device_id=?");
|
|
$stmtFailed = $pdo->prepare("UPDATE commands SET status='failed', ack_ts=NOW(), error=? WHERE id=? AND device_id=?");
|
|
|
|
foreach ($acks as $ack) {
|
|
if (!isset($ack['id'])) continue;
|
|
$cmdId = intval($ack['id']);
|
|
if (!empty($ack['ok'])) {
|
|
$stmtDone->execute([$cmdId, $dev]);
|
|
} else {
|
|
$errMsg = isset($ack['err']) ? substr($ack['err'], 0, 255) : 'erro';
|
|
$stmtFailed->execute([$errMsg, $cmdId, $dev]);
|
|
}
|
|
}
|
|
|
|
// Atualizar heartbeat do device
|
|
$pdo->prepare("UPDATE devices SET last_seen=NOW(), status='online' WHERE id=?")->execute([$dev]);
|
|
|
|
$pdo->commit();
|
|
echo json_encode(['ok'=>true]);
|
|
|
|
} catch (Exception $e) {
|
|
$pdo->rollBack();
|
|
http_response_code(500);
|
|
echo json_encode(['ok'=>false,'err'=>$e->getMessage()]);
|
|
}
|