154 lines
4.7 KiB
JavaScript
154 lines
4.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/VC-HB3-Accelerator
|
|
*/
|
|
|
|
const encryptedDb = require('./encryptedDatabaseService');
|
|
const db = require('../db');
|
|
const TABLE = 'ai_assistant_settings';
|
|
const logger = require('../utils/logger');
|
|
|
|
async function getSettings() {
|
|
try {
|
|
logger.info('[aiAssistantSettingsService] getSettings called');
|
|
|
|
const settings = await encryptedDb.getData(TABLE, {}, 1, 'id');
|
|
logger.info(`[aiAssistantSettingsService] Raw settings from DB:`, settings);
|
|
|
|
const setting = settings[0] || null;
|
|
if (!setting) {
|
|
logger.warn('[aiAssistantSettingsService] No settings found in DB');
|
|
return null;
|
|
}
|
|
|
|
// Обрабатываем selected_rag_tables
|
|
if (setting.selected_rag_tables) {
|
|
try {
|
|
// Если это строка JSON, парсим её
|
|
if (typeof setting.selected_rag_tables === 'string') {
|
|
setting.selected_rag_tables = JSON.parse(setting.selected_rag_tables);
|
|
}
|
|
|
|
// Убеждаемся, что это массив
|
|
if (!Array.isArray(setting.selected_rag_tables)) {
|
|
setting.selected_rag_tables = [setting.selected_rag_tables];
|
|
}
|
|
|
|
logger.info(`[aiAssistantSettingsService] Processed selected_rag_tables:`, setting.selected_rag_tables);
|
|
} catch (parseError) {
|
|
logger.error('[aiAssistantSettingsService] Error parsing selected_rag_tables:', parseError);
|
|
setting.selected_rag_tables = [];
|
|
}
|
|
} else {
|
|
setting.selected_rag_tables = [];
|
|
}
|
|
|
|
// Обрабатываем rules_id
|
|
if (setting.rules_id && typeof setting.rules_id === 'string') {
|
|
try {
|
|
setting.rules_id = parseInt(setting.rules_id);
|
|
} catch (parseError) {
|
|
logger.error('[aiAssistantSettingsService] Error parsing rules_id:', parseError);
|
|
setting.rules_id = null;
|
|
}
|
|
}
|
|
|
|
const defaultChannelState = { web: true, telegram: true, email: true };
|
|
let enabledChannels = setting.enabled_channels;
|
|
if (typeof enabledChannels === 'string') {
|
|
try {
|
|
enabledChannels = JSON.parse(enabledChannels);
|
|
} catch (parseError) {
|
|
logger.error('[aiAssistantSettingsService] Error parsing enabled_channels:', parseError);
|
|
enabledChannels = null;
|
|
}
|
|
}
|
|
if (!enabledChannels || typeof enabledChannels !== 'object') {
|
|
enabledChannels = { ...defaultChannelState };
|
|
} else {
|
|
enabledChannels = {
|
|
...defaultChannelState,
|
|
...Object.keys(enabledChannels).reduce((acc, key) => {
|
|
acc[key] = Boolean(enabledChannels[key]);
|
|
return acc;
|
|
}, {})
|
|
};
|
|
}
|
|
setting.enabled_channels = enabledChannels;
|
|
|
|
logger.info(`[aiAssistantSettingsService] Final settings result:`, {
|
|
id: setting.id,
|
|
selected_rag_tables: setting.selected_rag_tables,
|
|
rules_id: setting.rules_id,
|
|
hasSupportEmail: setting.hasSupportEmail,
|
|
hasTelegramBot: setting.hasTelegramBot,
|
|
timestamp: setting.timestamp,
|
|
enabled_channels: setting.enabled_channels
|
|
});
|
|
|
|
return setting;
|
|
} catch (error) {
|
|
logger.error('[aiAssistantSettingsService] Error in getSettings:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async function upsertSettings({
|
|
system_prompt,
|
|
selected_rag_tables,
|
|
model,
|
|
embedding_model,
|
|
rules,
|
|
updated_by,
|
|
telegram_settings_id,
|
|
email_settings_id,
|
|
system_message,
|
|
enabled_channels
|
|
}) {
|
|
const defaultChannelState = { web: true, telegram: true, email: true };
|
|
let channelsPayload = enabled_channels;
|
|
if (!channelsPayload || typeof channelsPayload !== 'object') {
|
|
channelsPayload = { ...defaultChannelState };
|
|
} else {
|
|
channelsPayload = {
|
|
...defaultChannelState,
|
|
...Object.keys(channelsPayload).reduce((acc, key) => {
|
|
acc[key] = Boolean(channelsPayload[key]);
|
|
return acc;
|
|
}, {})
|
|
};
|
|
}
|
|
|
|
const data = {
|
|
id: 1,
|
|
system_prompt,
|
|
selected_rag_tables,
|
|
languages: ['ru'],
|
|
model,
|
|
embedding_model,
|
|
rules,
|
|
updated_at: new Date(),
|
|
updated_by,
|
|
telegram_settings_id,
|
|
email_settings_id,
|
|
system_message,
|
|
enabled_channels: channelsPayload
|
|
};
|
|
|
|
const existing = await encryptedDb.getData(TABLE, { id: 1 }, 1);
|
|
|
|
if (existing.length > 0) {
|
|
return await encryptedDb.saveData(TABLE, data, { id: 1 });
|
|
} else {
|
|
return await encryptedDb.saveData(TABLE, data);
|
|
}
|
|
}
|
|
|
|
module.exports = { getSettings, upsertSettings };
|