126 lines
3.8 KiB
JavaScript
126 lines
3.8 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const { verifyToken } = require('../middleware/auth');
|
|
|
|
// In-memory storage
|
|
let messages = [];
|
|
|
|
// GET /messages/threads - получить все потоки для компании
|
|
router.get('/threads', verifyToken, async (req, res) => {
|
|
try {
|
|
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;
|
|
}
|
|
}
|
|
});
|
|
|
|
// Преобразование в массив и сортировка по времени
|
|
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 });
|
|
}
|
|
});
|
|
|
|
// GET /messages/:threadId - получить сообщения потока
|
|
router.get('/:threadId', verifyToken, async (req, res) => {
|
|
try {
|
|
const { threadId } = req.params;
|
|
|
|
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);
|
|
|
|
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;
|
|
|
|
if (!text || !threadId) {
|
|
return res.status(400).json({ error: 'Text and threadId required' });
|
|
}
|
|
|
|
const message = {
|
|
_id: 'msg-' + Date.now(),
|
|
threadId,
|
|
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 });
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|