Files
multy-stub/server/routers/kfu-m-24-1/sber_mobile/supportApi.js
T
2025-06-14 00:16:02 +03:00

148 lines
4.5 KiB
JavaScript

const router = require('express').Router();
const { getSupabaseClient } = require('./supabaseClient');
const { SupportAgent } = require('./support-ai-agent/support-agent');
// Хранилище агентов для разных пользователей
const userAgents = new Map();
/**
* Получить или создать агента для пользователя
*/
function getUserAgent(userId) {
if (!userAgents.has(userId)) {
const config = {
threadId: userId,
temperature: 0.7
};
userAgents.set(userId, new SupportAgent(config));
}
return userAgents.get(userId);
}
// GET /api/support - Получить историю сообщений пользователя
router.get('/support', async (req, res) => {
const supabase = getSupabaseClient();
const { user_id } = req.query;
if (!user_id) {
return res.status(400).json({ error: 'user_id обязателен' });
}
try {
// Получаем все сообщения пользователя из базы данных
const { data: messages, error } = await supabase
.from('support')
.select('*')
.eq('user_id', user_id)
.order('created_at', { ascending: true });
if (error) {
return res.status(400).json({ error: error.message });
}
res.json({
messages: messages || [],
success: true
});
} catch (error) {
console.error('Ошибка в GET /support:', error);
res.status(500).json({
error: 'Внутренняя ошибка сервера',
success: false
});
}
});
// POST /api/support
router.post('/support', async (req, res) => {
const supabase = getSupabaseClient();
const { user_id, message, apartment_id } = req.body;
if (!user_id || !message) {
return res.status(400).json({ error: 'user_id и message обязательны' });
}
try {
// Сохраняем сообщение пользователя в базу данных
const { error: insertError } = await supabase
.from('support')
.insert({ user_id, message, is_from_user: true });
if (insertError) {
return res.status(400).json({ error: insertError.message });
}
// Получаем агента для пользователя
const agent = getUserAgent(user_id);
// Получаем ответ от AI-агента, передавая apartment_id
const aiResponse = await agent.processMessage(message, apartment_id);
if (!aiResponse.success) {
console.error('Ошибка AI-агента:', aiResponse.error);
return res.status(500).json({
error: 'Ошибка при генерации ответа',
reply: 'Извините, произошла ошибка. Попробуйте позже.'
});
}
// Сохраняем ответ агента в базу данных
const { error: responseError } = await supabase
.from('support')
.insert({
user_id,
message: aiResponse.content,
is_from_user: false
});
if (responseError) {
console.error('Ошибка сохранения ответа:', responseError);
// Не возвращаем ошибку пользователю, так как ответ уже сгенерирован
}
// Возвращаем ответ пользователю
res.json({
reply: aiResponse.content,
success: true
});
} catch (error) {
console.error('Ошибка в supportApi:', error);
res.status(500).json({
error: 'Внутренняя ошибка сервера',
reply: 'Извините, произошла ошибка. Попробуйте позже.'
});
}
});
// DELETE /api/support/history/:userId - Очистка истории диалога
router.delete('/support/history/:userId', async (req, res) => {
const { userId } = req.params;
try {
if (userAgents.has(userId)) {
const agent = userAgents.get(userId);
await agent.clearHistory();
res.json({
message: 'История диалога очищена',
success: true
});
} else {
res.json({
message: 'Агент для данного пользователя не найден',
success: true
});
}
} catch (error) {
console.error('Ошибка в /support/history:', error);
res.status(500).json({
error: 'Внутренняя ошибка сервера',
success: false
});
}
});
module.exports = router;