Files
DLE/backend/services/adminLogicService.js
2025-10-23 21:44:14 +03:00

172 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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/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
};