fix(server): инстанс-админ видит все серверы инстанса в READY

Чек-лист §11.5 требует, чтобы READY и список серверов инстанс-админа
содержали все серверы инстанса, включая чужие и приватные. Фактически
список строился из членства (`ListGuildsForUser`), поэтому в интерфейсе
админа чужого сервера не было ни в рейке, ни в подстраховочном
`GET /users/@me/guilds` — войти в него без инвайта было нельзя, хотя права
на чужом сервере у него максимальные (AGENT.md 7.18, 7.19).

- `Snapshot.userGuilds`: админу — `ListAllGuilds`, остальным — членство;
- `GET /users/@me/guilds` отдаёт админу тот же список, иначе REST-ответ
  выкидывал бы чужой сервер из рейки при перечитывании сводки;
- Go-тест `TestReadyListsAllGuildsForInstanceAdmin`: READY и REST содержат
  чужой приватный сервер с полными правами, у обычного пользователя его нет.
This commit is contained in:
2026-09-26 11:06:24 +03:00
parent 61cad0fdfc
commit 5f21c9d069
4 changed files with 118 additions and 5 deletions
+9 -1
View File
@@ -392,7 +392,15 @@ func (s *Server) registerUserRoutes(api huma.API) {
if err != nil {
return nil, err
}
guilds, err := s.store.ListGuildsForUser(ctx, user.ID)
// Инстанс-админ видит все серверы инстанса — тем же списком, что и
// READY, иначе подстраховочный REST-запрос выкинул бы чужой сервер из
// рейки (AGENT.md 7.19, 11.5).
var guilds []store.Guild
if user.IsInstanceAdmin {
guilds, err = s.store.ListAllGuilds(ctx)
} else {
guilds, err = s.store.ListGuildsForUser(ctx, user.ID)
}
if err != nil {
return nil, humaError(err)
}