Files
multy-stub/server/routers/procurement/routes/requests.js
2025-10-27 18:58:38 +03:00

172 lines
5.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;