fix(gateway): adminListChannels 按平台聚合——bare+kook多个adapter不再拆成多行导致重复账号
- 根因: caps循环把 kook(bare)+kook:fc2048(多账号) 分别append, 每行Accounts都是完整platform账号集→前端显示两个kook且fc2048重复(主人'只点一次创建出两个kook') - 修: 按platform聚合(hasChannelSummary检查), 同platform只一行(Name=platform), Accounts为整个platform账号集; 保留agent-121删除同步(平台有账号才显示) - 测试断言: kook:3fc8/conf0 → kook(聚合行) 更新 - 全仓 go build/vet/test绿; 前端无涉
This commit is contained in:
1 parent
0ed7984de3
commit
eaca8dc8cc
3 files changed
+14
-8
No files matched your search
@@ -161,7 +161,13 @@ func (s *Server) adminListChannels(w http.ResponseWriter, r *http.Request) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sum := ChannelSummary{Name: ch.Name(), Connected: ch.IsConnected()}
|
// Aggregate by platform: a bare adapter ("kook") and the multi-account
|
||||||
|
// ones ("kook:fc2048", "kook:conf1") are ONE platform row, so the account
|
||||||
|
// list is not duplicated into a separate row per in-registry adapter.
|
||||||
|
if s.hasChannelSummary(out, platform) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
sum := ChannelSummary{Name: platform, Connected: ch.IsConnected()}
|
||||||
if accts, ok := accountsByPlatform[platform]; ok && len(accts) > 0 {
|
if accts, ok := accountsByPlatform[platform]; ok && len(accts) > 0 {
|
||||||
sum.Accounts = enrichAccountsWithBot(accts, botByPlatform[platform])
|
sum.Accounts = enrichAccountsWithBot(accts, botByPlatform[platform])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -202,10 +202,10 @@ func TestAdminDeleteChannelAccountRemovesFromList(t *testing.T) {
|
|||||||
_, ts, jwt := buildEnv(t, cfgDefault(), Deps{Registry: caps, Channels: store})
|
_, ts, jwt := buildEnv(t, cfgDefault(), Deps{Registry: caps, Channels: store})
|
||||||
tok := signAny(t, jwt, "acct", auth.RoleOwner)
|
tok := signAny(t, jwt, "acct", auth.RoleOwner)
|
||||||
|
|
||||||
// Before the delete the account shows up.
|
// Before the delete the account shows up (aggregated into a single "kook" row).
|
||||||
items, _ := adminChannelsList(t, ts, tok)
|
items, _ := adminChannelsList(t, ts, tok)
|
||||||
if len(items) != 1 || items[0].Name != "kook:3fc8" {
|
if len(items) != 1 || items[0].Name != "kook" || len(items[0].Accounts) != 1 || items[0].Accounts[0].ID != "3fc8" {
|
||||||
t.Fatalf("before delete items = %+v, want [kook:3fc8]", items)
|
t.Fatalf("before delete items = %+v, want one kook row with account 3fc8", items)
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, body := doReq(t, http.MethodDelete, ts.URL+"/api/v1/admin/channels/kook/config?id=3fc8", nil, tok)
|
resp, body := doReq(t, http.MethodDelete, ts.URL+"/api/v1/admin/channels/kook/config?id=3fc8", nil, tok)
|
||||||
@@ -252,8 +252,8 @@ func TestAdminDeleteChannelAccountKeepsSibling(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
items, _ := adminChannelsList(t, ts, tok)
|
items, _ := adminChannelsList(t, ts, tok)
|
||||||
if len(items) != 1 || items[0].Name != "kook:conf1" {
|
if len(items) != 1 || items[0].Name != "kook" {
|
||||||
t.Fatalf("items = %+v, want only kook:conf1 (deleted 3fc8 must vanish)", items)
|
t.Fatalf("items = %+v, want one kook row (deleted 3fc8 must vanish)", items)
|
||||||
}
|
}
|
||||||
if len(items[0].Accounts) != 1 || items[0].Accounts[0].ID != "conf1" {
|
if len(items[0].Accounts) != 1 || items[0].Accounts[0].ID != "conf1" {
|
||||||
t.Fatalf("accounts = %+v, want only conf1", items[0].Accounts)
|
t.Fatalf("accounts = %+v, want only conf1", items[0].Accounts)
|
||||||
|
|||||||
@@ -597,8 +597,8 @@ func TestAdminChannels_SurfacesBotIdentity(t *testing.T) {
|
|||||||
if err := json.Unmarshal(decodeBody(t, body)["data"], &items); err != nil {
|
if err := json.Unmarshal(decodeBody(t, body)["data"], &items); err != nil {
|
||||||
t.Fatalf("decode: %v", err)
|
t.Fatalf("decode: %v", err)
|
||||||
}
|
}
|
||||||
if len(items) != 1 || items[0].Name != "kook:conf0" {
|
if len(items) != 1 || items[0].Name != "kook" {
|
||||||
t.Fatalf("items = %+v, want single kook:conf0", items)
|
t.Fatalf("items = %+v, want single kook row", items)
|
||||||
}
|
}
|
||||||
if len(items[0].Accounts) != 1 {
|
if len(items[0].Accounts) != 1 {
|
||||||
t.Fatalf("accounts = %+v, want one", items[0].Accounts)
|
t.Fatalf("accounts = %+v, want one", items[0].Accounts)
|
||||||
|
|||||||
Reference in new issue
Block a user