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
+40
View File
@@ -42,6 +42,8 @@ export const PERMISSION_MANAGE_CHANNELS = 'MANAGE_CHANNELS';
export const PERMISSION_MANAGE_MESSAGES = 'MANAGE_MESSAGES';
export const PERMISSION_MANAGE_EMOJIS = 'MANAGE_EMOJIS';
export const PERMISSION_MANAGE_SOUNDS = 'MANAGE_SOUNDS';
export const PERMISSION_BAN_MEMBERS = 'BAN_MEMBERS';
export const PERMISSION_VIEW_AUDIT_LOG = 'VIEW_AUDIT_LOG';
export const PERMISSION_USE_SOUNDBOARD = 'USE_SOUNDBOARD';
export const PERMISSION_SEND_MESSAGES = 'SEND_MESSAGES';
export const PERMISSION_ATTACH_FILES = 'ATTACH_FILES';
@@ -188,6 +190,44 @@ export function canManageEmojis(
);
}
/**
* Может ли пользователь банить участников (AGENT.md 7.17): владелец,
* ADMINISTRATOR, BAN_MEMBERS или администратор инстанса.
*/
export function canBanMembers(
permissions: readonly string[],
ownerId: string,
userId: string | undefined,
isInstanceAdmin = false,
): boolean {
if (isInstanceAdmin || (userId !== undefined && userId === ownerId)) {
return true;
}
return (
hasPermission(permissions, PERMISSION_ADMINISTRATOR) ||
hasPermission(permissions, PERMISSION_BAN_MEMBERS)
);
}
/**
* Может ли пользователь смотреть журнал аудита (AGENT.md 7.18): владелец,
* ADMINISTRATOR, VIEW_AUDIT_LOG или администратор инстанса.
*/
export function canViewAuditLog(
permissions: readonly string[],
ownerId: string,
userId: string | undefined,
isInstanceAdmin = false,
): boolean {
if (isInstanceAdmin || (userId !== undefined && userId === ownerId)) {
return true;
}
return (
hasPermission(permissions, PERMISSION_ADMINISTRATOR) ||
hasPermission(permissions, PERMISSION_VIEW_AUDIT_LOG)
);
}
/**
* Может ли пользователь управлять звуками сервера (AGENT.md 7.13): владелец,
* ADMINISTRATOR, MANAGE_SOUNDS или администратор инстанса.