const router = require('express').Router(); const { getSupabaseClient } = require('./supabaseClient'); // Получить все чаты по дому router.get('/chats', async (req, res) => { console.log('🏠 [Server] GET /chats запрос получен'); console.log('🏠 [Server] Query параметры:', req.query); const supabase = getSupabaseClient(); const { building_id } = req.query; if (!building_id) { console.log('❌ [Server] Ошибка: building_id обязателен'); return res.status(400).json({ error: 'building_id required' }); } try { console.log('🔍 [Server] Выполняем запрос к Supabase для здания:', building_id); const { data, error } = await supabase.from('chats').select('*').eq('building_id', building_id); if (error) { console.log('❌ [Server] Ошибка Supabase:', error); return res.status(400).json({ error: error.message }); } console.log('✅ [Server] Чаты получены:', data?.length || 0, 'шт.'); res.json(data || []); } catch (err) { console.log('❌ [Server] Неожиданная ошибка:', err); res.status(500).json({ error: 'Internal server error' }); } }); // Получить все чаты по квартире (через building_id) router.get('/chats/by-apartment', async (req, res) => { const supabase = getSupabaseClient(); const { apartment_id } = req.query; if (!apartment_id) return res.status(400).json({ error: 'apartment_id required' }); // Получаем building_id квартиры и сразу чаты этого дома const { data, error } = await supabase .from('chats') .select('*, apartments!inner(id, building_id)') .eq('apartments.id', apartment_id); if (error) return res.status(400).json({ error: error.message }); res.json(data); }); // Создать новый чат router.post('/chats', async (req, res) => { const supabase = getSupabaseClient(); const { building_id, name } = req.body; if (!building_id) { return res.status(400).json({ error: 'building_id is required' }); } const { data, error } = await supabase .from('chats') .insert({ building_id, name }) .select() .single(); if (error) return res.status(400).json({ error: error.message }); res.json(data); }); // Получить конкретный чат по ID router.get('/chats/:chat_id', async (req, res) => { const supabase = getSupabaseClient(); const { chat_id } = req.params; const { data, error } = await supabase .from('chats') .select('*') .eq('id', chat_id) .single(); if (error) return res.status(400).json({ error: error.message }); res.json(data); }); // Обновить чат router.put('/chats/:chat_id', async (req, res) => { const supabase = getSupabaseClient(); const { chat_id } = req.params; const { name } = req.body; const { data, error } = await supabase .from('chats') .update({ name }) .eq('id', chat_id) .select() .single(); if (error) return res.status(400).json({ error: error.message }); res.json(data); }); // Удалить чат router.delete('/chats/:chat_id', async (req, res) => { const supabase = getSupabaseClient(); const { chat_id } = req.params; const { error } = await supabase .from('chats') .delete() .eq('id', chat_id); if (error) return res.status(400).json({ error: error.message }); res.json({ success: true, message: 'Chat deleted successfully' }); }); // Получить статистику чата (количество сообщений, участников и т.д.) router.get('/chats/:chat_id/stats', async (req, res) => { const supabase = getSupabaseClient(); const { chat_id } = req.params; try { // Получаем количество сообщений const { count: messageCount, error: messageError } = await supabase .from('messages') .select('*', { count: 'exact', head: true }) .eq('chat_id', chat_id); if (messageError) throw messageError; // Получаем информацию о чате с домом const { data: chatInfo, error: chatError } = await supabase .from('chats') .select(` *, buildings ( id, name, address, apartments ( apartment_residents ( user_id ) ) ) `) .eq('id', chat_id) .single(); if (chatError) throw chatError; // Собираем уникальные user_id жителей дома const userIds = new Set(); chatInfo.buildings.apartments.forEach(apartment => { apartment.apartment_residents.forEach(resident => { userIds.add(resident.user_id); }); }); // Получаем профили всех жителей let uniqueResidents = []; if (userIds.size > 0) { const { data: profiles } = await supabase .from('user_profiles') .select('id, full_name, avatar_url') .in('id', Array.from(userIds)); uniqueResidents = profiles || []; } res.json({ chat_id, chat_name: chatInfo.name, building: { id: chatInfo.buildings.id, name: chatInfo.buildings.name, address: chatInfo.buildings.address }, message_count: messageCount || 0, total_residents: uniqueResidents.length, residents: uniqueResidents }); } catch (error) { res.status(400).json({ error: error.message }); } }); // Получить последнее сообщение в чате router.get('/chats/:chat_id/last-message', async (req, res) => { console.log('💬 [Server] GET /chats/:chat_id/last-message запрос получен'); console.log('💬 [Server] Chat ID:', req.params.chat_id); const supabase = getSupabaseClient(); const { chat_id } = req.params; try { console.log('🔍 [Server] Выполняем запрос последнего сообщения для чата:', chat_id); // Получаем последнее сообщение const { data: lastMessage, error } = await supabase .from('messages') .select('*') .eq('chat_id', chat_id) .order('created_at', { ascending: false }) .limit(1) .single(); let data = null; if (error && error.code === 'PGRST116') { console.log('ℹ️ [Server] Сообщений в чате нет (PGRST116)'); data = null; } else if (error) { console.log('❌ [Server] Ошибка Supabase при получении последнего сообщения:', error); return res.status(400).json({ error: error.message }); } else if (lastMessage) { // Получаем профиль пользователя для сообщения const { data: userProfile } = await supabase .from('user_profiles') .select('id, full_name, avatar_url') .eq('id', lastMessage.user_id) .single(); // Объединяем сообщение с профилем data = { ...lastMessage, user_profiles: userProfile || null }; console.log('✅ [Server] Последнее сообщение получено для чата:', chat_id); } res.json(data); } catch (err) { console.log('❌ [Server] Неожиданная ошибка при получении последнего сообщения:', err); res.status(500).json({ error: 'Internal server error' }); } }); module.exports = router;