add chats api
This commit is contained in:
@@ -3,12 +3,33 @@ 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) return res.status(400).json({ error: 'building_id required' });
|
||||
const { data, error } = await supabase.from('chats').select('*').eq('building_id', building_id);
|
||||
if (error) return res.status(400).json({ error: error.message });
|
||||
res.json(data);
|
||||
|
||||
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)
|
||||
@@ -25,4 +46,191 @@ router.get('/chats/by-apartment', async (req, res) => {
|
||||
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;
|
||||
Reference in New Issue
Block a user