223 lines
6.7 KiB
JavaScript
223 lines
6.7 KiB
JavaScript
/**
|
||
* 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');
|
||
|
||
/**
|
||
* Сервис логики для админских функций
|
||
* Определяет права доступа, приоритеты и логику работы с админами
|
||
*/
|
||
|
||
/**
|
||
* Определить тип отправителя на основе сессии
|
||
* @param {Object} session - Сессия пользователя
|
||
* @returns {Object} { senderType, role }
|
||
*/
|
||
function determineSenderType(session) {
|
||
if (!session) {
|
||
return { senderType: 'user', role: 'user' };
|
||
}
|
||
|
||
if (session.isAdmin === true) {
|
||
return { senderType: 'admin', role: 'admin' };
|
||
}
|
||
|
||
return { senderType: 'user', role: 'user' };
|
||
}
|
||
|
||
/**
|
||
* Определить, нужно ли генерировать 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;
|
||
|
||
// Обычные пользователи всегда получают AI ответ
|
||
if (senderType !== 'admin') {
|
||
return true;
|
||
}
|
||
|
||
// Админ, пишущий себе, получает AI ответ
|
||
if (userId === recipientId) {
|
||
return true;
|
||
}
|
||
|
||
// Админ, пишущий другому пользователю, не получает AI ответ
|
||
// (это личное сообщение от админа)
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Проверить, может ли пользователь писать в беседу
|
||
* @param {Object} params - Параметры
|
||
* @param {boolean} params.isAdmin - Является ли админом
|
||
* @param {number} params.userId - ID пользователя
|
||
* @param {number} params.conversationUserId - ID владельца беседы
|
||
* @returns {boolean}
|
||
*/
|
||
function canWriteToConversation(params) {
|
||
const { isAdmin, userId, conversationUserId } = params;
|
||
|
||
// Админ может писать в любую беседу
|
||
if (isAdmin) {
|
||
return true;
|
||
}
|
||
|
||
// Обычный пользователь может писать только в свою беседу
|
||
return userId === conversationUserId;
|
||
}
|
||
|
||
/**
|
||
* Получить приоритет запроса для очереди AI
|
||
* @param {Object} params - Параметры
|
||
* @param {boolean} params.isAdmin - Является ли админом
|
||
* @param {string} params.message - Текст сообщения
|
||
* @param {Array} params.history - История сообщений
|
||
* @returns {number} Приоритет (чем выше, тем важнее)
|
||
*/
|
||
function getRequestPriority(params) {
|
||
const { isAdmin, message, history = [] } = params;
|
||
|
||
let priority = 10; // Базовый приоритет
|
||
|
||
// Админ получает повышенный приоритет
|
||
if (isAdmin) {
|
||
priority += 5;
|
||
}
|
||
|
||
// Срочные ключевые слова
|
||
const urgentKeywords = ['срочно', 'urgent', 'помогите', 'help', 'критично', 'critical'];
|
||
const messageLC = (message || '').toLowerCase();
|
||
|
||
if (urgentKeywords.some(keyword => messageLC.includes(keyword))) {
|
||
priority += 10;
|
||
}
|
||
|
||
// Короткие сообщения обрабатываются быстрее
|
||
if (message && message.length < 50) {
|
||
priority += 5;
|
||
}
|
||
|
||
// Первое сообщение в беседе
|
||
if (!history || history.length === 0) {
|
||
priority += 3;
|
||
}
|
||
|
||
return priority;
|
||
}
|
||
|
||
/**
|
||
* Проверить, может ли пользователь выполнить админское действие
|
||
* @param {Object} params - Параметры
|
||
* @param {boolean} params.isAdmin - Является ли админом
|
||
* @param {string} params.action - Название действия
|
||
* @returns {boolean}
|
||
*/
|
||
function canPerformAdminAction(params) {
|
||
const { isAdmin, action } = params;
|
||
|
||
// Только админ может выполнять админские действия
|
||
if (!isAdmin) {
|
||
return false;
|
||
}
|
||
|
||
// Список разрешенных админских действий
|
||
const allowedActions = [
|
||
'delete_message_history',
|
||
'view_all_conversations',
|
||
'manage_users',
|
||
'manage_ai_settings',
|
||
'broadcast_message',
|
||
'delete_user',
|
||
'modify_user_settings'
|
||
];
|
||
|
||
return allowedActions.includes(action);
|
||
}
|
||
|
||
/**
|
||
* Получить настройки админа
|
||
* @param {Object} params - Параметры
|
||
* @param {boolean} params.isAdmin - Является ли админом
|
||
* @param {string} params.channel - Канал
|
||
* @returns {Object} Настройки
|
||
*/
|
||
function getAdminSettings(params) {
|
||
const { isAdmin } = params;
|
||
|
||
if (!isAdmin) {
|
||
// Ограниченные права для обычного пользователя
|
||
return {
|
||
canWriteToAnyConversation: false,
|
||
canViewAllConversations: false,
|
||
canManageUsers: false,
|
||
canManageAISettings: false,
|
||
aiReplyPriority: 0
|
||
};
|
||
}
|
||
|
||
// Полные права для админа
|
||
return {
|
||
canWriteToAnyConversation: true,
|
||
canViewAllConversations: true,
|
||
canManageUsers: true,
|
||
canManageAISettings: true,
|
||
aiReplyPriority: 15
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Логирование админского действия
|
||
* @param {Object} params - Параметры
|
||
* @param {number} params.adminId - ID админа
|
||
* @param {string} params.action - Действие
|
||
* @param {Object} params.details - Детали
|
||
*/
|
||
function logAdminAction(params) {
|
||
const { adminId, action, details } = params;
|
||
|
||
logger.info('[AdminLogic] Админское действие:', {
|
||
adminId,
|
||
action,
|
||
details,
|
||
timestamp: new Date().toISOString()
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Проверить, является ли сообщение от админа личным
|
||
* @param {Object} params - Параметры
|
||
* @returns {boolean}
|
||
*/
|
||
function isPersonalAdminMessage(params) {
|
||
const { senderType, userId, recipientId } = params;
|
||
|
||
return senderType === 'admin' && userId !== recipientId;
|
||
}
|
||
|
||
module.exports = {
|
||
determineSenderType,
|
||
shouldGenerateAiReply,
|
||
canWriteToConversation,
|
||
getRequestPriority,
|
||
canPerformAdminAction,
|
||
getAdminSettings,
|
||
logAdminAction,
|
||
isPersonalAdminMessage
|
||
};
|
||
|