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

235 lines
7.3 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.
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;