From 4be3087de9d2f3e2a6ccef7fb3e4b44c10ba59f2 Mon Sep 17 00:00:00 2001 From: Eeveid <448859157@qq.com> Date: Sat, 28 Mar 2026 19:44:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B1=80=E5=9F=9F=E7=BD=91?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/service/device_service.go | 13 +++-- .../internal/service/device_service_test.go | 57 +++++++++++++++++++ 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/backend/internal/service/device_service.go b/backend/internal/service/device_service.go index 975d428..c6b2975 100644 --- a/backend/internal/service/device_service.go +++ b/backend/internal/service/device_service.go @@ -109,6 +109,11 @@ func (s *DeviceService) SetOnline(deviceID string, online bool) (model.Device, b func (s *DeviceService) ListCandidates(currentDeviceID string) []model.Device { current, _ := s.store.GetDevice(currentDeviceID) + currentNetworkGroupKey := strings.TrimSpace(current.NetworkGroupKey) + if currentNetworkGroupKey == "" { + return nil + } + devices := s.store.ListDevices() s.applyPresence(devices) candidates := make([]model.Device, 0, len(devices)) @@ -117,15 +122,13 @@ func (s *DeviceService) ListCandidates(currentDeviceID string) []model.Device { if device.ID == currentDeviceID || !device.IsOnline { continue } + if strings.TrimSpace(device.NetworkGroupKey) != currentNetworkGroupKey { + continue + } candidates = append(candidates, device) } sort.SliceStable(candidates, func(i, j int) bool { - leftSameNetwork := current.NetworkGroupKey != "" && candidates[i].NetworkGroupKey == current.NetworkGroupKey - rightSameNetwork := current.NetworkGroupKey != "" && candidates[j].NetworkGroupKey == current.NetworkGroupKey - if leftSameNetwork != rightSameNetwork { - return leftSameNetwork - } return candidates[i].LastSeenAt.After(candidates[j].LastSeenAt) }) diff --git a/backend/internal/service/device_service_test.go b/backend/internal/service/device_service_test.go index ef5baf0..c3851b3 100644 --- a/backend/internal/service/device_service_test.go +++ b/backend/internal/service/device_service_test.go @@ -56,3 +56,60 @@ func TestRegisterReusesKnownDeviceOnlyWithValidToken(t *testing.T) { t.Fatal("expected rotated device token to validate") } } + +func TestListCandidatesOnlyReturnsSameNetworkDevices(t *testing.T) { + memStore := store.NewMemoryStore(model.RuntimeConfig{}) + deviceService := NewDeviceService(memStore, nil, nil) + + current, _ := deviceService.Register(RegisterDeviceInput{ + DeviceID: "current", + Name: "Current", + Type: "desktop", + NetworkGroupKey: "192.168.1.10", + }, "ua/1.0", "") + + sameNetwork, _ := deviceService.Register(RegisterDeviceInput{ + DeviceID: "same-network", + Name: "Same Network", + Type: "phone", + NetworkGroupKey: "192.168.1.10", + }, "ua/1.0", "") + + _, _ = deviceService.Register(RegisterDeviceInput{ + DeviceID: "other-network", + Name: "Other Network", + Type: "phone", + NetworkGroupKey: "10.0.0.5", + }, "ua/1.0", "") + + candidates := deviceService.ListCandidates(current.ID) + if len(candidates) != 1 { + t.Fatalf("expected 1 same-network candidate, got %d", len(candidates)) + } + if candidates[0].ID != sameNetwork.ID { + t.Fatalf("expected candidate %q, got %q", sameNetwork.ID, candidates[0].ID) + } +} + +func TestListCandidatesReturnsEmptyWithoutNetworkGroupKey(t *testing.T) { + memStore := store.NewMemoryStore(model.RuntimeConfig{}) + deviceService := NewDeviceService(memStore, nil, nil) + + current, _ := deviceService.Register(RegisterDeviceInput{ + DeviceID: "current", + Name: "Current", + Type: "desktop", + }, "ua/1.0", "") + + _, _ = deviceService.Register(RegisterDeviceInput{ + DeviceID: "same-network", + Name: "Same Network", + Type: "phone", + NetworkGroupKey: "192.168.1.10", + }, "ua/1.0", "") + + candidates := deviceService.ListCandidates(current.ID) + if len(candidates) != 0 { + t.Fatalf("expected no candidates without a local network group key, got %d", len(candidates)) + } +}