172 lines
5.0 KiB
JavaScript
172 lines
5.0 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const { verifyToken } = require('../middleware/auth');
|
|
const Request = require('../models/Request');
|
|
|
|
// Функция для логирования с проверкой DEV переменной
|
|
const log = (message, data = '') => {
|
|
if (process.env.DEV === 'true') {
|
|
if (data) {
|
|
console.log(message, data);
|
|
} else {
|
|
console.log(message);
|
|
}
|
|
}
|
|
};
|
|
|
|
// GET /requests/sent - получить отправленные запросы
|
|
router.get('/sent', verifyToken, async (req, res) => {
|
|
try {
|
|
const companyId = req.user.companyId;
|
|
|
|
const requests = await Request.find({ senderCompanyId: companyId })
|
|
.sort({ createdAt: -1 })
|
|
.exec();
|
|
|
|
log('[Requests] Returned', requests.length, 'sent requests for company', companyId);
|
|
|
|
res.json(requests);
|
|
} catch (error) {
|
|
console.error('[Requests] Error fetching sent requests:', error.message);
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
// GET /requests/received - получить полученные запросы
|
|
router.get('/received', verifyToken, async (req, res) => {
|
|
try {
|
|
const companyId = req.user.companyId;
|
|
|
|
const requests = await Request.find({ recipientCompanyId: companyId })
|
|
.sort({ createdAt: -1 })
|
|
.exec();
|
|
|
|
log('[Requests] Returned', requests.length, 'received requests for company', companyId);
|
|
|
|
res.json(requests);
|
|
} catch (error) {
|
|
console.error('[Requests] Error fetching received requests:', error.message);
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
// POST /requests - создать запрос
|
|
router.post('/', verifyToken, async (req, res) => {
|
|
try {
|
|
const { text, recipientCompanyIds, productId, files } = req.body;
|
|
const senderCompanyId = req.user.companyId;
|
|
|
|
if (!text || !recipientCompanyIds || !Array.isArray(recipientCompanyIds) || recipientCompanyIds.length === 0) {
|
|
return res.status(400).json({ error: 'text and recipientCompanyIds array required' });
|
|
}
|
|
|
|
// Отправить запрос каждой компании
|
|
const results = [];
|
|
for (const recipientCompanyId of recipientCompanyIds) {
|
|
try {
|
|
const request = new Request({
|
|
senderCompanyId,
|
|
recipientCompanyId,
|
|
text,
|
|
productId,
|
|
files: files || [],
|
|
status: 'pending'
|
|
});
|
|
|
|
await request.save();
|
|
results.push({
|
|
companyId: recipientCompanyId,
|
|
success: true,
|
|
message: 'Request sent successfully'
|
|
});
|
|
|
|
log('[Requests] Request sent to company:', recipientCompanyId);
|
|
} catch (err) {
|
|
results.push({
|
|
companyId: recipientCompanyId,
|
|
success: false,
|
|
message: err.message
|
|
});
|
|
}
|
|
}
|
|
|
|
// Сохранить отчет
|
|
const report = {
|
|
text,
|
|
result: results,
|
|
createdAt: new Date()
|
|
};
|
|
|
|
res.status(201).json({
|
|
id: 'bulk-' + Date.now(),
|
|
...report,
|
|
files: files || []
|
|
});
|
|
} catch (error) {
|
|
console.error('[Requests] Error creating request:', error.message);
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
// PUT /requests/:id - ответить на запрос
|
|
router.put('/:id', verifyToken, async (req, res) => {
|
|
try {
|
|
const { id } = req.params;
|
|
const { response, status } = req.body;
|
|
|
|
const request = await Request.findById(id);
|
|
|
|
if (!request) {
|
|
return res.status(404).json({ error: 'Request not found' });
|
|
}
|
|
|
|
// Только получатель может ответить на запрос
|
|
if (request.recipientCompanyId !== req.user.companyId) {
|
|
return res.status(403).json({ error: 'Not authorized' });
|
|
}
|
|
|
|
request.response = response;
|
|
request.status = status || 'accepted';
|
|
request.respondedAt = new Date();
|
|
request.updatedAt = new Date();
|
|
|
|
await request.save();
|
|
|
|
log('[Requests] Request responded:', id);
|
|
|
|
res.json(request);
|
|
} catch (error) {
|
|
console.error('[Requests] Error responding to request:', error.message);
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
// DELETE /requests/:id - удалить запрос
|
|
router.delete('/:id', verifyToken, async (req, res) => {
|
|
try {
|
|
const { id } = req.params;
|
|
|
|
const request = await Request.findById(id);
|
|
|
|
if (!request) {
|
|
return res.status(404).json({ error: 'Request not found' });
|
|
}
|
|
|
|
// Может удалить отправитель или получатель
|
|
if (request.senderCompanyId !== req.user.companyId && request.recipientCompanyId !== req.user.companyId) {
|
|
return res.status(403).json({ error: 'Not authorized' });
|
|
}
|
|
|
|
await Request.findByIdAndDelete(id);
|
|
|
|
log('[Requests] Request deleted:', id);
|
|
|
|
res.json({ message: 'Request deleted successfully' });
|
|
} catch (error) {
|
|
console.error('[Requests] Error deleting request:', error.message);
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|