Files
multy-stub/server/routers/kfu-m-24-1/sber_mobile/messages.js
T
2025-06-14 23:35:48 +03:00

235 lines
7.3 KiB
JavaScript

const router = require('express').Router();
const { getSupabaseClient } = require('./supabaseClient');
const { moderationText } = require('./chat-ai-agent/chat-moderation'); // Импортируем функцию модерации
const MODERATION_CONFIG = require('./chat-ai-agent/moderation-config'); // Импортируем конфигурацию модерации
// Добавляем middleware для логирования всех запросов к messages роутеру
// Тестовый эндпоинт для проверки работы роутера
router.get('/messages/test', (req, res) => {
res.json({
status: 'OK',
message: 'Messages router работает',
timestamp: new Date().toISOString(),
moderation_config: MODERATION_CONFIG
});
});
// Получить все сообщения в чате с информацией о пользователе
router.get('/messages', async (req, res) => {
try {
const { chat_id, limit = 50, offset = 0 } = req.query;
if (!chat_id) {
return res.status(400).json({ error: 'chat_id is required' });
}
const supabase = getSupabaseClient();
const { data, error } = await supabase
.from('messages')
.select(`
*,
user_profiles (
id,
full_name,
avatar_url
)
`)
.eq('chat_id', chat_id)
.order('created_at', { ascending: true })
.range(offset, offset + limit - 1);
if (error) {
return res.status(500).json({ error: 'Failed to fetch messages' });
}
// Получаем уникальные ID пользователей из сообщений, у которых нет профиля
const messagesWithoutProfiles = data.filter(msg => !msg.user_profiles);
const userIds = [...new Set(messagesWithoutProfiles.map(msg => msg.user_id))];
if (userIds.length > 0) {
const { data: profiles, error: profilesError } = await supabase
.from('user_profiles')
.select('id, full_name, avatar_url')
.in('id', userIds);
if (!profilesError && profiles) {
// Добавляем профили к сообщениям
data.forEach(message => {
if (!message.user_profiles) {
message.user_profiles = profiles.find(profile => profile.id === message.user_id) || null;
}
});
}
}
res.json(data);
} catch (err) {
res.status(500).json({ error: 'Unexpected error occurred' });
}
});
// Создать новое сообщение
router.post('/messages', async (req, res) => {
let supabase;
try {
supabase = getSupabaseClient();
} catch (error) {
console.error(`❌ [Message Send] Ошибка получения Supabase клиента:`, error);
return res.status(500).json({ error: 'Database connection error' });
}
const { chat_id, user_id, text } = req.body;
if (!chat_id || !user_id || !text) {
console.log(`❌ [Message Send] Отклонен: отсутствуют обязательные поля`);
console.log(`❌ [Message Send] chat_id: ${chat_id}, user_id: ${user_id}, text: ${text}`);
return res.status(400).json({
error: 'chat_id, user_id, and text are required'
});
}
// Создаем сообщение
const { data: newMessage, error } = await supabase
.from('messages')
.insert({ chat_id, user_id, text })
.select('*')
.single();
if (error) {
console.error(`❌ [Message Send] Ошибка сохранения в Supabase:`, error);
return res.status(400).json({ error: error.message });
}
// Получаем профиль пользователя
const { data: userProfile, error: profileError } = await supabase
.from('user_profiles')
.select('id, full_name, avatar_url')
.eq('id', user_id)
.single();
if (profileError) {
console.log(`⚠️ [Message Send] Профиль пользователя не найден:`, profileError);
}
// Объединяем сообщение с профилем
const data = {
...newMessage,
user_profiles: userProfile || null
};
res.json(data);
});
// Получить конкретное сообщение
router.get('/messages/:message_id', async (req, res) => {
const supabase = getSupabaseClient();
const { message_id } = req.params;
// Получаем сообщение
const { data: message, error } = await supabase
.from('messages')
.select('*')
.eq('id', message_id)
.single();
if (error) return res.status(400).json({ error: error.message });
// Получаем профиль пользователя
const { data: userProfile } = await supabase
.from('user_profiles')
.select('id, full_name, avatar_url')
.eq('id', message.user_id)
.single();
// Объединяем сообщение с профилем
const data = {
...message,
user_profiles: userProfile || null
};
res.json(data);
});
// Получить последние сообщения для каждого чата (для списка чатов)
router.get('/chats/last-messages', async (req, res) => {
const supabase = getSupabaseClient();
const { building_id } = req.query;
if (!building_id) {
return res.status(400).json({ error: 'building_id required' });
}
// Получаем чаты и их последние сообщения через обычные запросы
const { data: chats, error: chatsError } = await supabase
.from('chats')
.select('*')
.eq('building_id', building_id);
if (chatsError) return res.status(400).json({ error: chatsError.message });
// Для каждого чата получаем последнее сообщение
const chatsWithMessages = await Promise.all(
chats.map(async (chat) => {
const { data: lastMessage } = await supabase
.from('messages')
.select(`
*,
user_profiles:user_id (
id,
full_name,
avatar_url
)
`)
.eq('chat_id', chat.id)
.order('created_at', { ascending: false })
.limit(1)
.single();
return {
...chat,
last_message: lastMessage || null
};
})
);
res.json(chatsWithMessages);
});
// Удалить сообщение (только для автора)
router.delete('/messages/:message_id', async (req, res) => {
const supabase = getSupabaseClient();
const { message_id } = req.params;
const { user_id } = req.body;
if (!user_id) {
return res.status(400).json({ error: 'user_id required' });
}
// Проверяем, что пользователь является автором сообщения
const { data: message, error: fetchError } = await supabase
.from('messages')
.select('user_id')
.eq('id', message_id)
.single();
if (fetchError) return res.status(400).json({ error: fetchError.message });
if (message.user_id !== user_id) {
return res.status(403).json({ error: 'You can only delete your own messages' });
}
const { error } = await supabase
.from('messages')
.delete()
.eq('id', message_id);
if (error) return res.status(400).json({ error: error.message });
res.json({ success: true, message: 'Message deleted successfully' });
});
module.exports = router;