From ee5de2741320376faa9dbd34cec3d7e42114afeb Mon Sep 17 00:00:00 2001 From: jokob-sk Date: Thu, 25 Dec 2025 11:39:28 +1100 Subject: [PATCH] FE+BE: deviceDetials migration to graphQL endpoints Signed-off-by: jokob-sk --- front/deviceDetails.php | 20 +- front/deviceDetailsEdit.php | 665 ++++++++++++++------------ front/php/server/devices.php | 145 ------ server/api_server/graphql_endpoint.py | 17 +- 4 files changed, 382 insertions(+), 465 deletions(-) diff --git a/front/deviceDetails.php b/front/deviceDetails.php index fd61f163..26d58d45 100755 --- a/front/deviceDetails.php +++ b/front/deviceDetails.php @@ -416,9 +416,25 @@ async function renderSmallBoxes() { showSpinner(); // Get data from the server - const response = await fetch(`php/server/devices.php?action=getServerDeviceData&mac=${getMac()}&period=${period}`); + const protocol = window.location.protocol.replace(':', ''); + const host = window.location.hostname; + const apiToken = getSetting("API_TOKEN"); + const port = getSetting("GRAPHQL_PORT"); // same port your Flask app runs on + + const apiBase = `${protocol}://${host}:${port}`; + const url = `${apiBase}/device/${getMac()}?period=${encodeURIComponent(period)}`; + + const response = await fetch(url, { + method: "GET", + headers: { + "Authorization": `Bearer ${apiToken}`, + "Content-Type": "application/json" + } + }); + if (!response.ok) { - throw new Error(`Error fetching device data: ${response.statusText}`); + const text = await response.text(); + throw new Error(`Error fetching device data: ${response.status} ${text}`); } const deviceData = await response.json(); diff --git a/front/deviceDetailsEdit.php b/front/deviceDetailsEdit.php index e18b188d..69472e93 100755 --- a/front/deviceDetailsEdit.php +++ b/front/deviceDetailsEdit.php @@ -1,280 +1,319 @@ +//------------------------------------------------------------------------------ +// check if authenticated +require_once $_SERVER["DOCUMENT_ROOT"] . "/php/templates/security.php"; ?>
-
- -
+
+ +
-
- - -
-
+
+ + +
+
\ No newline at end of file diff --git a/front/php/server/devices.php b/front/php/server/devices.php index 88095a0e..67d02854 100755 --- a/front/php/server/devices.php +++ b/front/php/server/devices.php @@ -31,7 +31,6 @@ $action = $_REQUEST['action']; switch ($action) { // check server/api_server/api_server_start.py for equivalents - case 'getServerDeviceData': getServerDeviceData(); break; // equivalent: get_device_data case 'deleteDevice': deleteDevice(); break; // equivalent: delete_device(mac) case 'deleteAllWithEmptyMACs': deleteAllWithEmptyMACs(); break; // equivalent: delete_all_with_empty_macs @@ -55,150 +54,6 @@ } - -//------------------------------------------------------------------------------ -// Query Device Data -//------------------------------------------------------------------------------ -function getServerDeviceData() { - global $db; - - // Request Parameters - $periodDate = getDateFromPeriod(); - $mac = $_REQUEST['mac']; - - // Check for "new" MAC case - if ($mac === "new") { - $now = date('Y-m-d H:i'); - $deviceData = [ - "devMac" => "", - "devName" => "", - "devOwner" => "", - "devType" => "", - "devVendor" => "", - "devFavorite" => 0, - "devGroup" => "", - "devComments" => "", - "devFirstConnection" => $now, - "devLastConnection" => $now, - "devLastIP" => "", - "devStaticIP" => 0, - "devScan" => 0, - "devLogEvents" => 0, - "devAlertEvents" => 0, - "devAlertDown" => 0, - "devParentRelType" => "default", - "devReqNicsOnline" => 0, - "devSkipRepeated" => 0, - "devLastNotification" => "", - "devPresentLastScan" => 0, - "devIsNew" => 1, - "devLocation" => "", - "devIsArchived" => 0, - "devParentMAC" => "", - "devParentPort" => "", - "devIcon" => "", - "devGUID" => "", - "devSite" => "", - "devSSID" => "", - "devSyncHubNode" => "", - "devSourcePlugin" => "", - "devCustomProps" => "", - "devStatus" => "Unknown", - "devIsRandomMAC" => false, - "devSessions" => 0, - "devEvents" => 0, - "devDownAlerts" => 0, - "devPresenceHours" => 0, - "devFQDN" => "" - ]; - echo json_encode($deviceData); - return; - } - - - // Get current date (used in presence calc) - $currentdate = date("Y-m-d H:i:s"); - - // Fetch Device Info + Children + Events Stats - $sql =<<= $periodDate OR - ses_DateTimeDisconnection >= $periodDate OR - ses_StillConnected = 1 - ) - ) AS devSessions, - - (SELECT COUNT(*) FROM Events - WHERE eve_MAC = d.devMac AND - eve_DateTime >= $periodDate AND - eve_EventType NOT IN ("Connected", "Disconnected") - ) AS devEvents, - - (SELECT COUNT(*) FROM Events - WHERE eve_MAC = d.devMac AND - eve_DateTime >= $periodDate AND - eve_EventType = "Device Down" - ) AS devDownAlerts, - - (SELECT CAST(( MAX (0, SUM (julianday (IFNULL (ses_DateTimeDisconnection,'$currentdate')) - - julianday (CASE WHEN ses_DateTimeConnection < $periodDate - THEN $periodDate - ELSE ses_DateTimeConnection END)) *24 )) AS INT) - FROM Sessions - WHERE ses_MAC = d.devMac AND - ses_DateTimeConnection IS NOT NULL AND - (ses_DateTimeDisconnection IS NOT NULL OR ses_StillConnected = 1) AND - ( - ses_DateTimeConnection >= $periodDate OR - ses_DateTimeDisconnection >= $periodDate OR - ses_StillConnected = 1 - ) - ) AS devPresenceHours - - FROM Devices d - WHERE d.devMac = "$mac" OR CAST(d.rowid AS TEXT) = "$mac" - SQL; - - $row = $db->query($sql)->fetchArray(SQLITE3_ASSOC); - $deviceData = $row; - $mac = $deviceData['devMac']; - - $deviceData['devFirstConnection'] = formatDate($deviceData['devFirstConnection']); - $deviceData['devLastConnection'] = formatDate($deviceData['devLastConnection']); - $deviceData['devIsRandomMAC'] = isRandomMAC($mac); - - // Fetch children once and split in PHP - $sql = 'SELECT rowid, * FROM Devices WHERE devParentMAC = "' . $mac . '" ORDER BY devPresentLastScan DESC'; - $result = $db->query($sql); - $children = []; - $childrenNics = []; - - while ($row = $result->fetchArray(SQLITE3_ASSOC)) { - $children[] = $row; - if ($row['devParentRelType'] === 'nic') { - $childrenNics[] = $row; - } - } - - $deviceData['devChildrenDynamic'] = $children; - $deviceData['devChildrenNicsDynamic'] = $childrenNics; - - // Return JSON - echo json_encode($deviceData); - -} - //------------------------------------------------------------------------------ // Delete Device //------------------------------------------------------------------------------ diff --git a/server/api_server/graphql_endpoint.py b/server/api_server/graphql_endpoint.py index c9465d63..6feb37e1 100755 --- a/server/api_server/graphql_endpoint.py +++ b/server/api_server/graphql_endpoint.py @@ -366,9 +366,9 @@ class Query(ObjectType): return DeviceResult(devices=devices, count=total_count) # --- SETTINGS --- - settings = Field(SettingResult) + settings = Field(SettingResult, filters=List(FilterOptionsInput)) - def resolve_settings(root, info): + def resolve_settings(root, info, filters=None): try: with open(folder + "table_settings.json", "r") as f: settings_data = json.load(f)["data"] @@ -379,7 +379,18 @@ class Query(ObjectType): mylog("trace", f"[graphql_schema] settings_data: {settings_data}") # Convert to Setting objects - settings = [Setting(**setting) for setting in settings_data] + settings = [Setting(**s) for s in settings_data] + + # Apply dynamic filters (OR) + if filters: + filtered_settings = [] + for s in settings: + for f in filters: + if f.filterColumn and f.filterValue is not None: + if str(getattr(s, f.filterColumn, "")).lower() == str(f.filterValue).lower(): + filtered_settings.append(s) + break # match one filter is enough (OR) + settings = filtered_settings return SettingResult(settings=settings, count=len(settings))