Files
netwatch/app/modules/connections/save.php
2026-02-16 14:43:15 +01:00

145 lines
4.3 KiB
PHP

<?php
/**
* app/modules/connections/save.php
*
* Speichert / aktualisiert eine Netzwerkverbindung
* (Basis-Implementierung - kann erweitert werden)
*/
// Nur POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: ?module=connections&action=list');
exit;
}
// =========================
// Daten einlesen
// =========================
$connId = (int)($_POST['id'] ?? 0);
$portAType = $_POST['port_a_type'] ?? 'device';
$portAId = (int)($_POST['port_a_id'] ?? 0);
$portBType = $_POST['port_b_type'] ?? 'device';
$portBId = (int)($_POST['port_b_id'] ?? 0);
$vlanConfig = $_POST['vlan_config'] ?? '';
$comment = trim($_POST['comment'] ?? '');
$normalizePortType = static function (string $value): string {
$map = [
'device' => 'device',
'device_ports' => 'device',
'module' => 'module',
'module_ports' => 'module',
'outlet' => 'outlet',
'network_outlet_ports' => 'outlet',
'patchpanel' => 'patchpanel',
'floor_patchpanel' => 'patchpanel',
'floor_patchpanel_ports' => 'patchpanel',
];
$key = strtolower(trim($value));
return $map[$key] ?? $key;
};
$portAType = $normalizePortType((string)$portAType);
$portBType = $normalizePortType((string)$portBType);
// =========================
// Validierung (einfach)
// =========================
$errors = [];
if ($portAId <= 0 || $portBId <= 0) {
$errors[] = "Beide Ports sind erforderlich";
}
$otherConnections = $sql->get(
"SELECT id, port_a_type, port_a_id, port_b_type, port_b_id
FROM connections
WHERE id <> ?",
"i",
[$connId]
);
$isEndpointUsed = static function (string $endpointType, int $endpointId) use ($otherConnections, $normalizePortType): bool {
if ($endpointId <= 0) {
return false;
}
foreach ((array)$otherConnections as $row) {
$typeA = $normalizePortType((string)($row['port_a_type'] ?? ''));
$idA = (int)($row['port_a_id'] ?? 0);
if ($typeA === $endpointType && $idA === $endpointId) {
return true;
}
$typeB = $normalizePortType((string)($row['port_b_type'] ?? ''));
$idB = (int)($row['port_b_id'] ?? 0);
if ($typeB === $endpointType && $idB === $endpointId) {
return true;
}
}
return false;
};
if ($isEndpointUsed($portAType, $portAId)) {
$errors[] = "Port an Endpunkt A ist bereits in Verwendung";
}
if ($isEndpointUsed($portBType, $portBId)) {
$errors[] = "Port an Endpunkt B ist bereits in Verwendung";
}
if (!empty($errors)) {
$_SESSION['error'] = implode(', ', $errors);
$redirectUrl = $connId ? "?module=connections&action=edit&id=$connId" : "?module=connections&action=edit";
header("Location: $redirectUrl");
exit;
}
// =========================
// In DB speichern
// =========================
$vlanJson = $vlanConfig ? json_encode(explode(',', $vlanConfig)) : null;
if ($connId > 0) {
// UPDATE
$sql->set(
"UPDATE connections SET port_a_type = ?, port_a_id = ?, port_b_type = ?, port_b_id = ?, vlan_config = ?, comment = ? WHERE id = ?",
"sisissi",
[$portAType, $portAId, $portBType, $portBId, $vlanJson, $comment, $connId]
);
} else {
$connectionTypeId = (int)($sql->single(
"SELECT id FROM connection_types ORDER BY id LIMIT 1",
"",
[]
)['id'] ?? 0);
if ($connectionTypeId <= 0) {
$connectionTypeId = (int)$sql->set(
"INSERT INTO connection_types (name, medium, duplex, line_style, comment) VALUES (?, ?, ?, ?, ?)",
"sssss",
['Default', 'copper', 'custom', 'solid', 'Auto-created by connections/save'],
true
);
}
if ($connectionTypeId <= 0) {
$_SESSION['error'] = "Kein Verbindungstyp verfuegbar";
header("Location: ?module=connections&action=edit");
exit;
}
// INSERT
$sql->set(
"INSERT INTO connections (connection_type_id, port_a_type, port_a_id, port_b_type, port_b_id, vlan_config, comment) VALUES (?, ?, ?, ?, ?, ?, ?)",
"isisiss",
[$connectionTypeId, $portAType, $portAId, $portBType, $portBId, $vlanJson, $comment]
);
}
$_SESSION['success'] = "Verbindung gespeichert";
// =========================
// Redirect
// =========================
header('Location: ?module=connections&action=list');
exit;