Files
DLE/backend/services/adminLogicService.js
2025-10-08 18:01:14 +03:00

223 lines
6.7 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');
/**
* Сервис логики для админских функций
* Определяет права доступа, приоритеты и логику работы с админами
*/
/**
* Определить тип отправителя на основе сессии
* @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
};