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

100 lines
3.0 KiB
JavaScript

const express = require('express')
const router = express.Router()
const { verifyToken } = require('../middleware/auth')
const mockCompaniesData = require('../mocks/companies.json')
const mockCompanies = mockCompaniesData.mockCompanies
// Маппинг отраслей для фильтрации
const industryMapping = {
'it': 'IT',
'finance': 'Финансы',
'manufacturing': 'Производство',
'construction': 'Строительство',
'retail': 'Торговля',
'wholesale': 'Торговля',
'logistics': 'Логистика',
'healthcare': 'Медицина'
};
// GET /search/companies - Поиск компаний
router.get('/companies', verifyToken, (req, res) => {
try {
const {
query = '',
industries = '',
companySizes = '',
geographies = '',
minRating = 0,
hasReviews,
hasAccepts
} = req.query;
let result = [...mockCompanies];
// Фильтр по текстовому запросу
if (query.trim()) {
const q = query.toLowerCase();
result = result.filter(c =>
c.fullName.toLowerCase().includes(q) ||
c.shortName.toLowerCase().includes(q) ||
c.slogan.toLowerCase().includes(q) ||
c.industry.toLowerCase().includes(q)
);
}
// Фильтр по отраслям
if (industries) {
const selectedIndustries = industries.split(',');
result = result.filter(c => {
const mappedIndustries = selectedIndustries.map(i => industryMapping[i] || i);
return mappedIndustries.some(ind =>
c.industry.toLowerCase().includes(ind.toLowerCase())
);
});
}
// Фильтр по размеру компании
if (companySizes) {
const sizes = companySizes.split(',');
result = result.filter(c => {
if (!c.companySize) return false;
return sizes.some(size => {
if (size === '1-10') return c.companySize === '1-10';
if (size === '11-50') return c.companySize === '10-50';
if (size === '51-250') return c.companySize.includes('50') || c.companySize.includes('100') || c.companySize.includes('250');
if (size === '251-500') return c.companySize.includes('250') || c.companySize.includes('500');
if (size === '500+') return c.companySize === '500+';
return false;
});
});
}
// Фильтр по рейтингу
const rating = parseFloat(minRating);
if (rating > 0) {
result = result.filter(c => c.rating >= rating);
}
// Фильтр по наличию отзывов
if (hasReviews === 'true') {
result = result.filter(c => c.verified === true);
}
// Фильтр по акцептам документов
if (hasAccepts === 'true') {
result = result.filter(c => c.verified === true);
}
res.json({
companies: result,
total: result.length
});
} catch (error) {
console.error('Search error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
module.exports = router