172 lines
6.0 KiB
JavaScript
172 lines
6.0 KiB
JavaScript
/**
|
||
* Copyright (c) 2024-2026 Тарабанов Александр Викторович
|
||
* 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
|
||
*/
|
||
|
||
const logger = require('../utils/logger');
|
||
|
||
/**
|
||
* Сервис логики для админских функций
|
||
* Определяет права доступа, приоритеты и логику работы с админами
|
||
*/
|
||
|
||
/**
|
||
* Определить, нужно ли генерировать AI ответ
|
||
* @param {Object} params - Параметры
|
||
* @param {string} params.senderType - Тип отправителя (user/admin)
|
||
* @param {number} params.userId - ID пользователя
|
||
* @param {number} params.recipientId - ID получателя
|
||
* @param {string} params.channel - Канал (web/telegram/email)
|
||
* @returns {boolean}
|
||
*/
|
||
function shouldGenerateAiReply(params) {
|
||
const { senderType, userId, recipientId } = params;
|
||
|
||
// Если recipientId не указан или равен userId - это личный чат с ИИ
|
||
// ИИ должен отвечать в личных чатах
|
||
if (!recipientId || recipientId === userId) {
|
||
return true;
|
||
}
|
||
|
||
// Если recipientId отличается от userId - это публичный чат между пользователями
|
||
// ИИ НЕ должен отвечать на сообщения между пользователями
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Проверить, может ли пользователь писать в беседу
|
||
* @param {Object} params - Параметры
|
||
* @param {Object} params.userAccessLevel - Уровень доступа пользователя
|
||
* @param {number} params.userId - ID пользователя
|
||
* @param {number} params.conversationUserId - ID владельца беседы
|
||
* @returns {boolean}
|
||
*/
|
||
function canWriteToConversation(params) {
|
||
const { userAccessLevel, userId, conversationUserId } = params;
|
||
|
||
// Админ может писать в любую беседу
|
||
if (userAccessLevel?.hasAccess) {
|
||
return true;
|
||
}
|
||
|
||
// Обычный пользователь может писать только в свою беседу
|
||
return userId === conversationUserId;
|
||
}
|
||
|
||
|
||
/**
|
||
* Проверить, может ли пользователь выполнить админское действие
|
||
* @param {Object} params - Параметры
|
||
* @param {string} params.role - Роль пользователя ('editor', 'readonly', 'user')
|
||
* @param {string} params.action - Название действия
|
||
* @returns {boolean}
|
||
*/
|
||
function canPerformAdminAction(params) {
|
||
const { role, action } = params;
|
||
|
||
// Обычный пользователь не может выполнять админские действия
|
||
if (role === 'user') {
|
||
return false;
|
||
}
|
||
|
||
// Список действий только для editor (с правами редактирования)
|
||
const editorOnlyActions = [
|
||
'delete_message_history',
|
||
'manage_users',
|
||
'manage_ai_settings',
|
||
'broadcast_message', // ← Массовая рассылка только для editor!
|
||
'delete_user',
|
||
'modify_user_settings'
|
||
];
|
||
|
||
// Список действий для readonly (только просмотр и личные чаты)
|
||
const readonlyActions = [
|
||
'view_all_conversations', // Просмотр всех бесед
|
||
'create_admin_chat', // Создание приватных чатов между админами
|
||
'view_admin_chat' // Просмотр приватных чатов
|
||
];
|
||
|
||
// readonly может только просматривать и общаться
|
||
if (role === 'readonly') {
|
||
return readonlyActions.includes(action);
|
||
}
|
||
|
||
// editor может все (и свои действия, и readonly действия)
|
||
if (role === 'editor' || role === 'readonly') {
|
||
return editorOnlyActions.includes(action) || readonlyActions.includes(action);
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Получить настройки админа с учетом роли
|
||
* @param {Object} params - Параметры
|
||
* @param {string} params.role - Роль пользователя ('editor', 'readonly', 'user')
|
||
* @returns {Object} Настройки прав доступа
|
||
*/
|
||
function getAdminSettings(params) {
|
||
const { role } = params;
|
||
|
||
// Editor - полные права
|
||
if (role === 'editor' || role === 'readonly') {
|
||
return {
|
||
role: 'editor',
|
||
roleDisplay: 'Редактор',
|
||
canWriteToAnyConversation: true,
|
||
canViewAllConversations: true,
|
||
canManageUsers: true,
|
||
canManageAISettings: true,
|
||
canBroadcast: true,
|
||
canDeleteUsers: true,
|
||
canModifySettings: true,
|
||
canCreateAdminChat: true
|
||
};
|
||
}
|
||
|
||
// Readonly - только просмотр и общение
|
||
if (role === 'readonly') {
|
||
return {
|
||
role: 'readonly',
|
||
roleDisplay: 'Только чтение',
|
||
canWriteToAnyConversation: false, // Только в свои беседы
|
||
canViewAllConversations: true, // Может просматривать все
|
||
canManageUsers: false,
|
||
canManageAISettings: false,
|
||
canBroadcast: false,
|
||
canDeleteUsers: false,
|
||
canModifySettings: false,
|
||
canCreateAdminChat: true // Может создавать приватные чаты с админами
|
||
};
|
||
}
|
||
|
||
// User - минимальные права
|
||
return {
|
||
role: 'user',
|
||
roleDisplay: 'Пользователь',
|
||
canWriteToAnyConversation: false,
|
||
canViewAllConversations: false,
|
||
canManageUsers: false,
|
||
canManageAISettings: false,
|
||
canBroadcast: false,
|
||
canDeleteUsers: false,
|
||
canModifySettings: false,
|
||
canCreateAdminChat: false
|
||
};
|
||
}
|
||
|
||
module.exports = {
|
||
shouldGenerateAiReply,
|
||
canWriteToConversation,
|
||
canPerformAdminAction,
|
||
getAdminSettings
|
||
};
|
||
|