mirror of
https://github.com/MeshCore-Beacon/beacon-server.git
synced 2026-10-16 07:19:58 +00:00
Imported boundaries override borderFile on the border map and for foreign marking, falling back to the manual border when MeshMapper has none.
51 lines
1.6 KiB
Go
51 lines
1.6 KiB
Go
// Copyright 2026 Beacon Contributors
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
package api
|
|
|
|
import (
|
|
"context"
|
|
"slices"
|
|
|
|
"github.com/MeshCore-Beacon/beacon-server/internal/borders"
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// WithLocalBorders annotates node responses after cache reads. Historical rows
|
|
// use the current boundaries without extra SQL or cached-policy drift.
|
|
// Cached values are copied; the decorator never changes its inner reader's data.
|
|
func WithLocalBorders(reader Reader, local *borders.Live) Reader {
|
|
if local == nil {
|
|
return reader
|
|
}
|
|
return &localBorderReader{Reader: reader, local: local}
|
|
}
|
|
|
|
type localBorderReader struct {
|
|
Reader
|
|
local *borders.Live
|
|
}
|
|
|
|
func (r *localBorderReader) ListNodes(ctx context.Context, nodeType int16, iatas []string, paths, traces *bool, pubkey []byte, prefix, name, scope string, cursor int64, limit int32, neighbors bool) (Page[NodeSummary], error) {
|
|
page, err := r.Reader.ListNodes(ctx, nodeType, iatas, paths, traces, pubkey, prefix, name, scope, cursor, limit, neighbors)
|
|
if err != nil {
|
|
return page, err
|
|
}
|
|
page.Items = slices.Clone(page.Items)
|
|
for i := range page.Items {
|
|
node := &page.Items[i]
|
|
node.PossiblyForeign = r.local.PossiblyForeign(node.NodeType, node.Latitude, node.Longitude)
|
|
}
|
|
return page, nil
|
|
}
|
|
|
|
func (r *localBorderReader) GetNode(ctx context.Context, id uuid.UUID) (*Node, error) {
|
|
node, err := r.Reader.GetNode(ctx, id)
|
|
if err != nil || node == nil {
|
|
return node, err
|
|
}
|
|
copy := *node
|
|
copy.PossiblyForeign = r.local.PossiblyForeign(node.NodeType, node.Latitude, node.Longitude)
|
|
return ©, nil
|
|
}
|