Files
multy-stub/server/routers/procurement/routes/messages.js

131 lines
4.2 KiB
JavaScript

const express = require('express')
const router = express.Router()
const Message = require('../models/Message')
const { verifyToken } = require('../middleware/auth')
// Mock данные для тредов
const mockThreads = [
{
id: 'thread-1',
lastMessage: 'Добрый день! Интересует поставка металлопроката.',
lastMessageAt: new Date(Date.now() - 3600000).toISOString(),
participants: ['company-123', 'company-1']
},
{
id: 'thread-2',
lastMessage: 'Можем предложить скидку 15% на оптовую партию.',
lastMessageAt: new Date(Date.now() - 7200000).toISOString(),
participants: ['company-123', 'company-2']
},
{
id: 'thread-3',
lastMessage: 'Спасибо за предложение, рассмотрим.',
lastMessageAt: new Date(Date.now() - 86400000).toISOString(),
participants: ['company-123', 'company-4']
}
];
// Mock данные для сообщений
const mockMessages = {
'thread-1': [
{ id: 'msg-1', senderCompanyId: 'company-1', text: 'Добрый день! Интересует поставка металлопроката.', timestamp: new Date(Date.now() - 3600000).toISOString() },
{ id: 'msg-2', senderCompanyId: 'company-123', text: 'Здравствуйте! Какой объем вас интересует?', timestamp: new Date(Date.now() - 3500000).toISOString() }
],
'thread-2': [
{ id: 'msg-3', senderCompanyId: 'company-2', text: 'Можем предложить скидку 15% на оптовую партию.', timestamp: new Date(Date.now() - 7200000).toISOString() }
],
'thread-3': [
{ id: 'msg-4', senderCompanyId: 'company-4', text: 'Спасибо за предложение, рассмотрим.', timestamp: new Date(Date.now() - 86400000).toISOString() }
]
};
// Получить все потоки для компании
router.get('/threads', verifyToken, async (req, res) => {
try {
// Попытка получить из MongoDB
try {
const threads = await Message.aggregate([
{
$match: {
$or: [
{ senderCompanyId: req.user.companyId },
{ recipientCompanyId: req.user.companyId }
]
}
},
{
$sort: { timestamp: -1 }
},
{
$group: {
_id: '$threadId',
lastMessage: { $first: '$text' },
lastMessageAt: { $first: '$timestamp' }
}
}
]);
if (threads && threads.length > 0) {
return res.json(threads);
}
} catch (dbError) {
console.log('MongoDB unavailable, using mock data');
}
// Fallback на mock данные
res.json(mockThreads);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Получить сообщения потока
router.get('/threads/:threadId', verifyToken, async (req, res) => {
try {
// Попытка получить из MongoDB
try {
const messages = await Message.find({ threadId: req.params.threadId })
.sort({ timestamp: 1 })
.populate('senderCompanyId', 'shortName fullName')
.populate('recipientCompanyId', 'shortName fullName');
if (messages && messages.length > 0) {
return res.json(messages);
}
} catch (dbError) {
console.log('MongoDB unavailable, using mock data');
}
// Fallback на mock данные
const threadMessages = mockMessages[req.params.threadId] || [];
res.json(threadMessages);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Отправить сообщение
router.post('/', verifyToken, async (req, res) => {
try {
const { threadId, text, recipientCompanyId } = req.body;
if (!text || !threadId) {
return res.status(400).json({ error: 'Text and threadId required' });
}
const message = await Message.create({
threadId,
senderCompanyId: req.user.companyId,
recipientCompanyId,
text,
timestamp: new Date()
});
res.status(201).json(message);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
module.exports = router