fix(ntp+backends): /system/services response is {services:[]} not a bare array

Both NTP and Backends pages cast r.data.data directly to Array<…> but
the handler wraps the list as gin.H{"services": out}. The wrong cast
returned an object to .find()/.filter(), crashing with "s.find is not
a function" and breaking the NTP page entirely. Firewall/ForwardProxy/
DNS/Settings pages already used the correct {services:…} shape. v1.1.117.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Debian
2026-05-27 17:14:23 +02:00
parent 7f4606ba16
commit 40a1b63c02
6 changed files with 6 additions and 6 deletions

View File

@@ -1 +1 @@
1.1.116
1.1.117

View File

@@ -60,7 +60,7 @@ import (
usersvc "git.netcell-it.de/projekte/edgeguard-native/internal/services/users"
)
var version = "1.1.116"
var version = "1.1.117"
func main() {
addr := os.Getenv("EDGEGUARD_API_ADDR")

View File

@@ -11,7 +11,7 @@ import (
"git.netcell-it.de/projekte/edgeguard-native/internal/services/setup"
)
var version = "1.1.116"
var version = "1.1.117"
const usage = `edgeguard-ctl — EdgeGuard CLI

View File

@@ -41,7 +41,7 @@ import (
"git.netcell-it.de/projekte/edgeguard-native/internal/services/tlscerts"
)
var version = "1.1.116"
var version = "1.1.117"
const (
// renewTickInterval — how often we re-evaluate expiring certs.

View File

@@ -128,7 +128,7 @@ export default function BackendsPage() {
queryKey: ['system', 'services'],
queryFn: async () => {
const r = await apiClient.get('/system/services')
return isEnvelope(r.data) ? (r.data.data as Array<{ unit: string; active: boolean; state: string }>).filter(Boolean) : []
return isEnvelope(r.data) ? (r.data.data as { services: Array<{ unit: string; active: boolean; state: string }> }).services ?? [] : []
},
refetchInterval: 30_000,
})

View File

@@ -91,7 +91,7 @@ export default function NTPPage() {
queryKey: ['system', 'services'],
queryFn: async () => {
const r = await apiClient.get('/system/services')
return isEnvelope(r.data) ? (r.data.data as Array<{ unit: string; active: boolean; state: string }>) : []
return isEnvelope(r.data) ? (r.data.data as { services: Array<{ unit: string; active: boolean; state: string }> }).services ?? [] : []
},
refetchInterval: 30_000,
})