Files
ma7engine/auth/index.ts
T
maenekoandClaude Opus 5 53c438535e ma7engine: ядро, шаблон панели, скаффолдер и доктор
Первый коммит существующего состояния. Ядро кладётся под git ради того,
чтобы половины разъезжались в продуктовые репозитории через git subtree,
а не копированием: subtree делает настоящий merge, хранит историю и умеет
отдавать правки обратно.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LeBkZLiQrvdECf5nfgiMz
2026-08-26 20:39:37 +03:00

41 lines
2.0 KiB
TypeScript

// Слой сессии и прав. Опционален: панель без учёток и ролей (плоский список
// вкладок, доступных всем) обходится BasePageProps и в этот модуль не заходит.
// "*" в permissions — владелец, доступ ко всему в обход остальных проверок.
export const OWNER_PERMISSION = '*';
export function hasPermission(permissions: string[], perm: string): boolean {
return permissions.includes(OWNER_PERMISSION) || permissions.includes(perm);
}
// Что оболочка узнаёт о вошедшем. Отдаётся эндпоинтом сессии, адрес и форма
// ответа которого задаются в конфиге панели (loadSession).
export interface Session {
user: string | null;
userId: string | null;
role: string;
permissions: string[];
}
export const EMPTY_SESSION: Session = { user: null, userId: null, role: '', permissions: [] };
// Пропсы вкладки в панели без прав: вкладке нужен только токен и снэкбар.
export interface BasePageProps {
token: string;
showMsg: (text: string) => void;
}
// Пропсы вкладки в панели с сессией и правами.
export interface SessionPageProps extends BasePageProps {
username: string;
userId: string;
role: string;
permissions: string[];
// Все permission-строки, встречающиеся у вкладок — нужно только тем вкладкам,
// которые сами выдают права; остальные это поле игнорируют.
availablePermissions: string[];
// Переключить активную вкладку по её id из metadata.json. Роутера в панели
// нет — активная вкладка это состояние оболочки.
onNavigate: (tabId: string) => void;
}