diff --git a/backend/db/migrations/032_create_is_rag_source_table.sql b/backend/db/migrations/032_create_is_rag_source_table.sql new file mode 100644 index 0000000..81b8d8c --- /dev/null +++ b/backend/db/migrations/032_create_is_rag_source_table.sql @@ -0,0 +1,11 @@ +-- Создание справочной таблицы is_rag_source +CREATE TABLE IF NOT EXISTS is_rag_source ( + id SERIAL PRIMARY KEY, + name VARCHAR(64) NOT NULL UNIQUE +); + +-- Заполнение начальными значениями +INSERT INTO is_rag_source (name) VALUES + ('Да'), + ('Нет') +ON CONFLICT (name) DO NOTHING; \ No newline at end of file diff --git a/backend/db/migrations/033_add_is_rag_source_id_to_user_tables.sql b/backend/db/migrations/033_add_is_rag_source_id_to_user_tables.sql new file mode 100644 index 0000000..ee1bcc3 --- /dev/null +++ b/backend/db/migrations/033_add_is_rag_source_id_to_user_tables.sql @@ -0,0 +1,2 @@ +ALTER TABLE user_tables +ADD COLUMN is_rag_source_id INTEGER REFERENCES is_rag_source(id) DEFAULT 2; -- 2 = 'Нет' \ No newline at end of file diff --git a/backend/routes/chat.js b/backend/routes/chat.js index 2a9b1ac..c7fa055 100644 --- a/backend/routes/chat.js +++ b/backend/routes/chat.js @@ -73,16 +73,16 @@ async function processGuestMessages(userId, guestId) { conversation = lastConvResult.rows[0]; } else { // Если нет ни одного диалога, создаём новый - const firstMessage = guestMessages[0]; - const title = firstMessage.content - ? (firstMessage.content.length > 30 ? `${firstMessage.content.substring(0, 30)}...` : firstMessage.content) - : (firstMessage.attachment_filename ? `Файл: ${firstMessage.attachment_filename}` : 'Новый диалог'); - const newConversationResult = await db.getQuery()( - 'INSERT INTO conversations (user_id, title) VALUES ($1, $2) RETURNING *', - [userId, title] - ); + const firstMessage = guestMessages[0]; + const title = firstMessage.content + ? (firstMessage.content.length > 30 ? `${firstMessage.content.substring(0, 30)}...` : firstMessage.content) + : (firstMessage.attachment_filename ? `Файл: ${firstMessage.attachment_filename}` : 'Новый диалог'); + const newConversationResult = await db.getQuery()( + 'INSERT INTO conversations (user_id, title) VALUES ($1, $2) RETURNING *', + [userId, title] + ); conversation = newConversationResult.rows[0]; - logger.info(`Created new conversation ${conversation.id} for guest messages`); + logger.info(`Created new conversation ${conversation.id} for guest messages`); } // --- КОНЕЦ блока поиска/создания диалога --- @@ -151,18 +151,18 @@ async function processGuestMessages(userId, guestId) { rules ? rules.rules : null ); logger.info('AI response for guest message received' + (aiResponseContent ? '' : ' (empty)'), { conversationId: conversation.id }); - if (aiResponseContent) { + if (aiResponseContent) { await db.getQuery()( - `INSERT INTO messages + `INSERT INTO messages (conversation_id, user_id, content, sender_type, role, channel) VALUES ($1, $2, $3, 'assistant', 'assistant', 'web')`, [conversation.id, userId, aiResponseContent] - ); + ); logger.info('AI response for guest message saved', { conversationId: conversation.id }); - } + } } catch (aiError) { logger.error('Error getting or saving AI response for guest message:', aiError); - } + } } } // --- конец блока генерации ответа ИИ --- @@ -361,16 +361,16 @@ router.post('/message', requireAuth, upload.array('attachments'), async (req, re conversationId = conversation.id; } else { // Создаем новый диалог, если нет ни одного - const title = message - ? (message.length > 50 ? `${message.substring(0, 50)}...` : message) - : (file ? `Файл: ${file.originalname}` : 'Новый диалог'); - const newConvResult = await db.getQuery()( - 'INSERT INTO conversations (user_id, title) VALUES ($1, $2) RETURNING *', - [userId, title] - ); - conversation = newConvResult.rows[0]; - conversationId = conversation.id; - logger.info('Created new conversation', { conversationId, userId }); + const title = message + ? (message.length > 50 ? `${message.substring(0, 50)}...` : message) + : (file ? `Файл: ${file.originalname}` : 'Новый диалог'); + const newConvResult = await db.getQuery()( + 'INSERT INTO conversations (user_id, title) VALUES ($1, $2) RETURNING *', + [userId, title] + ); + conversation = newConvResult.rows[0]; + conversationId = conversation.id; + logger.info('Created new conversation', { conversationId, userId }); } } diff --git a/backend/routes/tables.js b/backend/routes/tables.js index eb094bf..225f105 100644 --- a/backend/routes/tables.js +++ b/backend/routes/tables.js @@ -23,10 +23,10 @@ router.get('/', async (req, res, next) => { // Создать новую таблицу (доступно всем) router.post('/', async (req, res, next) => { try { - const { name, description } = req.body; + const { name, description, isRagSourceId } = req.body; const result = await db.getQuery()( - 'INSERT INTO user_tables (name, description) VALUES ($1, $2) RETURNING *', - [name, description || null] + 'INSERT INTO user_tables (name, description, is_rag_source_id) VALUES ($1, $2, $3) RETURNING *', + [name, description || null, isRagSourceId || 2] ); res.json(result.rows[0]); } catch (err) { @@ -38,10 +38,12 @@ router.post('/', async (req, res, next) => { router.get('/:id', async (req, res, next) => { try { const tableId = req.params.id; + const tableMetaResult = await db.getQuery()('SELECT name, description FROM user_tables WHERE id = $1', [tableId]); + const tableMeta = tableMetaResult.rows[0] || { name: '', description: '' }; const columns = (await db.getQuery()('SELECT * FROM user_columns WHERE table_id = $1 ORDER BY "order" ASC, id ASC', [tableId])).rows; const rows = (await db.getQuery()('SELECT * FROM user_rows WHERE table_id = $1 ORDER BY id', [tableId])).rows; const cellValues = (await db.getQuery()('SELECT * FROM user_cell_values WHERE row_id IN (SELECT id FROM user_rows WHERE table_id = $1)', [tableId])).rows; - res.json({ columns, rows, cellValues }); + res.json({ name: tableMeta.name, description: tableMeta.description, columns, rows, cellValues }); } catch (err) { next(err); } @@ -181,14 +183,15 @@ router.patch('/column/:columnId', async (req, res, next) => { router.patch('/:id', async (req, res, next) => { try { const tableId = req.params.id; - const { name, description } = req.body; + const { name, description, isRagSourceId } = req.body; const result = await db.getQuery()( `UPDATE user_tables SET name = COALESCE($1, name), description = COALESCE($2, description), + is_rag_source_id = COALESCE($3, is_rag_source_id), updated_at = NOW() - WHERE id = $3 RETURNING *`, - [name, description, tableId] + WHERE id = $4 RETURNING *`, + [name, description, isRagSourceId, tableId] ); res.json(result.rows[0]); } catch (err) { diff --git a/frontend/src/components/tables/CreateTableModal.vue b/frontend/src/components/tables/CreateTableModal.vue deleted file mode 100644 index aaf1fb4..0000000 --- a/frontend/src/components/tables/CreateTableModal.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/components/tables/DynamicTablesModal.vue b/frontend/src/components/tables/DynamicTablesModal.vue deleted file mode 100644 index e9407ab..0000000 --- a/frontend/src/components/tables/DynamicTablesModal.vue +++ /dev/null @@ -1,101 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/components/tables/UserTableView.vue b/frontend/src/components/tables/UserTableView.vue index 105d00b..76f4363 100644 --- a/frontend/src/components/tables/UserTableView.vue +++ b/frontend/src/components/tables/UserTableView.vue @@ -1,4 +1,8 @@