Reduce API response size by using node ID references

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-30 09:35:42 -08:00
parent d970d1db86
commit ef01aaa5c9
3 changed files with 61 additions and 23 deletions

View File

@@ -72,7 +72,22 @@
"Bash(git -C /home/flamingcow/artmap diff)", "Bash(git -C /home/flamingcow/artmap diff)",
"Bash(git -C /home/flamingcow/artnet status)", "Bash(git -C /home/flamingcow/artnet status)",
"Bash(git -C /home/flamingcow/tendrils status)", "Bash(git -C /home/flamingcow/tendrils status)",
"Bash(git -C /home/flamingcow/artmap status)" "Bash(git -C /home/flamingcow/artmap status)",
"Bash(git -C /home/flamingcow/artnet status --short)",
"Bash(git -C /home/flamingcow/tendrils status --short)",
"Bash(git -C /home/flamingcow/artmap status --short)",
"Bash(git -C /home/flamingcow/sacn status --short)",
"Bash(git -C /home/flamingcow/multicast status --short)",
"Bash(git -C /home/flamingcow/artnet diff go.mod go.sum)",
"Bash(git -C /home/flamingcow/tendrils diff go.mod go.sum)",
"Bash(git -C /home/flamingcow/artmap diff go.mod go.sum)",
"Bash(git -C /home/flamingcow/sacn diff go.mod go.sum)",
"Bash(git -C /home/flamingcow/multicast diff go.mod go.sum)",
"Bash(git -C /home/flamingcow/artnet diff --name-only)",
"Bash(git -C /home/flamingcow/tendrils diff --name-only)",
"Bash(git -C /home/flamingcow/artmap diff --name-only)",
"Bash(git -C /home/flamingcow/sacn diff --name-only)",
"Bash(git -C /home/flamingcow/multicast diff --name-only)"
], ],
"ask": [ "ask": [
"Bash(rm *)" "Bash(rm *)"

View File

@@ -16,17 +16,17 @@ type Link struct {
func (l *Link) MarshalJSON() ([]byte, error) { func (l *Link) MarshalJSON() ([]byte, error) {
type linkJSON struct { type linkJSON struct {
ID string `json:"id"` ID string `json:"id"`
NodeA interface{} `json:"node_a"` NodeAID string `json:"node_a_id"`
InterfaceA string `json:"interface_a,omitempty"` InterfaceA string `json:"interface_a,omitempty"`
NodeB interface{} `json:"node_b"` NodeBID string `json:"node_b_id"`
InterfaceB string `json:"interface_b,omitempty"` InterfaceB string `json:"interface_b,omitempty"`
} }
return json.Marshal(linkJSON{ return json.Marshal(linkJSON{
ID: l.ID, ID: l.ID,
NodeA: l.NodeA.WithInterface(l.InterfaceA), NodeAID: l.NodeA.ID,
InterfaceA: l.InterfaceA, InterfaceA: l.InterfaceA,
NodeB: l.NodeB.WithInterface(l.InterfaceB), NodeBID: l.NodeB.ID,
InterfaceB: l.InterfaceB, InterfaceB: l.InterfaceB,
}) })
} }

View File

@@ -4,6 +4,7 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"math"
"net" "net"
"sort" "sort"
"strings" "strings"
@@ -368,6 +369,33 @@ type InterfaceStats struct {
PoE *PoEStats `json:"poe,omitempty"` PoE *PoEStats `json:"poe,omitempty"`
} }
func round2(v float64) float64 {
return math.Round(v*100) / 100
}
func (s *InterfaceStats) MarshalJSON() ([]byte, error) {
type statsJSON struct {
Speed uint64 `json:"speed,omitempty"`
InErrors uint64 `json:"in_errors,omitempty"`
OutErrors uint64 `json:"out_errors,omitempty"`
InPktsRate float64 `json:"in_pkts_rate,omitempty"`
OutPktsRate float64 `json:"out_pkts_rate,omitempty"`
InBytesRate float64 `json:"in_bytes_rate,omitempty"`
OutBytesRate float64 `json:"out_bytes_rate,omitempty"`
PoE *PoEStats `json:"poe,omitempty"`
}
return json.Marshal(statsJSON{
Speed: s.Speed,
InErrors: s.InErrors,
OutErrors: s.OutErrors,
InPktsRate: round2(s.InPktsRate),
OutPktsRate: round2(s.OutPktsRate),
InBytesRate: round2(s.InBytesRate),
OutBytesRate: round2(s.OutBytesRate),
PoE: s.PoE,
})
}
type PoEStats struct { type PoEStats struct {
Power float64 `json:"power"` Power float64 `json:"power"`
MaxPower float64 `json:"max_power"` MaxPower float64 `json:"max_power"`
@@ -558,16 +586,11 @@ type DantePeer struct {
func (p *DantePeer) MarshalJSON() ([]byte, error) { func (p *DantePeer) MarshalJSON() ([]byte, error) {
type peerJSON struct { type peerJSON struct {
Node *Node `json:"node"` NodeID string `json:"node_id"`
Channels []*DanteChannel `json:"channels,omitempty"` Channels []*DanteChannel `json:"channels,omitempty"`
} }
nodeRef := &Node{
ID: p.Node.ID,
Names: p.Node.Names,
Interfaces: p.Node.Interfaces,
}
return json.Marshal(peerJSON{ return json.Marshal(peerJSON{
Node: nodeRef, NodeID: p.Node.ID,
Channels: p.Channels, Channels: p.Channels,
}) })
} }