new procurement
This commit is contained in:
@@ -1,110 +1,99 @@
|
||||
const express = require('express')
|
||||
const router = express.Router()
|
||||
const Message = require('../models/Message')
|
||||
const { verifyToken } = require('../middleware/auth')
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
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']
|
||||
}
|
||||
];
|
||||
// In-memory storage
|
||||
let messages = [];
|
||||
|
||||
// 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() }
|
||||
]
|
||||
};
|
||||
|
||||
// Получить все потоки для компании
|
||||
// GET /messages/threads - получить все потоки для компании
|
||||
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' }
|
||||
}
|
||||
const companyId = req.user.companyId;
|
||||
|
||||
// Группировка сообщений по threadId
|
||||
const threads = {};
|
||||
|
||||
messages.forEach(msg => {
|
||||
if (msg.senderCompanyId === companyId || msg.recipientCompanyId === companyId) {
|
||||
if (!threads[msg.threadId]) {
|
||||
threads[msg.threadId] = msg;
|
||||
}
|
||||
]);
|
||||
|
||||
if (threads && threads.length > 0) {
|
||||
return res.json(threads);
|
||||
}
|
||||
} catch (dbError) {
|
||||
console.log('MongoDB unavailable, using mock data');
|
||||
}
|
||||
});
|
||||
|
||||
// Fallback на mock данные
|
||||
res.json(mockThreads);
|
||||
// Преобразование в массив и сортировка по времени
|
||||
const threadsArray = Object.values(threads)
|
||||
.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp));
|
||||
|
||||
console.log('[Messages] Returned', threadsArray.length, 'threads for company', companyId);
|
||||
|
||||
res.json(threadsArray);
|
||||
} catch (error) {
|
||||
console.error('[Messages] Error:', error.message);
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// Получить сообщения потока
|
||||
router.get('/threads/:threadId', verifyToken, async (req, res) => {
|
||||
// GET /messages/:threadId - получить сообщения потока
|
||||
router.get('/: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');
|
||||
const { threadId } = req.params;
|
||||
|
||||
if (messages && messages.length > 0) {
|
||||
return res.json(messages);
|
||||
}
|
||||
} catch (dbError) {
|
||||
console.log('MongoDB unavailable, using mock data');
|
||||
}
|
||||
const threadMessages = messages
|
||||
.filter(msg => msg.threadId === threadId)
|
||||
.sort((a, b) => new Date(a.timestamp) - new Date(b.timestamp));
|
||||
|
||||
console.log('[Messages] Returned', threadMessages.length, 'messages for thread', threadId);
|
||||
|
||||
// Fallback на mock данные
|
||||
const threadMessages = mockMessages[req.params.threadId] || [];
|
||||
res.json(threadMessages);
|
||||
} catch (error) {
|
||||
console.error('[Messages] Error:', error.message);
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// Отправить сообщение
|
||||
// POST /messages/:threadId - добавить сообщение в поток
|
||||
router.post('/:threadId', verifyToken, async (req, res) => {
|
||||
try {
|
||||
const { threadId } = req.params;
|
||||
const { text, senderCompanyId } = req.body;
|
||||
|
||||
if (!text || !threadId) {
|
||||
return res.status(400).json({ error: 'Text and threadId required' });
|
||||
}
|
||||
|
||||
// Определить получателя на основе threadId
|
||||
const threadParts = threadId.split('-');
|
||||
let recipientCompanyId = null;
|
||||
|
||||
if (threadParts.length >= 3) {
|
||||
const companyId1 = threadParts[1];
|
||||
const companyId2 = threadParts[2];
|
||||
const currentSender = senderCompanyId || req.user.companyId;
|
||||
recipientCompanyId = currentSender === companyId1 ? companyId2 : companyId1;
|
||||
}
|
||||
|
||||
const message = {
|
||||
_id: 'msg-' + Date.now(),
|
||||
threadId,
|
||||
senderCompanyId: senderCompanyId || req.user.companyId,
|
||||
recipientCompanyId,
|
||||
text: text.trim(),
|
||||
timestamp: new Date()
|
||||
};
|
||||
|
||||
messages.push(message);
|
||||
|
||||
console.log('[Messages] New message created:', message._id);
|
||||
|
||||
res.status(201).json(message);
|
||||
} catch (error) {
|
||||
console.error('[Messages] Error:', error.message);
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// POST /messages - создать сообщение (старый endpoint для совместимости)
|
||||
router.post('/', verifyToken, async (req, res) => {
|
||||
try {
|
||||
const { threadId, text, recipientCompanyId } = req.body;
|
||||
@@ -113,18 +102,24 @@ router.post('/', verifyToken, async (req, res) => {
|
||||
return res.status(400).json({ error: 'Text and threadId required' });
|
||||
}
|
||||
|
||||
const message = await Message.create({
|
||||
const message = {
|
||||
_id: 'msg-' + Date.now(),
|
||||
threadId,
|
||||
senderCompanyId: req.user.companyId,
|
||||
recipientCompanyId,
|
||||
text,
|
||||
text: text.trim(),
|
||||
timestamp: new Date()
|
||||
});
|
||||
};
|
||||
|
||||
messages.push(message);
|
||||
|
||||
console.log('[Messages] New message created:', message._id);
|
||||
|
||||
res.status(201).json(message);
|
||||
} catch (error) {
|
||||
console.error('[Messages] Error:', error.message);
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router
|
||||
module.exports = router;
|
||||
|
||||
Reference in New Issue
Block a user