/** * Copyright (c) 2024-2025 Тарабанов Александр Викторович * All rights reserved. * * This software is proprietary and confidential. * Unauthorized copying, modification, or distribution is prohibited. * * For licensing inquiries: info@hb3-accelerator.com * Website: https://hb3-accelerator.com * GitHub: https://github.com/VC-HB3-Accelerator */ import { computed } from 'vue'; import { useAuthContext } from './useAuth'; import { PERMISSIONS, ROLES, hasPermission as checkPermission, getRoleDescription } from './permissions.js'; /** * Composable для работы с правами доступа * Использует единую матрицу прав из shared/permissions.js * @returns {Object} - Объект с функциями для проверки прав доступа */ export function usePermissions() { const { userAccessLevel, isAuthenticated } = useAuthContext(); /** * Текущая роль пользователя */ const currentRole = computed(() => { if (!isAuthenticated.value) { return ROLES.GUEST; // Неавторизованный } // Если userAccessLevel не определен, возвращаем USER (авторизованный пользователь) return userAccessLevel.value?.level || ROLES.USER; }); /** * Количество токенов пользователя */ const tokenCount = computed(() => { return userAccessLevel.value?.tokenCount || 0; }); /** * Универсальная проверка любого права * @param {string} permission - Право для проверки * @returns {boolean} */ const hasPermission = (permission) => { return checkPermission(currentRole.value, permission); }; // ======================================================================== // Computed проверки для частого использования // ======================================================================== // Просмотр данных const canViewData = computed(() => hasPermission(PERMISSIONS.VIEW_DATA)); const canViewContacts = computed(() => hasPermission(PERMISSIONS.VIEW_CONTACTS)); const canViewCrm = computed(() => hasPermission(PERMISSIONS.VIEW_CRM)); // Редактирование и удаление const canEditData = computed(() => hasPermission(PERMISSIONS.EDIT_USER_DATA)); const canEditContacts = computed(() => hasPermission(PERMISSIONS.EDIT_CONTACTS)); const canDeleteData = computed(() => hasPermission(PERMISSIONS.DELETE_USER_DATA)); const canDeleteMessages = computed(() => hasPermission(PERMISSIONS.DELETE_MESSAGES)); // Коммуникация const canSendToUsers = computed(() => hasPermission(PERMISSIONS.SEND_TO_USERS)); const canChatWithAdmins = computed(() => hasPermission(PERMISSIONS.CHAT_WITH_ADMINS)); const canGenerateAI = computed(() => hasPermission(PERMISSIONS.GENERATE_AI_REPLIES)); const canBroadcast = computed(() => hasPermission(PERMISSIONS.BROADCAST)); // Управление const canManageTags = computed(() => hasPermission(PERMISSIONS.MANAGE_TAGS)); const canBlockUsers = computed(() => hasPermission(PERMISSIONS.BLOCK_USERS)); const canManageSettings = computed(() => hasPermission(PERMISSIONS.MANAGE_SETTINGS)); const currentLevel = computed(() => currentRole.value); /** * Получает описание текущего уровня доступа */ const getLevelDescription = (level) => { return getRoleDescription(level); }; /** * Получает CSS класс для уровня доступа */ const getLevelClass = (level) => { switch (level) { case ROLES.READONLY: return 'access-readonly'; case ROLES.EDITOR: return 'access-editor'; case ROLES.USER: return 'access-user'; case ROLES.GUEST: return 'access-guest'; default: return 'access-user'; } }; return { // Главная функция hasPermission, // Информация о роли currentRole, currentLevel, // alias для совместимости tokenCount, // Просмотр canViewData, canViewContacts, canViewCrm, // Редактирование canEditData, canEditContacts, canDeleteData, canDeleteMessages, // Коммуникация canSendToUsers, canChatWithAdmins, canGenerateAI, canBroadcast, // Управление canManageTags, canBlockUsers, canManageSettings, // Утилиты getLevelDescription, getLevelClass, // Константы ROLES, PERMISSIONS }; }