www/api/commands/ack.php
2026-05-11 23:31:48 +01:00

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()]);
}