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