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;
|