Files
multy-stub/server/routers/kfu-m-24-1/sber_mobile/chats.js
T
2025-06-12 21:04:12 +03:00

218 lines
6.2 KiB
JavaScript

const router = require('express').Router();
const { getSupabaseClient } = require('./supabaseClient');
// Получить все чаты по дому
router.get('/chats', async (req, res) => {
const supabase = getSupabaseClient();
const { building_id } = req.query;
if (!building_id) {
return res.status(400).json({ error: 'building_id required' });
}
try {
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 || []);
} catch (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) => {
const supabase = getSupabaseClient();
const { chat_id } = req.params;
try {
// Получаем последнее сообщение
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') {
data = null;
} else if (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
};
}
res.json(data);
} catch (err) {
res.status(500).json({ error: 'Internal server error' });
}
});
module.exports = router;