esp/api/api_puertos.php

131 lines
5.3 KiB
PHP

<?php
// Consolidated puertos API: handles get_puertos, update_puertos, asignar_puertos
// Expects $route from api/index.php and bootstrap loaded
$archivoPuertos = __DIR__ . '/../data/puertos.json';
// Compatibilidad legacy: permitir acceso directo a /api/api_puertos.php?chipid=<chipid>
// cuando no se pasa por el router (no existe $route).
if (!isset($route)) {
// Cargar bootstrap para CORS/headers JSON si está disponible
$bootstrap = __DIR__ . '/bootstrap.php';
if (file_exists($bootstrap)) {
require_once $bootstrap;
} else {
// En caso extremo, asegurar Content-Type JSON
if (!headers_sent()) {
header('Content-Type: application/json; charset=utf-8');
}
}
$puertos = file_exists($archivoPuertos) ? json_decode(file_get_contents($archivoPuertos), true) : [];
if (!isset($_GET['chipid'])) {
echo json_encode(['error' => "Debe especificar el parámetro 'chipid'"]);
exit;
}
$chipid = $_GET['chipid'];
if (is_array($puertos) && array_key_exists($chipid, $puertos)) {
echo json_encode($puertos[$chipid]);
} else {
echo json_encode(['error' => 'ChipID no encontrado']);
}
exit;
}
switch ($route) {
case 'get_puertos': {
$puertos = file_exists($archivoPuertos) ? json_decode(file_get_contents($archivoPuertos), true) : [];
if (!isset($_GET['chipid'])) {
echo json_encode(['error' => "Debe especificar el parámetro 'chipid'"]);
break;
}
$chipid = $_GET['chipid'];
if (array_key_exists($chipid, $puertos)) {
echo json_encode($puertos[$chipid]);
} else {
echo json_encode(['error' => 'ChipID no encontrado']);
}
break;
}
case 'asignar_puertos': {
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['success' => false, 'message' => 'Método no permitido']);
break;
}
$data = json_decode(file_get_contents('php://input'), true);
if (!is_array($data) || empty($data)) {
echo json_encode(['success' => false, 'message' => 'Datos inválidos']);
break;
}
$puertos = file_exists($archivoPuertos) ? json_decode(file_get_contents($archivoPuertos), true) : [];
if (!is_array($puertos)) {
echo json_encode(['success' => false, 'message' => 'Error al leer el archivo de puertos']);
break;
}
foreach ($data as $chipid => $config) {
if (!isset($puertos[$chipid])) { $puertos[$chipid] = []; }
foreach ($config as $puerto => $valores) {
if (!is_array($valores)) continue;
$puertos[$chipid][$puerto] = [
'gpio' => $valores['gpio'],
'disp' => $valores['disp'] ?? null,
'modo' => $valores['modo'] ?? 'INPUT_PULLUP',
'notas' => $valores['notas'] ?? '',
];
}
$date = new DateTime('now', new DateTimeZone('America/Argentina/Buenos_Aires'));
$puertos[$chipid]['update'] = $date->format('Y-m-d H:i:s');
}
if (file_put_contents($archivoPuertos, json_encode($puertos, JSON_PRETTY_PRINT))) {
echo json_encode(['success' => true, 'message' => 'Dispositivo actualizado con éxito']);
} else {
echo json_encode(['success' => false, 'message' => 'Error al guardar el archivo']);
}
break;
}
case 'update_puertos': {
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['success' => false, 'message' => 'Método no permitido']);
break;
}
$data = json_decode(file_get_contents('php://input'), true);
if (!is_array($data) || empty($data)) {
echo json_encode(['success' => false, 'message' => 'Datos inválidos']);
break;
}
$puertos = file_exists($archivoPuertos) ? json_decode(file_get_contents($archivoPuertos), true) : [];
foreach ($data as $chipid => $puertosRecibidos) {
if (!isset($puertos[$chipid])) { continue; }
foreach ($puertosRecibidos as $puerto => $valores) {
if ($puerto === 'update') continue;
if (isset($puertos[$chipid][$puerto])) {
if (!is_array($valores)) {
continue;
}
if (array_key_exists('disp', $valores)) {
$puertos[$chipid][$puerto]['disp'] = $valores['disp'];
}
if (array_key_exists('notas', $valores)) {
$puertos[$chipid][$puerto]['notas'] = $valores['notas'];
}
if (array_key_exists('modo', $valores)) {
$puertos[$chipid][$puerto]['modo'] = $valores['modo'];
}
}
}
$puertos[$chipid]['update'] = date('Y-m-d H:i:s');
}
if (file_put_contents($archivoPuertos, json_encode($puertos, JSON_PRETTY_PRINT))) {
echo json_encode(['success' => true, 'message' => 'Puertos actualizados con éxito']);
} else {
echo json_encode(['success' => false, 'message' => 'Error al guardar el archivo']);
}
break;
}
default:
json_error('Ruta no soportada en api_puertos', 404);
}