Files
multy-stub/server/routers/procurement/routes/home.js

138 lines
4.3 KiB
JavaScript

const express = require('express');
const router = express.Router();
const { verifyToken } = require('../middleware/auth');
const BuyProduct = require('../models/BuyProduct');
const Request = require('../models/Request');
// Получить агрегированные данные для главной страницы
router.get('/aggregates', verifyToken, async (req, res) => {
try {
const userId = req.userId;
const User = require('../models/User');
const user = await User.findById(userId);
if (!user || !user.companyId) {
return res.json({
docsCount: 0,
acceptsCount: 0,
requestsCount: 0
});
}
const companyId = user.companyId.toString();
// Получить все BuyProduct для подсчета файлов и акцептов
const buyProducts = await BuyProduct.find({ companyId });
// Подсчет документов - сумма всех файлов во всех BuyProduct
const docsCount = buyProducts.reduce((total, product) => {
return total + (product.files ? product.files.length : 0);
}, 0);
// Подсчет акцептов - сумма всех acceptedBy во всех BuyProduct
const acceptsCount = buyProducts.reduce((total, product) => {
return total + (product.acceptedBy ? product.acceptedBy.length : 0);
}, 0);
// Подсчет исходящих запросов (только отправленные этой компанией)
const requestsCount = await Request.countDocuments({
senderCompanyId: companyId
});
res.json({
docsCount,
acceptsCount,
requestsCount
});
} catch (error) {
console.error('Error getting aggregates:', error);
res.status(500).json({ error: error.message });
}
});
// Получить статистику компании
router.get('/stats', verifyToken, async (req, res) => {
try {
const userId = req.userId;
const User = require('../models/User');
const Company = require('../models/Company');
const user = await User.findById(userId);
if (!user || !user.companyId) {
return res.json({
profileViews: 0,
profileViewsChange: 0,
sentRequests: 0,
sentRequestsChange: 0,
receivedRequests: 0,
receivedRequestsChange: 0,
newMessages: 0,
rating: 0
});
}
const companyId = user.companyId.toString();
const company = await Company.findById(user.companyId);
const sentRequests = await Request.countDocuments({ senderCompanyId: companyId });
const receivedRequests = await Request.countDocuments({ recipientCompanyId: companyId });
res.json({
profileViews: company?.metrics?.profileViews || 0,
profileViewsChange: 0,
sentRequests,
sentRequestsChange: 0,
receivedRequests,
receivedRequestsChange: 0,
newMessages: 0,
rating: company?.rating || 0
});
} catch (error) {
console.error('Error getting stats:', error);
res.status(500).json({ error: error.message });
}
});
// Получить рекомендации партнеров (AI)
router.get('/recommendations', verifyToken, async (req, res) => {
try {
const userId = req.userId;
const User = require('../models/User');
const Company = require('../models/Company');
const user = await User.findById(userId);
if (!user || !user.companyId) {
return res.json({
recommendations: [],
message: 'No recommendations available'
});
}
// Получить компании кроме текущей
const companies = await Company.find({
_id: { $ne: user.companyId }
})
.sort({ rating: -1 })
.limit(5);
const recommendations = companies.map(company => ({
id: company._id.toString(),
name: company.fullName || company.shortName,
industry: company.industry,
logo: company.logo,
matchScore: company.rating ? Math.min(100, Math.round(company.rating * 20)) : 50,
reason: 'Matches your industry'
}));
res.json({
recommendations,
message: recommendations.length > 0 ? 'Recommendations available' : 'No recommendations available'
});
} catch (error) {
console.error('Error getting recommendations:', error);
res.status(500).json({ error: error.message });
}
});
module.exports = router;