Files
netwatch/app/modules/devices/delete.php

142 lines
4.5 KiB
PHP

<?php
/**
* app/modules/devices/delete.php
*
* Loescht ein Geraet. Bei Abhaengigkeiten ist force=1 erforderlich.
* Unterstuetzt GET-Redirects und AJAX-POST.
*/
$isPost = ($_SERVER['REQUEST_METHOD'] ?? '') === 'POST';
$deviceId = (int)($_POST['id'] ?? $_GET['id'] ?? 0);
$forceDelete = (int)($_POST['force'] ?? $_GET['force'] ?? 0) === 1;
if ($deviceId <= 0) {
if ($isPost) {
header('Content-Type: application/json; charset=utf-8');
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Ungueltige Geraete-ID']);
exit;
}
$_SESSION['error'] = "Ungueltige Geraete-ID";
header('Location: ?module=devices&action=list');
exit;
}
$device = $sql->single(
"SELECT id, name FROM devices WHERE id = ?",
"i",
[$deviceId]
);
if (!$device) {
if ($isPost) {
header('Content-Type: application/json; charset=utf-8');
http_response_code(404);
echo json_encode(['success' => false, 'message' => 'Geraet nicht gefunden']);
exit;
}
$_SESSION['error'] = "Geraet nicht gefunden";
header('Location: ?module=devices&action=list');
exit;
}
$dependencies = $sql->single(
"SELECT
(
SELECT COUNT(*)
FROM device_ports dp
WHERE dp.device_id = ?
) AS port_count,
(
SELECT COUNT(*)
FROM device_port_modules dpm
JOIN device_ports dp2 ON dp2.id = dpm.device_port_id
WHERE dp2.device_id = ?
) AS module_count,
(
SELECT COUNT(*)
FROM connections c
WHERE ((c.port_a_type = 'device' OR c.port_a_type = 'device_ports') AND c.port_a_id IN (
SELECT dp3.id FROM device_ports dp3 WHERE dp3.device_id = ?
))
OR ((c.port_b_type = 'device' OR c.port_b_type = 'device_ports') AND c.port_b_id IN (
SELECT dp4.id FROM device_ports dp4 WHERE dp4.device_id = ?
))
) AS connection_count",
"iiii",
[$deviceId, $deviceId, $deviceId, $deviceId]
);
$portCount = (int)($dependencies['port_count'] ?? 0);
$moduleCount = (int)($dependencies['module_count'] ?? 0);
$connectionCount = (int)($dependencies['connection_count'] ?? 0);
$hasDependencies = $portCount > 0 || $moduleCount > 0 || $connectionCount > 0;
if ($hasDependencies && !$forceDelete) {
$parts = [];
if ($connectionCount > 0) {
$parts[] = $connectionCount . ' Verbindungen';
}
if ($portCount > 0) {
$parts[] = $portCount . ' Ports';
}
if ($moduleCount > 0) {
$parts[] = $moduleCount . ' Port-Module';
}
$dependencyMessage = "Geraet hat abhaengige Daten (" . implode(', ', $parts) . "). Loeschen bitte bestaetigen.";
if ($isPost) {
header('Content-Type: application/json; charset=utf-8');
http_response_code(409);
echo json_encode([
'success' => false,
'requires_force' => true,
'message' => $dependencyMessage,
'dependencies' => [
'connections' => $connectionCount,
'ports' => $portCount,
'modules' => $moduleCount
]
]);
exit;
}
$_SESSION['error'] = $dependencyMessage;
header('Location: ?module=devices&action=edit&id=' . urlencode((string)$deviceId));
exit;
}
// Connections referenzieren device_ports nur logisch, daher manuell entfernen.
$sql->set(
"DELETE FROM connections
WHERE ((port_a_type = 'device' OR port_a_type = 'device_ports') AND port_a_id IN (SELECT id FROM device_ports WHERE device_id = ?))
OR ((port_b_type = 'device' OR port_b_type = 'device_ports') AND port_b_id IN (SELECT id FROM device_ports WHERE device_id = ?))",
"ii",
[$deviceId, $deviceId]
);
$deleted = $sql->set(
"DELETE FROM devices WHERE id = ?",
"i",
[$deviceId]
);
if ($deleted > 0) {
if ($isPost) {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['success' => true, 'message' => "Geraet geloescht: " . $device['name']]);
exit;
}
$_SESSION['success'] = "Geraet geloescht: " . $device['name'];
} else {
if ($isPost) {
header('Content-Type: application/json; charset=utf-8');
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'Geraet konnte nicht geloescht werden']);
exit;
}
$_SESSION['error'] = "Geraet konnte nicht geloescht werden";
}
header('Location: ?module=devices&action=list');
exit;