142 lines
4.5 KiB
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;
|