feat(web): разделы «Баны» и «Журнал аудита» в настройках сервера

Фаза 4 (AGENT.md 7.17, 7.18): модерация из интерфейса.

- `api/moderation.ts`: список банов, бан, разбан, тайм-аут, кик и журнал
  аудита с фильтрами;
- «Баны»: причина и автор каждого бана, снятие бана и пресеты тайм-аута
  (1/5/10/60/1440 минут) прямо из списка; ответ сервера обновляет кэш, поэтому
  строка исчезает без перезагрузки;
- «Журнал аудита»: фильтры по действию, автору и цели уходят в запрос,
  кнопки «Показать» и «Сбросить»;
- секции видны только с правами BAN_MEMBERS и VIEW_AUDIT_LOG
  (`canBanMembers`, `canViewAuditLog`);
- тесты: список с причиной и автором, снятие бана с обновлением списка,
  тайм-аут с проверкой времени, скрытие секций без прав, фильтры в запросе.
This commit is contained in:
2026-09-20 22:43:56 +03:00
parent 4fb3509128
commit 8613989b21
7 changed files with 764 additions and 3 deletions
+26 -1
View File
@@ -756,7 +756,7 @@
"ping": "Ping",
"pingValue": "{{ms}} ms",
"pingUnavailable": "—",
"pingHint": "Instance response time for a dashboard request",
"pingHint": "Instance response time for a dashboard request (HTTP)",
"summary": {
"ok": "All good",
"warn": "Warnings",
@@ -918,6 +918,31 @@
"role_grant": "Role granted",
"role_revoke": "Role revoked"
}
},
"bans": {
"title": "Bans",
"description": "Banned users cannot return by invite until the ban is lifted.",
"empty": "No bans.",
"remove": "Unban",
"noReason": "no reason",
"bannedBy": "banned by {{name}}, {{date}}",
"unknownActor": "unknown",
"timeoutLabel": "Timeout:",
"timeoutMinutes_one": "{{count}} minute",
"timeoutMinutes_few": "{{count}} minutes",
"timeoutMinutes_many": "{{count}} minutes",
"timeoutMinutes_other": "{{count}} minutes",
"timeoutAction": "Timeout {{minutes}} min"
},
"audit": {
"title": "Audit log",
"description": "Guild moderator actions. Filters are applied server-side.",
"filterAction": "Action",
"filterActor": "Actor ID",
"filterTarget": "Target ID",
"apply": "Apply",
"reset": "Reset",
"empty": "No entries."
}
},
"navLabel": "Settings sections",